OpenWrt: ttyS0 Read funktioniert nicht

OP #4295651
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.
Gast
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?
OP
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);
Moderator Persönliche Seite
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.
Gast
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
  }
OP
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.