Go Down

Topic: String über TCP bekommen (Read 1 time) previous topic - next topic

derplatzwart

Hallo Leute,

ich bin gestern abend fast verzweifelt. Ich habe ein Mega Board mit einem Ethernet shield. Auf dem habe ich einen Server laut Referenz programmiert. An einem Windows-Rechner habe ich einen Client (mit Autoit) geschrieben. Die Datenübertragung läuft auch super.
ABER:
Wenn ich vom Windows-Client ein "hallo" sende und mir das, was ich empfange über den serial.println() am SerialMonitor anzeigen lasse, dann bekomme ich nur die Zahlen, entsprechend dem ASCII Code.
Das Umwandeln habe ich auch hinbekommen mit char(variable), aber dann bekomme ich die einzelnen Buchstaben heraus, also h a l l o. Also dachte ich, ich reihe die Characters, die ich erhalte einfach zusammen. Aber dann kommt nur noch nen Rechteck heraus, das ich angezeigt bekomme, ähnlich wie sie in einem Word-Dokument angezeigt werden, wenn nicht das richtige kantonesische Sprachpaket installiert ist.

Ich möchte also am Client "hallo" senden und am Server "hallo herausbekommen. Wo ist mein Fehler? Ist char() gar keine Variable sondern nur ein Pointer?

Die Suche hab ich bemüht, gestern abend schon stundenlang, aber ich bin auf nichts gestoßen, dass mit helfen konnte.
Vielen Dank für eure Hilfe.





mkl0815

#1
Feb 27, 2013, 01:51 pm Last Edit: Feb 27, 2013, 03:09 pm by mkl0815 Reason: 1
Poste doch mal den Code von Client und Server. Hellsehen kann hier, außer Uwe, keiner und der ist Mittwochs immer rodeln  :smiley-mr-green:
Ich vermute mal, aber das ist NUR eine Vermutung ohne Code, das Du schon das richtige bekommst, aber vermutlich ein int oder byte aus dem TCP-Strom liest und das auch als Zahl im Serial Monitor ausgibst.
Am einfachsten definiert man sich einen Empfangspuffer (char buffer[50]; ) und zählt mittels einer Index-Variable den Index im Array hoch, während man die gelesenen Bytes gleich in den Puffer schreibt (buffer[index++] = client.read(); )
Dabei aufpassen, das man maximal 49 Zeichen liest, also sinnvolle Abbruchbedingung setzen und dann noch das letzte byte auf den Wert 0 (nicht fas Zeichen '0') setzen. (buffer[index]=0;)
Dann kannst Du mit dem C-String "buffer") weiterarbeiten. Z.B. Serial.println(buffer);
Mario.


derplatzwart

Ah OK, das klingt logisch. Leider bin ich auf Arbeit und kann gerade nicht den Quelltext posten, aber so ungefähr hab ich verstanden was du meinst.
Bin eben ein Absoluter Neuling in C. In Basic hätte ich den Fehler wohl gefunden.
Aber wenn ich später zu Hause bin, dann poste ich den Text mal, wahrscheinlich wird dann deutlich wo mein Fehler ist.

Aber vielen Dank trotzdem schonmal für den Hinweis. 8)

derplatzwart

So, ich poste mal das was ich geschrieben habe.
Code: [Select]
#include <Ethernet.h>
#include <SPI.h>

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x97, 0x0B };
byte ip[] = { 192, 168, 1, 241 };
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };

EthernetServer server = EthernetServer(23);

void setup(){
  Serial.begin(9600);
  // initialize the ethernet device
  Ethernet.begin(mac, ip, gateway, subnet);
  // start listening for clients
  server.begin();
}
void loop(){
  char type;
  int t = 1;
  // if an incoming client connects, there will be bytes available to read:
  EthernetClient client = server.available();
  if (client == true) {
    Serial.println("readstart");
    t = client.read();
    do{
      type = char(t);     
      Serial.println(type);
      t = client.read();
    }
    while (t != -1) ;
  }   
}


und das, was ich ausgeworfen bekomme.
Aber ich möchte doch gerne das "hallo" als "ein Wort" haben.

Unter Basic kann ich einfach Strings mit "&" zusammenfügen, geht das unter C mit char nicht? Oder was fehlt?

michael_x

Quote
Unter Basic kann ich einfach Strings mit "&" zusammenfügen, geht das unter C mit char nicht? Oder was fehlt?


In C geht das viel einfacher ...

Code: [Select]
static char text[80];
byte pos = 0;
while (client.available())
   text[pos++]= client.read();  // Text übertragen, pos wird hochgezählt
text[pos] = 0; // Endekennung, fertig ist der String

Serial.println(text);

und in deinem Fal noch einfacher:

Code: [Select]
if (client.available() ) {
  char t = client.read();
  Serial.write(t);
}

Go Up