Sendebuffer erstellen

Hallo,
ich würde mich über etwas Hilfe freuen - meine magelhaften Programmierkenntnisse zu kompensieren.

Mein Arduino (MEGA1260)) läuft mit seinem Ethernet-Shield super. Er überträgt Daten über TCP an einen Server.
Leider kommt es - vermutlich bei plötzlichen Auftreten von mehreren Events zu "Problemen" - bis zum Stehenbleiben des Arduino. Manchmal tritt der Effekt erst nach Tagen ein.

Ich würde jetzt gern einen Sendebuffer bauen - weiß aber nicht wie.

Gesendet werden soll ein String (char-Array) mit 20Zeichen. Ich möchte nun die "entstehenden" Strings in einen Buffer schreiben und nacheinandner senden. Ich glaube (?) zeitlich parallel auftretende client.stop() versurachen meine derzeitigen Probleme.

Kann mir jemand helfen?

Ohne Details wohl kaum. Am besten postest Du mal den aktuellen Code, dann kann man sicher schauen wo man was verbessern kann.
Mario.

herbert-f:
Ich würde jetzt gern einen Sendebuffer bauen - weiß aber nicht wie.

Gesendet werden soll ein String (char-Array) mit 20Zeichen.

Ein C-String /char-Array für 20 Zeichen ist inklusive abschließendem Nullzeichen insgesamt 21 Zeichen groß.

Deklaration:
char mySendebuffer[21];

Fertig ist der Sendebuffer.

Die Funktionen, die Du für solche Art Strings verwenden kannst, findest Du in der AVR libc, und zwar die meisten in der
Strings-Bibliothek: avr-libc: <string.h>: Strings
sowie einige zur Umwandlung von Zahlenwerten in Strings (und zurück) in der
Standardbibliothek: http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html

Worin besteht das Problem?

Hallo,

vielleicht - fehlt mir wirklich noch etwas Verständnis. Ich rufe nachfolgenden VOID aus verschiedenen Stellen auf und übergebe immer einen outputstring. Ich denke, das client.stop eventuell Probleme macht ...???
void telnetRequest(char outputString[40]) {
// if there's a successful connection:
if (ips_client.connect(ips_server, 15001)) {
ips_client.print(outputString); //sendet String zum Server
ips_client.stop();
}
else {
// if you couldn't make a connection:
Serial.println("connection in telnetRequest failed");
Serial.println("disconnecting.");
ips_client.stop();
delay(500);
watchdog(minuten);
}

Ein mehrfaches client.stop() sollte kein Problem sein, zumal in der Funktion (die übrigens nicht VOID sondern telnetRequest heisst, void ist nur der Rückgabewert [ also keiner]) jedesmal eine neue Verbindung aufgebaut wird.
Ungeschickt ist aber, wenn vermutlich auch nicht die Fehlerquelle, ein telnetRequest(char outputString[40]), da hier jedes Mal 40 bytes auf den Stack geschoben werden (call by Value). Besser wäre es entweder nur einen Zeiger zu übergeben, oder eine Referenz.
Poste mal den gesamten Sketch, ich vermute ein RAM-Problem, auch wenn es ein Mega1280 ist, oder ist es ein Mega2560? Einen Mega1260 gibt es nämlich nicht.

VG,
Mario.

Vielen Dank - es ist ein 2560 - Sorry.

Kann ich mir irgendwo bzw. wie die Speicherbelegung ausgeben lassen?

Damit: Arduino Playground - AvailableMemory

herbert-f:
void telnetRequest(char outputString[40])

Was ist denn das für ein Programmier-Standard, aus welchem Handbuch stammt denn sowas?

Der String muss doch vorher schon deklariert sein, wenn er an die Funktion übergeben wird, wozu deklarierst Du da nochmal 40 Bytes RAM-Speicher auf dem Stack?

Die übliche Übergabekonvention für C-Strings / char-Arrays ist, dass ein Pointer auf das char-Array an die Funktion übergeben wird. Das sähe dann so aus:

void telnetRequest(char *outputString)

Außerdem ist das wohl etwas mit dem Ethernet-Shield, was Du da machst, dann sollte zwischen dem Senden des Strings und dem client.stop wohl dem Netzwerkchip ein kleines wenig Zeit gegeben werden, die Zeichen tatsächlich zu senden, bevor die Verbindung geschlossen wird. Ich würde es mal probieren mit:

ips_client.print(outputString); //sendet String zum Server
delay(5);
ips_client.stop();

Vielen Dank euch beiden,

werde nächsten Tage noch testen....