Wpis z mikrobloga

Muszę wysłać duży plik za pomocą ESP8266 (ESP-12E).
Jednak problem stanowi prawdopodobnie użycie funkcji server.send, która ogranicza ilość wysyłanych danych, oraz ilość dostępnego ramu.

Idealnie chciałbym użyć systemu plików, ale za cholerę nie chce mi to działać więc na razie chciałbym problem szybko rozwiązać w inny sposób. Tylko pytanie - jaki?

Deklaruje stringa jako zmienną globalną, potem składam go z innym stringiem i wysyłam. Do tej pory to działało, ale teraz już stringi są za duże i się wszystko sypie. Myślałem nad użyciem PROGMEM, F() albo czegoś podobnego. Potem wysłać to za pomocą server.sendP albo server.sendContentP, ale jak to zrealizować w praktyce?
A może są lepsze sposoby?

#esp8266 #arduino #majsterkowanie #elektronika #programowanie #gumaapyta #pytanie
  • 13
@Gumaa:

Muszę wysłać duży plik


Do takich zastsowań najczęściej używa się starego, prostego protokołu xmodem ogólnie o xmodem - przystępna teoria (lub jego wariacji w rodzaju zmodem lub xmodem 1K) . Plik jest dzielony na ramki o stałej wielkości, a każda ramka musi być potwierdzona. Ramki są również numerowane, więc jakaś namiastka kontroli przepływu jest. Xmodem często jest stosowany do zaimplementowania bootloadera (zwykle to wystarcza), np xmodem dla esp8266 , bootloader
@nielubieselera: @Foksering: na razie wsadziłem po prostu oba stringi do jednej zmiennej zadeklarowanej jako:

static const char string[] PROGMEM = "blabla"
Wysyłam go za pomocą:

server.send_P(200, "text/html", string);
I działa ( ͡° ͜ʖ ͡°)

Tylko muszę jeszcze znaleźć sposób w jaki mógłbym nadal składać tego stringa z dwóch innych albo dokładać do niego jakieś zmienne w trakcie działania programu. Potrzebuję tego, bo pewne fragmenty tego stringa
@Gumaa: Stringi w C++ szybko zjedzą ci ram, zwłaszcza jak masz je globalnie i robisz dużo nowych (fragmentacja pamięci).
Najlepiej zrobić ramkę o stałym rozmiarze, z preambułą oraz sumą kontrolną i w tej ramce powiedzmy 12 bajtowej wysyłać po 8 bajtów i czekać na potwierdzenie odbioru (wysyłają sumę kontrolna liczysz dla preambuly i danych a odbierasz sumę kontrolna policzoną dla całej ramki czytaj o crc). W ten sposób niczego nie zgubisz.
@Analityk: ja to traktuję bardziej jako rozwiązanie tymczasowe bo docelowo chciałbym odpalić na tym system plików.

Ale takie tablice charów deklarowane PROGMEMem też tak zjadają RAM? Wydawało mi się, że skoro to teraz działa to już nie połyka tyle ramu co normalna zmienna.