Forum: PC-Programmierung Zeichen in C von µC per RS232 empfangen und eof


von Manuel B. (baeri3)


Lesenswert?

Hallo Zusammen,

ich habe ein kleines Programm geschrieben, welches mir den Zustand des 
PORTB meines Mega8 per UART an den PC sendet. Dies kann ich auch in 
meinem C-Programm empfangen.

Der Code auf dem Mega8 ist sehr trivial :

...
if(temp=='G')    // zustand lesen
    {
      while(!(USR & (1 << UDRE)));
      UDR=PORTB;
      UDR=0x0D;    // CR
      UDR=0x0A;    // LF

    }
...

Auf dem PC empfange ich einfach mit "read(..)". Dieser bricht aber bei 
der Bitkombination für EOF ab und tut dann so, wie wenn nichts empfangen 
wurde.
Auf dem PC verwende ich C/C++ unter Debian 3.1 (gcc-Compiler).
Gibt es eine Möglichkeit, dem READ zu sagen, er soll den EOF ignorieren?

big thx

von Karl H. (kbuchegg)


Lesenswert?

      while(!(USR & (1 << UDRE)));
      UDR=PORTB;
      UDR=0x0D;    // CR
      UDR=0x0A;    // LF

Du musst schon vor dem Versenden eines Zeichens
jedesmal darauf warten, dass der UART wieder bereit
zur Aufnahme eines Zeichens ist.

von Manuel B. (baeri3)


Lesenswert?

Du meinst µC seitig? Ja, klar, sry, unschön so...
Aber erstmal egal, das Problem liegt ja derzeit daran, dass ich beim 
versenden vom "PortB" die ASCII-Kombination von EOF auftreten kann und 
somit mein READ auf der PC Seite abbricht!

von Karl H. (kbuchegg)


Lesenswert?

> die ASCII-Kombination von EOF auftreten kann und
> somit mein READ auf der PC Seite abbricht!

Wenn du mit read einliest, heist das, das du
einen stream mit open oder fopen aufgemacht hast.
Hast du dort 'binary' angegeben?

Dein Symptom klingt nach Text-Mode. Dann sind die
Translations eingeschaltet. Du wirst auch CR und LF
nicht vernünftig rüber bringen.

Binary beim open heist: Halt dich aus allem raus.
Ich will jedes Byte so wie es auf dem File steht oder
von der Schnittstelle kommt.


von Manuel B. (baeri3)


Lesenswert?

Hallo Karlheinz,

ja, genau, ich mache die Schnittstelle per OPEN auf und lesen dann mit 
Read.
Das ganze schaut derzeit so aus:

    unsigned char buf[1];
    unsigned char wert;

    port = open("/dev/tts/1", O_RDWR);
    read(port, buf, sizeof(buf));
    wert = buf[0];
    printf("lesen von RS232 beendet -> %d ...\n", wert);
    close(port);

Also um in den Binary Mode zu kommen, müsste ich das ganze warscheinlich 
mit einem IFSTREAM/OFSTREAM machen? Gibt es auch eine möglichkeit, dem 
"normalen" open mitzuteilen, dass er BINARY lesen soll? Kann ich dann 
die Werte wie oben ganz normal in eine Variable einlesen?

von Rolf Magnus (Gast)


Lesenswert?

Unter Linux gibt's eigentlich keine Unterscheidung zwischen binary und 
text. Allerdings muß man beim Öffnen der Schnittstelle anderes beachten. 
Versuch mal:

port = open("/dev/tts/1", O_RDWR | O_NOCTTY);

Sonst geht er davon aus, daß an dem Port ein serielles Terminal hängt.

Wo stellst du eigentlich die Parameter ein?

von Manuel B. (baeri3)


Lesenswert?

Mit Paramter meinst du wohl die Baudrate usw... ? Das mache ich 
außerhalb des Programms mit "setserial" an der Konsole. Aber die 
Kommunikation mit dem Mega8 funktioniert soweit ja auch.
Leider hat O_NOCTTY auch nicht zum geschwünschten Erfolg geführt. Bei 
EOF wird immer noch der read abgebrochen.

-- edit --
Oder sollte ich evt. hergehen und das gesendete Zeichen bereits im Mega8 
umzuformatieren, so dass garkein EOF mehr entsteht? Evt. den wert als 
Integer senden? Also bei Bitkombination  0000 0001  nicht das 
Ascii-Zeichen von 1 Versenden, sondern Interger 1 ? Leider weiß ich aber 
nicht, wie ich dies auf der µC seite und auf der PC seite dann wieder 
umwandel kann!

von Ulrich (Gast)


Lesenswert?

das gesuchte nennt sich itoa()

von Manuel B. (baeri3)


Lesenswert?

Du meinst auf der µC Seite? Und dann auf der PC-Seite wieder atoi() ? 
Ich habe ja aber auf der µC Seite Kein Integer wert!

von Karl H. (kbuchegg)


Lesenswert?

Wenn du den Inhalt von PORTV verschicken willst,
dann hast du einen Integer Wert.

von Manuel B. (baeri3)


Lesenswert?

Okay, hört sich gut an. Und wie verfahre ich dann auf der PC Seite? Soll 
ich dort direkt einen Integer wert empfangen? Geht das?

von Karl H. (kbuchegg)


Lesenswert?

Du schickst keine Integer mehr durch die Gegend.
Du schickst ganz normale Texte. Diese Texte sehen
halt zufällig so aus "234" "63" "0"

Auf PC Seite musst du aus den Texten dann wieder
Zahlen machen mit denen du weiter rechnen kannst.

atoi oder scanf oder (sagtest du nicht mal was von C++)
die stream Funktionen eignen sich hervorragend dazu.

Die Umstellung auf Text hat auch noch einen 2.ten "Vorteil":
Zum Testen hängst du ein Terminal (oder einen PC mit
einem Terminal-Programm) an die µC-Schnittstelle und
kannst ijm Klartext mitlesen, was vom µC gesendet wird.

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.