Hallo Community, ich bin dabei ein Programm für OpenWrt zu schreiben. Dies soll die Serielle Schnittstelle(ttyS0) ansteuern. Das funktioniert soweit auch gut, nur das lesen funktioniert nicht. Sobald ich etwas auf der Seriellen schreibe, wird auf der anderen Seite der gleiche Inhalt zurück geliefert, aber mit einem CRLF. Die Konsole habe ich schon abgeschaltet.
Patrick S. schrieb: > Sobald ich etwas auf der Seriellen schreibe, wird auf der anderen Seite > der gleiche Inhalt zurück geliefert, aber mit einem CRLF. dann wird auch jemand das CRLF senden.
Peter II schrieb: > Patrick S. schrieb: >> Sobald ich etwas auf der Seriellen schreibe, wird auf der anderen Seite >> der gleiche Inhalt zurück geliefert, aber mit einem CRLF. > > dann wird auch jemand das CRLF senden. Aber selbst wenn mein Programm nicht läuft, wird auf der Konsole das ausgegeben, was auf der anderen Seite gesendet wird.
Patrick S. schrieb: > Aber selbst wenn mein Programm nicht läuft, wird auf der Konsole das > ausgegeben, was auf der anderen Seite gesendet wird. verstehe ich nicht? Hast du bedacht das der Linux seine debug Meldungen auf ttyS0 rausschreibt?
Die Debugmeldungen habe ich abgeschaltet. Das einzige was sich noch meldet ist der Bootloader. (kernel.printk = 0)
Patrick S. schrieb: > Die Debugmeldungen habe ich abgeschaltet. Das einzige was sich noch > meldet ist der Bootloader. dann beschreibe dein Problem noch mal genauer, eventuell auch mit quelltext.
OpenWrt --> PC funktioniert PC --> OpenWrt funktioniert nicht Sobald der PC Daten verschickt, gibt Openwrt die Daten wieder zurück mit einem CRLF. Folgende Konfiguration habe ich in OpenWrt vorgenommen: ◾/etc/sysctl.conf --> kernel.printk = 0 ◾/etc/inittab --> #::askconsole:/bin/ash --Login http://wiki.openwrt.org/doc/recipes/terminate.console.on.serial Quellcode:
1 | pFile =fopen("/dev/ttyS0","a"); |
2 | read(fileeno(pFile),Buffer, size); |
Dann solltest du die serielle Schnittstelle passend konfigurieren (z.B. mit stty). Rufe vorher mal "stty -F /dev/ttyS0 raw" auf.
Bringt leider nicht viel. Sobald ich Daten vom PC schicke, gibt OpenWrt die Ausgaben auf dem Terminal wieder zurück.
Patrick S. schrieb: > OpenWrt --> PC funktioniert > PC --> OpenWrt funktioniert nicht Mach Dich schlau, wie Du auf dem TTY das Echo abschaltest und das TTY in den Raw-Mode bekommst, do dass keine Zeichen mehr vom TTY-Treiber manipuliert werden. Google-Eingabe: man termios Das Auf-Raw-Stellen mittels stty geht zwar auch, besser ist es aber, wenn das Programm die TTY-Einstellungen selber kontrolliert.
In meiner Initroutine ändere ich die Baudrate, das läuft auch. Wenn ich statt fopen, open verwende mit dem Flag "O_RDWR", könnte das helfen?
:
Bearbeitet durch User
Also das ich immer die gleichen Daten wieder zurückbekommen habe, lag an der termios Konfiguration(Options.c_cflag&=~ ECHO). Nur leider empfängt mein Programm immer noch keine Daten.
Patrick S. schrieb: > Nur leider empfängt > mein Programm immer noch keine Daten. Wie denn auch, wenn du die Datei write-only öffnest.
Patrick S. schrieb: > Wenn ich statt fopen, open verwende mit dem Flag "O_RDWR", > könnte das helfen? Ja, es wird einfacher; fopen() gemischt mit read() ist unnötig unübersichtlich. Meine Programme initialisieren den Port so:
1 | struct termios comm_params; |
2 | |
3 | comm_params.c_iflag = IGNBRK | IGNPAR; |
4 | comm_params.c_oflag = 0; |
5 | comm_params.c_cflag = CREAD | CLOCAL | bits | parity | stopbits | baud; |
6 | comm_params.c_lflag = 0; |
7 | comm_params.c_line = 0; |
8 | comm_params.c_cc[VMIN] = 1; |
9 | comm_params.c_cc[VTIME] = 0; |
10 | if (ioctl (fd, TCSETS, &comm_params)) { |
11 | /* error */
|
12 | close (fd); |
13 | }
|
eagle user schrieb: > Patrick S. schrieb: > >> Wenn ich statt fopen, open verwende mit dem Flag "O_RDWR", >> könnte das helfen? > > Ja, es wird einfacher; fopen() gemischt mit read() ist unnötig > unübersichtlich. Das habe ich auch beseitigt, hatte am Anfang fopen verwendet. Bin dann aber auf open/read/write gewechselt. eagle user schrieb: > Patrick S. schrieb: > > Meine Programme initialisieren den Port so: > >
1 | struct termios comm_params; |
2 | >
|
3 | > comm_params.c_iflag = IGNBRK | IGNPAR; |
4 | > comm_params.c_oflag = 0; |
5 | > comm_params.c_cflag = CREAD | CLOCAL | bits | parity | stopbits | |
6 | > baud; |
7 | > comm_params.c_lflag = 0; |
8 | > comm_params.c_line = 0; |
9 | > comm_params.c_cc[VMIN] = 1; |
10 | > comm_params.c_cc[VTIME] = 0; |
11 | > if (ioctl (fd, TCSETS, &comm_params)) { |
12 | > /* error */ |
13 | > close (fd); |
14 | > } |
15 | >
|
1 | int file = open("dev/ttyS0", O_RDWR); |
2 | if(file == -1) |
3 | {
|
4 | //Fehler
|
5 | }
|
6 | else
|
7 | {
|
8 | fcntl(file, F_SETFL, FNDELAY); |
9 | |
10 | //Config 8N1
|
11 | tcgetattr(file, & options); |
12 | cfsetispeed(&options, B38400); |
13 | cfsetospeed(&Options, B38400); |
14 | options.c_cflag |= (CLOCAL | CREAD); |
15 | options.c_cflag &= ~PARENB; |
16 | options.c_cflag &= ~CSTOPB; |
17 | options.c_cflag &= ~CSIZE; |
18 | options.c_cflag |= CS8; |
19 | options.c_cflag &= ~ECHO; |
20 | |
21 | tcsetattr(file, TCSANOW, &Options); |
22 | |
23 | }
|
Gibt es eine Deutsche Dokumentation zu der Konfiguration? Bisher bin ich nur auf englische gestoßen?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.