OpenWrt: ttyS0 Read funktioniert nicht

OP #4295651
Lesenswert?

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.
OP #4295676
Lesenswert?

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 #4295692
Lesenswert?

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 #4295855
Lesenswert?

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 #4296341
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren