www.mikrocontroller.net

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


Autor: Ilja (Gast)
Datum:

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

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

Autor: Ilja (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Christian (Gast)
Datum:

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

Autor: mork (Gast)
Datum:

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

Autor: Stefan Ernst (sternst)
Datum:

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

Autor: Ilja (Gast)
Datum:

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

Autor: Ilja (Gast)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Nico K. (brainhunter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich habe das folgendermaßen gelöst:

head -n1 < /dev/tyyS0

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.