Hallo, weiß zufällig jemand, warum ich unter Suse 9.1 zwar mit ~> stty 9600 < /dev/ttyS0 ~> echo -ne '\257\011' >/dev/ttyS0 Daten auf COM1 senden kann, aber mit ~> cat < /dev/ttyS0 keine Daten empfangen kann (unter Windows funktioniert es). Ich habe es auch mit dem folgendem C-Programm versucht: #include <stdio.h> #include <string.h> /* String function definitions */ #include <unistd.h> /* UNIX standard function definitions */ #include <fcntl.h> /* File control definitions */ #include <errno.h> /* Error number definitions */ #include <termios.h> /* POSIX terminal control definitions */ int open_port (void) { struct termios options; int fd; // Filedeskriptor fd = open ("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK | O_SYNC); /*Öffne serielle Schnittstelle ttyS0 mit folgenden Eigenschaften: * O_RDWR read and write * O_NOCTTY es handelt sich um keine Konsole * O_NONBLOCK nicht blockieren * O_SYNC warte bei jeden write aufruf, bis er fertig ist*/ if (fd < 0) // negative Zahl bei fehler! { fprintf(stderr, "Open_port: unable to open /dev/ttyS0 \n"); exit (1); // irreparebel, verlasse Programm } fcntl (fd, F_SETFL, O_ASYNC); tcgetattr (fd, &options); // verlange die aktuellen Einstellungen cfsetispeed (&options, B9600); // ändere die Baud-rate auf 9600 cfsetospeed (&options, B9600); // ändere die Baud-rate auf 9600 options.c_cflag |= (CLOCAL | CREAD); // auch lesen möglich options.c_cflag &= ~PARENB; // keine Paritätbits options.c_cflag &= ~CSTOPB; // nur ein Stop-bit options.c_cflag &= ~CSIZE; // lösche Datenbitseinstellung, damit nächster Befehl gültig ist options.c_cflag |= CS8; // select 8 Databits options.c_cflag &= ~CRTSCTS; // disable Hardwareflow control options.c_lflag &= ~(ICANON | ECHO | ISIG); // raw data tcsetattr (fd, TCSANOW, &options); return fd; } int main() { int fd0; char buffer[100]; int size; fd0 = open_port (); printf("%i\n", fd0); fcntl(fd0, F_SETFL, FNDELAY); size = read(fd0, buffer, 99); printf("%i\n", size); if (size > 0) { buffer[size] = '\0'; printf("%s\n", buffer); } close(fd0); return -1; } Gruß Ralf
On Wednesday 20 July 2005 22:43, Ralf Kleemann wrote:
Hallo,
weiß zufällig jemand, warum ich unter Suse 9.1 zwar mit
~> stty 9600 < /dev/ttyS0 ~> echo -ne '\257\011' >/dev/ttyS0
Daten auf COM1 senden kann, aber mit
~> cat < /dev/ttyS0
keine Daten empfangen kann (unter Windows funktioniert es). [...]
Hi, ich würde ja als Tipp sagen (spätestens wenn dir niemand antwortet): am besten frage auf suse-programming@suse.com nach, da scheint das ganze besser aufgehoben zu sein. Im übrigen: bei mir scheint das cat auf /dev/ttyS0 auf einer 9.1 auf dem ersten Blick zu funktionieren. Wie macht sich das 'nicht funktionieren' denn bemerkbar? Kommt einfach nix an oder kannst du nicht auf /dev/ttyS0 zugreifen bzw. gibt es IO-Fehler o.ä.? Gruß, Danny
* Danny Kukawka [20.07.2005 23:37]:
On Wednesday 20 July 2005 22:43, Ralf Kleemann wrote:
weiß zufällig jemand, warum ich unter Suse 9.1 zwar mit
~> stty 9600 < /dev/ttyS0 ~> echo -ne '\257\011' >/dev/ttyS0
Daten auf COM1 senden kann, aber mit
~> cat < /dev/ttyS0
keine Daten empfangen kann (unter Windows funktioniert es).
[...]
Geht's denn mit einem Terminalprogramm, z. B. minicom? Gruß, Bernhard
Bernhard Walle schrieb:
Geht's denn mit einem Terminalprogramm, z. B. minicom?
wenn ich minicom als root ausführe, funktioniert "cat < /dev/ttyS0" auch als user. Anscheinend ist "stty 9600 < /dev/ttyS0" auch als root ausgeführt zum initialisieren nicht ausreichend. Die Routinen zum Testen und Empfangen von Daten werde ich wohl in C programmieren müssen. Gruß Ralf
* Ralf Kleemann [21.07.2005 03:08]:
Bernhard Walle schrieb:
Geht's denn mit einem Terminalprogramm, z. B. minicom?
wenn ich minicom als root ausführe, funktioniert "cat < /dev/ttyS0" auch als user. Anscheinend ist "stty 9600 < /dev/ttyS0" auch als root ausgeführt zum initialisieren nicht ausreichend.
Muss es eigentlich nicht stty 9600 /dev/ttyS0 heißen? Außerdem gibt es ja auch noch setserial.
Die Routinen zum Testen und Empfangen von Daten werde ich wohl in C programmieren müssen.
Wäre wohl besser. Oder in Python, da gibt's ein schönes Modul serial. Mal ein Teil eines Beispielprogramms: import serial ser = serial.Serial('/dev/ttyS14', 115200, rtscts= 0, xonxoff = 0, timeout = 1) number = 0 print "Port opened, counting %f seconds" % DURATION while cont: number += len(ser.read()) ser.close() Für C: http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/ http://www.easysw.com/~mike/serial/serial.html Außerdem habe ich mal einen einafchen C++ Wrapper programmiert, bei Interesse -> PM. Gruß, Bernhard
Meine Wetterstation lief zuerst auch nicht an der seriellen Schnittstelle, dann mußte ich mit Yast den Com-Port speziell für den Benutzer freigeben. Was ich genau gemacht habe, weiß ich aber auch nicht mehr, ich mußte den Benutzer noch zu einer bestimmten Gruppe hinzufügen. Jürgen
participants (4)
-
Bernhard Walle
-
Danny Kukawka
-
Jürgen Hochwald
-
Ralf Kleemann