Zeichen in C von µC per RS232 empfangen und eof

#492498
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
#492629
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.

#493071
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?
Gast #493187
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?
#493265
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!
#496913
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren