Pages: [1]   Go Down
Author Topic: Sendebuffer erstellen  (Read 610 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Germany S-H
Offline Offline
Faraday Member
**
Karma: 163
Posts: 3198
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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: http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html
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?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank - es ist ein 2560 - Sorry.

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

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Damit: http://playground.arduino.cc/Code/AvailableMemory
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 163
Posts: 3198
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 19
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vielen Dank euch beiden,

werde nächsten Tage noch testen....

Logged

Pages: [1]   Go Up
Jump to: