PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : cat /dev/ttyS0



tholan
04.12.04, 22:47
Hallo,
vielleicht könnt Ihr mir helfen:
Ich habe eine MCU von Sensory mit Entwicklungsboard und IDE,
leider nur für Win32.
Das Board hängt mit einem Crosslink an der Seriellen.
Die MCU sendet und empfängt prinzipiell mit 9600 Baud, 8, N, 1.
Ich habe ein Testprogramm für den Controller geschrieben, das
auf Knopfdruck einzelne Bytes abschickt. Mit "Hyperterm" unter Windows
bekomme ich die Bytes zu sehen. Unter Linux passiert mit:
"cat /dev/ttyS0" leider nix, auch wenn ich die Baudrate mit:
"setserial /dev/ttyS0 baud_base 9600" einstelle.
Ich nutze übrigens die Slackware 10.
Ich bräuchte ein Shellkommando mit Standardausgabe,
weil ich mit dem Controller meine Linuxbüchse steuern möchte.
Der Controller versteht nämlich bis zu 64 Sprachbefehle.
Weiß denn jemand, ob es ein Kommando, Befehl, oder sogar
einen Dämonen gibt, der mir eine Standardausgabe liefert?
Danke im Vorraus,
tholan

derguteweka
04.12.04, 22:56
Moin,

Dass das mit cat nicht auf Anhieb funktioniert, dafuer fallen mir auf Anhieb 2 Gruende ein: 1.) Evtl. brauchts die HW-Handshakeleitungen und 2.) wahrscheinlich arbeitet cat blockorientiert, d.h. da muessen erstmal 512 byte zusammenkommen, dass da was passiert.
Wenn du unter Windows das Hyperterminal genommen hast, dann probier doch unter Linux mal miniterm aus. Musst ggf. die Modemstrings usw. in den Settings auf leer setzen. Aber da kannst du wenigstens mit/ohne Handshake definiert einstellen.

Wenn du die bytes von deinem Board auf dem Linuxrechner auch mit selbstgeschriebener SW weiterverarbeiten willst, dann guck' mal ins serial-programming-howto, ziemlich am Ende sind copy&paste-faehige C sourcen.

Gruss
WK

tholan
04.12.04, 23:30
Wau,
dat war ja fix.
Habs mit "miterm -s 9600" unter "tomsrbt" (Eindiskettenlinux)
probiert und es läuft (bei minicom muß man erst wieder soviel lesen).
An der MCU sind nur RX und TX beschaltet.
Ich kann ja mal den Controller mehr als 512 Bytes schicken
lassen, so zum Test. War wohl mein Denkfehler, daß
"/dev/ttyS0" genauso funktioniert wie "/dev/midi".
Danke,
tholan

derguteweka
04.12.04, 23:38
Moin,


Ich kann ja mal den Controller mehr als 512 Bytes schicken
lassen, so zum Test. War wohl mein Denkfehler, daß
"/dev/ttyS0" genauso funktioniert wie "/dev/midi".
Danke,
tholan
Sicher bin ich mir bei der Blockgeschichte natuerlich nicht. Is mir nur eingefallen, weil ich letzthin mal an nem devicedriver unter Linux geschraubt hatte, und da mal testweise auch mit cat aus dessen device (unter /dev ) gelesen hab'. In dem Treiber wurde dann die read funktion aufgerufen, allerdings mit jeweils 8KByte Anforderung, wenn ichs recht bedenk'.

Um die Sache mit dem Handshake zu testen, kannste ja mal am Stecker, der am PC endet, die RTS und CTS pins mitnander verbinden. Das geht ja mit nem grossen Klacks Loetzinn.

Gruss
WK

tholan
05.12.04, 00:17
Tjaaa, eigentlich sollte der Controller sich nicht nur mit dem Senden
von Strings beschäftigen.
Habe zwischenzeitlich mal ein paar andere Devices ausprobiert:
cua0, tty0, ttyC0, ttyI0...
Pfundst aber alles nicht.
Verstehe auch nicht so recht, warum man mit setserial die Protokollparameter
(8, N, 1) nicht setzen kann.
Den großen Lötzinnklecks hebe ich mir lieber für Morgen, äh später auf
und nehme mir mal das Serial Howto vor.
Danke,
tholan

atomical
05.12.04, 07:27
Wahrscheinlich arbeitet cat blockorientiert, d.h. da muessen erstmal 512 byte zusammenkommen, dass da was passiert.

Dem ist nicht so - auch einzelne Zeichen werden problemlos übertragen, lediglich bei Steuerzeichen wie EOT kann es (in der Standardeinstellung) Probleme geben - abzuändern mit stty.

tholan
05.12.04, 11:05
Hallo,
"ls -l /dev/ttyS0" gibt bei mir folgende Ausgabe:
"crw-rw---- 1 root uucp 4, 64 1994-07-18 01:48 /dev/ttyS0"
ttyS0 ist also Zeichenorientiert (crw....).
Habe im Programm meiner MCU an die Zeichen noch ein LF (ASCII 10)
angefügt. Das soll laut serial-programming-howto "canonical" sein.
Im Terminalprogramm erscheinen die Zeichen jetzt logischerweise
untereinander. Mit cat tut sich immer noch nix.
Ich denke, ich bin irgendwie immer noch "on the Woodway".

derguteweka
05.12.04, 13:07
Moin,


Hallo,
"ls -l /dev/ttyS0" gibt bei mir folgende Ausgabe:
"crw-rw---- 1 root uucp 4, 64 1994-07-18 01:48 /dev/ttyS0"
ttyS0 ist also Zeichenorientiert (crw....).

Jepp, das ist klar, es ging mir nur drum, wie cat arbeitet.

Habe im Programm meiner MCU an die Zeichen noch ein LF (ASCII 10)
angefügt. Das soll laut serial-programming-howto "canonical" sein.
Im Terminalprogramm erscheinen die Zeichen jetzt logischerweise
untereinander. Mit cat tut sich immer noch nix.
Ich denke, ich bin irgendwie immer noch "on the Woodway".

Hab' hier grad mal n Nullmodemkabel zwischen 2 Rechner gehaengt, aufm einen laeuft miniterm; auf dem anderen cat. Ergebnis: alles was in in miniterm eintipp, erscheint auf der anderen Seite (cat) jeweils nach einem Carrriage Return.
Sieht dann so aus:
root:~# cat /dev/ttyS0

olol
gnghlrtffddff
Allerdings sind die Handshakeleitungen alle aktiv, d.h. auf +12V. Die kann ich grad nicht abstellen, wahrscheinlich wirds an denen liegen, dasses funktioniert.

Gruss
WK

atomical
05.12.04, 13:27
Ergebnis: alles was in in miniterm eintipp, erscheint auf der anderen Seite (cat) jeweils nach einem Carrriage Return.

Auch das sollte sich abschalten lassen, so dass jedes Zeichen direkt durch die Leitung geht ...


stty -F /dev/ttyS0 raw

... genauer lesen -> die Notwendigkeit des CR könnte auch vom miniterm kommen ...

tholan
06.12.04, 08:08
Genossen,
et' pfundst! Es hat kompeliert! it works!
Die Lösung:

stty -F /dev/ttyS0 9600
stty -F /dev/ttyS0 raw
cat /dev/ttyS0

Hatte vorher immer versucht, die
Schnittstelle mit 'ner Kombination
aus "setserial" und "stty" einzustellen (s.o.).
Das klappt, warum auch immer, nicht!

Desweiteren scheint es auch in der Konsole unter X zu haken!
Das muß ich aber noch eroieren.
Zuverlässig klappts' jedenfalls auf der Textkonsole im Runlevel 3.
Danke euch vielmals für eure Hilfe.

BSM
11.12.04, 21:54
setserial wird im Kofler für Programme beschrieben, welche von Haus aus keine schnellen Übertragungsraten vertragen, dann wird einfach z.B. auf 115200 baudhochgedreht. stty ist, wie du schon bemerktest, das Kommando um direkt an der Schnittstelle zu drehen.

Gruss Robert @lustig