www.mikrocontroller.net

Forum: GCC Serielle Kommunikation mit ATMega8 beenden (gcc)

Autor: Ilja (Gast)
Datum: 02.07.2008 11:08

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:
val=1;
textrs232("Wert ist: %d",val);
textrs232("\r\n");
textrs232(0x00);

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

Hat jemand ne Idee?

Ilja
Autor: Frank L. (hermastersvoice)
Datum: 02.07.2008 11:15

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
Autor: Ilja (Gast)
Datum: 02.07.2008 11:19

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
Autor: Peter Dannegger (peda)
Datum: 02.07.2008 11:37

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
Autor: Christian (Gast)
Datum: 02.07.2008 11:41

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
Autor: mork (Gast)
Datum: 02.07.2008 11:45

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.
Autor: Stefan Ernst (sternst)
Datum: 02.07.2008 11:46

Sende nach dem Wert ein "\r" und verwende auf Linux-Seite sowas:
(read wert ; echo "Wert: $wert") </dev/ttyUSB0 
Autor: Ilja (Gast)
Datum: 02.07.2008 11:49

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
Autor: Ilja (Gast)
Datum: 02.07.2008 11:52

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
Autor: Stefan "stefb" B. (stefan) Benutzerseite
Datum: 02.07.2008 11:55

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
Autor: Nico K. (brainhunter)
Datum: 02.07.2008 12:37

also ich habe das folgendermaßen gelöst:

head -n1 < /dev/tyyS0

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos und Scans verwenden
  • Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net