Forum: Mikrocontroller und Digitale Elektronik OpenWrt: ttyS0 Read funktioniert nicht


von Patrick S. (patrick_s81)


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.

von Peter II (Gast)


Lesenswert?

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.

von Patrick S. (patrick_s81)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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?

von Patrick S. (patrick_s81)


Lesenswert?

Die Debugmeldungen habe ich abgeschaltet. Das einzige was sich noch 
meldet ist der Bootloader.

(kernel.printk = 0)

von Peter II (Gast)


Lesenswert?

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.

von Patrick S. (patrick_s81)


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);

von S. R. (svenska)


Lesenswert?

Dann solltest du die serielle Schnittstelle passend konfigurieren (z.B. 
mit stty). Rufe vorher mal "stty -F /dev/ttyS0 raw" auf.

von Patrick S. (patrick_s81)


Lesenswert?

Bringt leider nicht viel. Sobald ich Daten vom PC schicke, gibt OpenWrt 
die Ausgaben auf dem Terminal wieder zurück.

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Patrick S. (patrick_s81)


Lesenswert?

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
von Patrick S. (patrick_s81)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

Patrick S. schrieb:
> Nur leider empfängt
> mein Programm immer noch keine Daten.

Wie denn auch, wenn du die Datei write-only öffnest.

von eagle user (Gast)


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
  }

von Patrick S. (patrick_s81)


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?

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
Noch kein Account? Hier anmelden.