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
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.
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!
> 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.
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?
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?
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!
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!
Wenn du den Inhalt von PORTV verschicken willst, dann hast du einen Integer Wert.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.