Konstanter String - zu lang!?

Gast #4775003
Lesenswert?

Hallo,
in meinem µC möchte ich einen konstanten String ablegen, denn ich dann 
bei Bedarf über's Netzwerk rausschicken kann.

Mein erster Versuch war Folgender (Pseudo-Code):
1
byte MyString = {... 0x65, 0x66, 0x67 ...}; // Einige tausend Bytes!

Das hat der Compiler ohne Murren geschluckt, und das Programm läuft auch 
wie erwartet. Allerdings scheint das Array abgeschnitten zu sein. Denn 
wenn ich die Daten raussende, fehlt am Ende einiges (wie viel genau habe 
ich noch nicht analysiert).

Mein zweiter Versuch: den String aufteilen:
1
byte MyString1 = {... 0x65, 0x66, 0x67 ...}; // Nur 1024 Bytes
2
byte MyString2 = {... 0x65, 0x66, 0x67 ...}; // Nur 1024 Bytes
3
byte MyString3 = {... 0x65, 0x66, 0x67 ...}; // Nur 1024 Bytes
4
byte MyString4 = {... 0x65, 0x66, 0x67 ...}; // Der Rest

Wenn ich nun diese Arrays nacheinander ausgebe, sehe ich tatsächlich wie 
gewünscht den kompletten Inhalt.

Allerdings ist die zweite Lösung etwas hässlich und benötigt mehr 
Wartungsaufwand. Kann mir jemand erklären, warum sich das so verhält? 
Und ob es vielleicht doch einen Trick gibt das schöner hinzubekommen?


PS:
Der µC ist ein NodeMCU mit ESP8266. Programmiert wird er mit PlatformIO 
in C++. Der Compiler ist GCC. Es werden einige Arduino Libraries 
verwendet.
Gast #4775015
Lesenswert?

W.A. schrieb:
> Kannst du das "einige" ein bisschen genauer eingrenzen?

Ich habe mit verschiedenen Größen herumexperimentiert, von daher: leider 
nein. Aber meist lagen die Längen zwischen 5k und 10k Bytes.

MaWin. schrieb:
> Bitte den kompletten Code posten.

Hier ein Beispiel (ein Icon):
1
// Generated from favicon.ico, size is 1150 bytes
2
const char R_FAVICON_ICO_0 [] = {0x00,0x00,0x01,0x00,0x01,0x00,0x10,0x10,0x00,0x00,0x01,0x00,0x20,0x00,0x68,0x04,0x00,0x00,0x16,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x6F,0x00,0x00,0x00,0x6F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x00,0x68,0x68,0x68,0x20,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xE0,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x68,0x68,0x68,0x20,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xE0,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x68,0x68,0x68,0x20,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x8F,0x8F,0x8F,0xFF,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xFF,0x84,0x84,0x84,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xE0,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x68,0x68,0x68,0x20,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x68,0x68,0x68,0xFF,0x68,0x68,0x68,0xFF,0x68,0x68,0x68,0xFF,0x68,0x68,0x68,0xFF,0x68,0x68,0x68,0xFF,0x68,0x68,0x68,0xFF,0x68,0x68,0x68,0xFF,0x68,0x68,0x68,0xFF,0x67,0x67,0x67,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xE0,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x68,0x68,0x68,0x20,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x70,0x70,0x70,0xFF,0x72,0x72,0x72,0xFF,0x72,0x72,0x72,0xFF,0x72,0x72,0x72,0xFF,0x72,0x72,0x72,0xFF,0x72,0x72,0x72,0xFF,0x72,0x72,0x72,0xFF,0x72,0x72,0x72,0xFF,0x6D,0x6D,0x6D,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xE0,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x68,0x68,0x68,0x20,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x87,0x87,0x87,0xFF,0x8A,0x8A,0x8A,0xFF,0x8A,0x8A,0x8A,0xFF,0x8A,0x8A,0x8A,0xFF,0x8A,0x8A,0x8A,0xFF,0x8A,0x8A,0x8A,0xFF,0x8A,0x8A,0x8A,0xFF,0x8A,0x8A,0x8A,0xFF,0x7E,0x7E,0x7E,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xE0,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x68,0x68,0x68,0x20,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xFF,0x66,0x66,0x66,0xE0,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xA1,0xA1,0xA1,0x2E,0x79,0x79,0x79,0xF0,0x70,0x70,0x70,0xF3,0x70,0x70,0x70,0xF3,0x71,0x71,0x71,0xF3,0x79,0x79,0x79,0xF0,0x79,0x79,0x79,0xF0,0x78,0x78,0x78,0xF0,0x70,0x70,0x70,0xF3,0x70,0x70,0x70,0xF3,0x73,0x73,0x73,0xF2,0x79,0x79,0x79,0xF0,0x79,0x79,0x79,0xF0,0x82,0x82,0x82,0xE2,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xEF,0xEF,0xEF,0x20,0xF2,0xF2,0xF2,0xFF,0xB4,0xB4,0xB4,0xFF,0x4E,0x4E,0x4E,0xFF,0x4D,0x4D,0x4D,0xFF,0x9B,0x9B,0x9B,0xFF,0xF2,0xF2,0xF2,0xFF,0xF2,0xF2,0xF2,0xFF,0x95,0x95,0x95,0xFF,0x4D,0x4D,0x4D,0xFF,0x50,0x50,0x50,0xFF,0xBA,0xBA,0xBA,0xFF,0xF2,0xF2,0xF2,0xFF,0xF2,0xF2,0xF2,0xE0,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x82,0x82,0x82,0x6C,0xDB,0xDB,0xDB,0xFF,0xF2,0xF2,0xF2,0xFF,0xB6,0xB6,0xB6,0xFF,0x4F,0x4F,0x4F,0xFF,0x4D,0x4D,0x4D,0xFF,0x9B,0x9B,0x9B,0xFF,0xF2,0xF2,0xF2,0xFF,0xF2,0xF2,0xF2,0xFF,0x95,0x95,0x95,0xFF,0x4D,0x4D,0x4D,0xFF,0x4F,0x4F,0x4F,0xFF,0xB8,0xB8,0xB8,0xFF,0xF2,0xF2,0xF2,0xE0,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x90,0x90,0x90,0x8A,0xD1,0xD1,0xD1,0xD3,0xF3,0xF3,0xF3,0x7B,0xF4,0xF4,0xF4,0x2E,0xB6,0xB6,0xB6,0x0E,0x9F,0x9F,0x9F,0x10,0x9F,0x9F,0x9F,0x10,0xFF,0xFF,0xFF,0x08,0xFF,0xFF,0xFF,0x08,0xFF,0xFF,0xFF,0x08,0x9F,0x9F,0x9F,0x10,0x9F,0x9F,0x9F,0x10,0xB6,0xB6,0xB6,0x0E,0xFF,0xFF,0xFF,0x07,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xF1,0xF1,0xF1,0x94,0xF2,0xF2,0xF2,0xFF,0xCC,0xCC,0xCC,0xFF,0x75,0x75,0x75,0xFF,0x64,0x64,0x64,0xF9,0x83,0x83,0x83,0xC7,0xA4,0xA4,0xA4,0x5A,0xFF,0xFF,0xFF,0x02,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xF1,0xF1,0xF1,0x36,0xAA,0xAA,0xAA,0xAF,0x5F,0x5F,0x5F,0xFB,0x4D,0x4D,0x4D,0xFF,0x56,0x56,0x56,0xFF,0xA2,0xA2,0xA2,0xFF,0xEA,0xEA,0xEA,0xFF,0xF2,0xF2,0xF2,0xE8,0xF2,0xF2,0xF2,0x9B,0xA4,0xA4,0xA4,0x70,0x96,0x96,0x96,0x11,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x97,0x97,0x97,0x51,0xDC,0xDC,0xDC,0x84,0xF2,0xF2,0xF2,0xCA,0xF2,0xF2,0xF2,0xFE,0xC6,0xC6,0xC6,0xFF,0x70,0x70,0x70,0xFF,0x4D,0x4D,0x4D,0xFF,0x53,0x53,0x53,0xFF,0x82,0x82,0x82,0xDD,0xE7,0xE7,0xE7,0x61,0xE8,0xE8,0xE8,0x0B,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xC6,0xC6,0xC6,0x24,0x8B,0x8B,0x8B,0xA7,0x70,0x70,0x70,0xEC,0x59,0x59,0x59,0xFF,0xA2,0xA2,0xA2,0xFF,0xEA,0xEA,0xEA,0xFF,0xF2,0xF2,0xF2,0xFE,0xF4,0xF4,0xF4,0x18,0xFF,0xFF,0xFF,0x00,0xFF,0x00};
3
const char R_FAVICON_ICO_1 [] = {0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0xED,0xED,0xED,0x0E,0xF3,0xF3,0xF3,0x57,0xF3,0xF3,0xF3,0xA6,0xF3,0xF3,0xF3,0xB8,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x01,0x00,0x00,0x80,0x7F,0x00,0x00,0x80,0x0F,0x00,0x00,0xF0,0x01,0x00,0x00,0xFE,0x01,0x00,0x00,0xFF,0xC3,0x00,0x00,0x00};
Gast #4775032
Lesenswert?

W.A. schrieb:
> Könnte es sein, dass in C bei der Stringverarbeitung - sofern man davon
> in C sprechen kann - das Zeichen 0x00 ein Stringende markiert.
>
> Was machst du mit dem Zeugs und woran stellst du genau fest, dass etwas
> fehlt.

Dann würde es ja auch nicht funktionieren, wenn ich die Byte Arrays 
aufsplitte. An den Null-Terminitaoren stört sich das Programm definitiv 
nicht.
Die daten werden per HTTP gesendet (eine Webseite, ein Icon usw.).

Michael U. schrieb:
> auch ein ESP8266 hat nicht endlos Ram. Leg die Daten in den Flash.

Dann ist mir aber nicht ganz klar, warum ein langes Datum nicht 
funktioniert, 10 Kleine aber schon. Entweder der RAM hat genug Platz 
oder eben nicht ;-)
#4775127
Lesenswert?

> bei Bedarf über's Netzwerk rausschicken kann.

Mit welchem Protokol?

Die Daten passen vermutlich nicht in ein "WLAN-Paket", d.h. Es müßte ein 
Protokol sein, das Daten über mehrere "Netzwerk-Pakete" verteilen kann, 
z.B. Tcp. Wieviel kommt denn pro send() genau an?
Gast #4775168
Lesenswert?

Carl D. schrieb:
> Mit welchem Protokol?

Wie oben erwähnt per HTTP (TCP).

Der Code zum Senden sieht in etwa so aus (mit 4 getrennten Byte-Arrays):
1
WiFiClient client;
2
// ...set up client...
3
client.write(R_INDEX_HTML_0);
4
client.write(R_INDEX_HTML_1);
5
client.write(R_INDEX_HTML_2);
6
client.write(R_INDEX_HTML_3);
7
client.flush();
#4775538
Lesenswert?

Sproinx schrieb:
> Carl D. schrieb:
>> Mit welchem Protokol?
>
> Wie oben erwähnt per HTTP (TCP).
>
> Der Code zum Senden sieht in etwa so aus (mit 4 getrennten Byte-Arrays):
>
1
> WiFiClient client;
2
> // ...set up client...
3
> client.write(R_INDEX_HTML_0);
4
> client.write(R_INDEX_HTML_1);
5
> client.write(R_INDEX_HTML_2);
6
> client.write(R_INDEX_HTML_3);
7
> client.flush();
8
>
Mit dem Teil hab ich mich noch nicht beschäftigt, aber die Frage wie 
arbeitet client.write() - asyncron? Oder wird die Funktion erst beendet 
wenn der Inhalt versand wurde oder zumindest im Puffer des 
Netzwerkstacks Platz gefunden hat.

Sascha

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren