Hallo, ich habe eine Frage. Wie ist das ofizielle Ende eines RS232 Strings. Ich schicke von einem ATMEL meine strings immer so: void uart0_putc(char c) { while(!(UCSRA & (1<<UDRE))); UDR=c; } void uart0_puts(char *s) { while (*s) { uart0_putc(*s); s++; } uart0_putc('\r'); uart0_putc('\n'); } Nur wenn ich das so mache und ich ein Windows Programm schreibe Erkennt Windows in meinem selbst geschriebenem Programm das Ende des Strings nicht. Aber nur in dem selbst geschriebenen Programm. Beim HyperTerminal funktioniert es einwandfrei. Sollte man nach einer RS232 Übertragung noch das '\0' Zeichen senden? Also folgendermaßen: void uart0_puts(char *s) { while (*s) { uart0_putc(*s); s++; } uart0_putc('\r'); uart0_putc('\n'); uart0_putc('\0'); } Weiß jemand eine Antwort?
Ein UART kennt keine Strings, ein UART kennt ausser byte gar nichts. RS232 kennt auch keine Strings Was Du suchst ist ein Moeglichkeit, dem Empfaenger das Ende eines Datentypen klar zu machen. Moeglicherweise ist es eine Null, moeglicherweise was anderes. Was macht ser Empfaegner denn ?
Richtig. Der Empfänger ein PC mit einem Windows Programm macht folgendes: ReadFile (hCom, &InString, sizeof (InString), &dwRead,NULL); Damit empfange ich eine String nach in InString. Nur weiß ich nicht wie groß die Anzahl der Empfangene Bytes gewesen sind. Gut ich weiß es schon da ich mir selber bytes schicke. Aber der Datenstrom kann unterschiedlich sein? Wie kann man das herausfinden.
Das hängt einfach nur davon ab, wie du deine Applikation programmierst. Also was sie erwartet. Bei einem String gibts das mehrere Möglichkeiten Anfang, Ende, Länge zu kennzeichnen: 1. Ende mit <CR> oder <CR><LF> 2. Nullterminiert mit <NULL> 3. Verpackt in <STX>MeinString<ETX> 4. Ganz eigenes Protokoll, welches den Datentypen oder die Datenlänge vorneweg schickt. 5. und und und
Vergiß meine Antwort, da hattest du das mit ReadFile noch nicht geschrieben...
Die industrielle Loesung ist immer ein definiertes Datenpacket zu verwenden. Dies hat in der Regel die Laenge im Header. Zb : http://www.ibrtses.com/embedded/shortmsgprotocol.html Wenn man die Laenge des Packetes hat muss man nur noch zaehlen. Eine fuer Dich meoglicherweise brauchbare alernative waere die Stringlaenge vorneweg zu senden.
@rene Muss ich mal ausprobiren. Ich denke ich werde das auch so machen
Alternativ kannst du das Ende des Strings auch mit einem bestimmten Zeichen, z.B. \0 oder sowas markieren. Erfordert dann aber auch zeichenweises auslesen mittels ReadFile().
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.