Forum: Mikrocontroller und Digitale Elektronik Konstanter String - zu lang!?


von Sproinx (Gast)


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.

von W.A. (Gast)


Lesenswert?

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

Kannst du das "einige" ein bisschen genauer eingrenzen?

von MaWin. (Gast)


Lesenswert?

Bitte den kompletten Code posten.

von Carsten W. (eagle38106)


Lesenswert?

Was sagt denn sizeof() im ersten Fall?
Kann man das Array händisch mit byte MyArray[3456] fix auf die richtige 
Größe definieren?

von Sproinx (Gast)


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};

von W.A. (Gast)


Lesenswert?

Sproinx schrieb:
> Allerdings scheint das Array abgeschnitten zu sein.

Was sagt der vom Compiler erzeugte List-File zu dem Thema?

von Michael U. (amiga)


Lesenswert?

Hallo,

auch ein ESP8266 hat nicht endlos Ram. Leg die Daten in den Flash.
1
const char R_FAVICON_ICO_0 [] PROGMEM = {0x00,...

müßte passen.

Du wirst die auch nicht im Stück übergeben und senden können, es werden 
auch Buffer im Ram beim Versenden gebraucht...

Gruß aus Berlin
Michael

von W.A. (Gast)


Lesenswert?

Sproinx schrieb:
> Hier ein Beispiel (ein Icon):
> ...

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.

von Sproinx (Gast)


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 ;-)

von Carl D. (jcw2)


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?

von Sproinx (Gast)


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();

von Carsten W. (eagle38106)


Lesenswert?

Ok, Quizfrage: Wie bekommt die Funktion client.write() mit, wieviele 
Bytes sie schreiben soll?

von Sascha W. (sascha-w)


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

von Peter II (Gast)


Lesenswert?

Sascha W. schrieb:
> Mit dem Teil hab ich mich noch nicht beschäftigt,

aber das ist wichtig, dann vermutlich senden sie einen String und dann 
ist bei \0 schluss - anders kann es gar nicht sein.

von Sascha W. (sascha-w)


Lesenswert?

Peter II schrieb:
> Sascha W. schrieb:
>> Mit dem Teil hab ich mich noch nicht beschäftigt,
>
> aber das ist wichtig, dann vermutlich senden sie einen String und dann
> ist bei \0 schluss - anders kann es gar nicht sein.
vorm schreiben wenigstens mach schauen wer der TO ist - Ich will hier 
gar nix senden!

Sascha

von pcrom (Gast)


Lesenswert?

Zwei sachen womit du sowieso rechnen musz :
* Chr(0) verwending in einen string (wie schon genennt durch W.A.)
* Endianness (wenn du nicht weisz was damit gemeint ist, bestudiere es!)

von W.A. (Gast)


Lesenswert?

Sproinx schrieb:
> An den Null-Terminitaoren stört sich das Programm definitiv
> nicht.
> Die daten werden per HTTP gesendet (eine Webseite, ein Icon usw.).

Hast du beim Aufruf mal die Länge mit übergeben?
1
client.write(MyString,sizeof(MyString))

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.