mikrocontroller.net

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


Autor: Manuel B. (baeri3)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Manuel B. (baeri3)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Manuel B. (baeri3)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Manuel B. (baeri3)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das gesuchte nennt sich itoa()

Autor: Manuel B. (baeri3)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du den Inhalt von PORTV verschicken willst,
dann hast du einen Integer Wert.

Autor: Manuel B. (baeri3)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.