Forum: Compiler & IDEs Serielle Kommunikation mit ATMega8 beenden (gcc)


von Ilja (Gast)


Lesenswert?

Hallo - ich kommuniziere mit meinem ATMega8 via USB/Seriell Konverter. 
Ich kann Zeichen ueber die serielle Schnittstelle lesen und schreiben. 
Allerdings moechte ich, dass der Atmel nach dem Senden eines Messwertes 
einfach "auflegt" - das gelingt mir nicht...

Idealerweise mache ich ein

cat /dev/ttyUSB0 (linux) und bekomme dann EINEN Wert.

Im Moment ist mein main() mit einer while-loop ausgestattet. Die immer 
wieder Werte abfragt. Ich habe auch schon versucht ein 0x00 bzw. ein 
0x04 zu senden. Aber das klappt auch nicht. Das Terminal bleibt einfach 
offen.

Hier ein Code-Schnipsel:
1
val=1;
2
textrs232("Wert ist: %d",val);
3
textrs232("\r\n");
4
textrs232(0x00);

geht leider nicht... Wie kann ich die rs232 connection "auflegen"?

Hat jemand ne Idee?

Ilja

von Frank L. (hermastersvoice)


Lesenswert?

hast du denn was zum auflegen? Was willst du denn eigentlich erreichen? 
Mag ja sein das DU weisst was du mit "auflegen" meinst aber das können 
doch Andere nicht wissen.

bye

Frank

von Ilja (Gast)


Lesenswert?

Also - ich moechte, dass ich den Atmel mit

cat /dev/ttyUSB0 abfrage, und dann ein einziger Wert ausgegeben wird.

Also:

# <-- Prompt
#
# cat /dev/ttyUSB0
Wert: 4
#
#

Gruesse
               Ilja

von Peter D. (peda)


Lesenswert?

Du meinst also, daß das Linux-Terminalprogramm per Remote gekillt wird?

Ob überhaupt und wie das geht, mußt Du in der Linux-Doku nachsehen (ich 
kann kein Linux) und dann den AVR eben den entsprechenden Befehl senden 
lassen.

Vielleicht gibts auch die Option, daß sich das Terminalprogramm nach 
Ablauf einer bestimmten Zeit selber killt.


Peter

von Christian (Gast)


Lesenswert?

Du kannst versuchen vom uC ein 0x04 zu senden.

Das müsste EOF (EndOfFile) sein, es kann sein, das cat sich bei diesem 
Zeichen beendet.

Christian

von mork (Gast)


Lesenswert?

Man kann nich einfach "auflegen". cat gibt die Zeichen solange aus, bis 
die Datei zu ende ist. /dev/ttyXX kann aber nie zu ende sein, deshalb 
wird cat auch nie sich selbst beenden. Was Du brauchst ist ein 
Terminal-Emulator, wie zb gtkterm oder minicom.

von Stefan E. (sternst)


Lesenswert?

Sende nach dem Wert ein "\r" und verwende auf Linux-Seite sowas:
1
(read wert ; echo "Wert: $wert") </dev/ttyUSB0

von Ilja (Gast)


Lesenswert?

Schluck - ich habe scheinbar deutliche Probleme mich verstaendlich 
auszudruecken... Mist. Ich versuch's nochmal:

Normalerweise kann man eine Schnittstelle unter Linux einfach mit dem 
Befehl 'cat' auslesen. Wenn ein Zeichen EOT (End of Transmission) bzw. 
ein EOF (End of File) gesendet wird, hoert die Ausgabe von cat einfach 
auf.

Dies habe ich versucht mit meinem Atmel auch zu realisieren. Das Problem 
welches auftaucht, ist scheinbar, dass ich kein EOT bzw. EOF senden 
kann. Meine Versuche diesbezueglich, naemlich das Uebertragen von 0x04, 
den Steuerzeichen fuer EOF bzw. EOT laufen nicht. Im Prinzip setze ich 
dafuer UDR (nach Check ob senden moeglich) auf 0x04. Leider beendet das 
Program 'cat' jedoch nicht, sondern wartet einfach auf weitere Zeichen 
von der Schnittstelle.

Wie schaffe ich es also, dass meine Verbindung, vom Atmel initiiert, 
beendet wird?

Gruesse

               Ilja

von Ilja (Gast)


Lesenswert?

Danke Stefan - Deine Loesung funktioniert. Allerdings habe ich noch 
immer nich genau verstanden, warum 'cat' beim Senden von EOF immer noch 
offen bleibt...

Danke

               Ilja

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ilja wrote:

> textrs232(0x00);

Hast du schon mal das ASCII Zeichen für End of transmission EOT statt 
der 0x00 verwendet? Bei Unix wäre das ^D (0x04).
http://www.geocities.com/dtmcbride/tech/charsets/ascii.html
EDIT: Hast du, sehe ich gerade.

Ob das funktioniert, hängt auch davon ab, wie du /dev/ttyUSB0 
konfiguriert hast. Wenn du die Schnittstelle im RAW Modus betreibst, 
also keine Filterung der Daten, kann es sein, dass ein EOT im Datenstrom 
nicht interpretiert wird.

Anschauen kannst du dir das mit dem Kommando

# stty -a < /dev/ttyUSB0

und dann nachsehen, was bei eof = ... eingetragen ist und die anderen 
Optionen checken, dass die nicht RAW bedeuten
http://www.linux-ag.de/linux/LHB/node106.html

von Nico K. (brainhunter)


Lesenswert?

also ich habe das folgendermaßen gelöst:

head -n1 < /dev/tyyS0

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.