Hallo,
ich habe in meinem Sketch folgenden Codeschnipsel:
uint8_t bufindex; //Buffer index, used to keep track of current buffer byte
uint8_t buf[255]; //Creates the buffer with a length equal to the max length
char html_zeilen_buf[255]; //Creates the buffer with a length equal to the max length
int16_t c;
bufindex = 0;
if (strstr(filename, ".htm") != 0) {
//HTML-Dateien muessen besonders behandelt werden...
while ((c = dataFile.read()) >= 0) {
html_zeilen_buf[bufindex++] = ((char)c);
if ((c == '\n') or (c == '\r') or (bufindex == 255)) {
//ZeilenEnde im array setzen
html_zeilen_buf[bufindex] = '\0';
//hier erfolgen noch Änderungen im html_zeilen_buf...
MyClient.write(html_zeilen_buf);
bufindex=0;
}
}
dataFile.close();
if(bufindex > 0) {
html_zeilen_buf[bufindex] = '\0';
MyClient.write(html_zeilen_buf);
}
} else {
//keine HTML-Datei, also einfach "Buffer fuer Buffer" senden...
while ((c = dataFile.read()) >= 0) {
buf[bufindex++] = ((char)c);
if (bufindex == 255) {
MyClient.write(buf, 255);
bufindex=0;
}
}
dataFile.close();
if(bufindex > 0) MyClient.write(buf, bufindex);
}
Der Code ist ein Teil von einem Webserver. Der obere Buffer "html_zeilen_buf" schreibt zeilenweise die HTML-Dateien von der SD-Karte zum Client. Der andere Buffer "buf" schreibt alles, was keine html-Dateien sind (also Bilder usw.) einfach bufferweise zum Client.
Funktioniert. Jetzt möchte ich aber gerne nur einen Buffer verwenden, um RAM zu sparen.
Wenn ich aber nun einfach den "buf" durch den "html_zeilen_buf" ersetze, werden die Bilddateien nicht mehr angezeigt.
Wer kann mir helfen, den "buf" durch den "html_zeilen_buf zu ersetzen?
Vielen Dank und ein frohes Fest an alle.
MfG paulinchen
//hier erfolgen noch Änderungen im html_zeilen_buf...
Damit ist gemeint, daß ich hier noch viele Ersetzungen in der aktuellen HTML-Zeile mache, um z. Bsp. Platzhalter mit aktuellen Werten zu ersetzen.
Daher brauche ich den Buffer "html_zeilen_buf" als Char-array.
Bei den anderen Dateien, welche ich nicht parsen muß, möchte ich halt auch diesen Buffer nutzen...
paulinchen:
Daher brauche ich den Buffer "html_zeilen_buf" als Char-array.
Du brauchst also zwei Datenpuffer, die aber nur einmal Speicherplatz belegen sollen, und einmal möchtest Du den Datenpuffer als Char-array und einmal als uint8_t-Array ansprechen können?
Dann wäre meine erste Idee, den zweiten Puffer als Pointer auf den ersten Puffer zu deklarieren, mit entsprechendem Datentyp.
Also statt:
uint8_t buf[255]; //Creates the buffer with a length equal to the max length
char html_zeilen_buf[255]; //Creates the buffer with a length equal to the max length
Setze:
char html_zeilen_buf[255]; //Creates the buffer with a length equal to the max length
uint8_t* buf = (uint8_t*) &html_zeilen_buf; // Creates pointer to html_zeilen_buf, re-use the buffer
Ich bin nicht so der Pointer-Jongleur (und kann das jetzt auch nicht so direkt testen), aber ich meine, dass Du dann den Rest des Codes so lassen könntest wie er ist. Kannst Du ja mal ausprobieren.
Das sollte klappen, ABER!!
Wie immer gibt es bei solchen Tricks einen Haken.
Beide Puffer dürfen IMMER nur nacheinander verwendet werden, nie gleichzeitig. Da beide den gleichen Speicherbereich verwenden würden sich sonst Teile des Codes die Daten gegenseitig überschreiben.
Warum muss buf[] eigentlich vom Typ uint_8 sein? Verwendet wird er doch als char-Puffer -> "buf[bufindex++] = ((char)c);".
Mario.