Forum: Mikrocontroller und Digitale Elektronik Echtes ende eines UART Strings


von micro1 (Gast)


Lesenswert?

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?

von Wetterer (Gast)


Lesenswert?

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 
?

von Wetterer (Gast)


Lesenswert?

Hyperterm wird auf <CR><LF> einen Zeilenumbruch machen.

von micro1 (Gast)


Lesenswert?

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.

von ARM-Fan (Gast)


Lesenswert?

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

von ARM-Fan (Gast)


Lesenswert?

Vergiß meine Antwort, da hattest du das mit ReadFile noch nicht 
geschrieben...

von Benedikt K. (benedikt)


Lesenswert?

Einfach ein Timeout setzen, fertig.

von rene (Gast)


Lesenswert?

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.

von micro1 (Gast)


Lesenswert?

@rene
Muss ich mal ausprobiren. Ich denke ich werde das auch so machen

von Philipp B. (philipp_burch)


Lesenswert?

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
Noch kein Account? Hier anmelden.