Forum: Mikrocontroller und Digitale Elektronik Raspberry Pi: USB und GPIO: Serielle Schnittstellen gleichzeitig nutzen


von Timo S. (ti_mo)


Lesenswert?

Hallo zusammen,

ich lasse einen Arduino mit einem Raspberry Pi 3B über eine serielle 
Schnittstelle über USB miteinander kommunizieren.
Jetzt würde ich gerne ein XBee über die GPIOs mit dem RPi verbinden, 
damit über diese Schnittstelle Daten an einen weiteren Arduino 
übertragen werden können.

Kann ich beide Schnittstellen (USB und UART) gleichzeitig nutzen, oder 
schließt eine die andere aus?

Liebe Grüße und Danke im voraus!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Timo S. schrieb:
> Kann ich beide Schnittstellen (USB und UART) gleichzeitig nutzen,

Natürlich.

> oder schließt eine die andere aus?

Nein.

Täte sie es, könntest Du die UART auch nicht benutzen, wenn 
Netzwerkaktivität stattfindet, oder ein USB-Stick angeschlossen ist.

Du kannst auch mehrere USB-Seriell-Adapter an Deinem Raspberry Pi 
betreiben.

von Timo S. (ti_mo)


Lesenswert?

Super, Danke für die schnelle Antwort! :)

von bingo (Gast)


Lesenswert?

Die echten seriellen Schnittstellen liegen auf /dev/ttySx und die 
virtuellen seriellen Schnittstellen auf /dev/ttyUSBx

von Martin B. (ratazong)


Lesenswert?

bingo schrieb:
> Die echten seriellen Schnittstellen liegen auf /dev/ttySx und die
> virtuellen seriellen Schnittstellen auf /dev/ttyUSBx

Bei meinem raspi zeroW heisst die echte /dev/ttyAMA0, warum auch immer.
(Raspian jessie)

Die virtuellen USB können auch /dev/ttyACMx heissen, je nachdem, wie 
sich der Converter bei USB anmeldet.

von Martin B. (ratazong)


Lesenswert?

sollte natürlich nicht die virtuellen USB heissen.
Die sind ja real, nur über USB Adapter

von Timo S. (ti_mo)


Lesenswert?

Ich bekomme jetzt folgenden Fehler wenn ich einen Port
1
/dev/ttyS0
 über UART öffnen will:
1
SerialException: could not open port /dev/ttyS0: [Errno 2] No such file or directory: "/dev/ttyS0"

was hab ich falsch gemacht?

von S. R. (svenska)


Lesenswert?

Du hast die falsche Datei geöffnet.
Schau nach, wie sie bei dir tatsächlich heißt. Ein "dmesg | grep tty" 
sollte dich auf den richtigen Weg führen.

von Karl (Gast)


Lesenswert?

bingo schrieb:
> Die echten seriellen Schnittstellen liegen auf /dev/ttySx und die
> virtuellen seriellen Schnittstellen auf /dev/ttyUSBx

Ui, das ist aber eine gewagte Aussage. Unter Linux können die auch auf 
ttyAMAx liegen, oder ttyACMx. Gihbt bestimmt noch andere Varianten.

von Jobst Q. (joquis)


Lesenswert?

Timo S. schrieb:
> Ich bekomme jetzt folgenden Fehler wenn ich einen Port
>
1
/dev/ttyS0
 über UART öffnen will:
>
>
1
> SerialException: could not open port /dev/ttyS0: [Errno 2] No such file 
2
> or directory: "/dev/ttyS0"
3
>
>
> was hab ich falsch gemacht?

diese Schnittstelle ist beim Raspi nicht vorhanden. Probier es mal mit 
/dev/ttyAMA0, wenn du die GPIO-UART meinst.

von Harry L. (mysth)


Lesenswert?

Ein beherztes

ls -l /dev/tty[A,S,U]*

setzt dem Ratespiel ein schnelles Ende....

: Bearbeitet durch User
von Timo S. (ti_mo)


Lesenswert?

S. R. schrieb:
> Du hast die falsche Datei geöffnet.
> Schau nach, wie sie bei dir tatsächlich heißt. Ein "dmesg | grep tty"
> sollte dich auf den richtigen Weg führen.
1
pi@raspberrypi:~ $ dmesg | grep tty
2
3
[    0.000000] Kernel command line: 8250.nr_uarts=1 bcm2708_fb.fbwidth=1024 bcm2708_fb.fbheight=600 bcm2708_fb.fbswap=1 dma.dmachans=0x7f35 bcm2709.boardrev=0xa02082 bcm2709.serial=0xccc3e3a2 bcm2709.uart_clock=48000000 smsc95xx.macaddr=B8:27:EB:C3:E3:A2 vc_mem.mem_base=0x3dc00000 vc_mem.mem_size=0x3f000000  dwc_otg.lpm_enable=0 console=ttyS0,115200 console=tty1 root=PARTUUID=57699a2a-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
4
[    0.000481] console [tty1] enabled
5
[    0.289156] console [ttyS0] disabled
6
[    0.289215] 3f215040.uart: ttyS0 at MMIO 0x3f215040 (irq = 59, base_baud = 31250000) is a 16550
7
[    0.289739] console [ttyS0] enabled
8
[    0.841760] 3f201000.uart: ttyAMA0 at MMIO 0x3f201000 (irq = 87, base_baud = 0) is a PL011 rev2
9
[    3.269853] systemd[1]: Expecting device dev-ttyS0.device...
10
[    3.308358] systemd[1]: Starting system-serial\x2dgetty.slice.
11
[    3.308631] systemd[1]: Created slice system-serial\x2dgetty.slice.





So wie ich das sehe ist ttyS0 aktiv(?).
Beim RPi wird doch ttyAMA0 durch Bluetooth belegt... Wenn ich diesen 
Port öffnen will, kommt:
1
SerialException: Port is already open



Harry L. schrieb:
> Ein beherztes
>
> ls -l /dev/tty[A,S,U]*
>
> setzt dem Ratespiel ein schnelles Ende....

da wird ausgegeben:
1
crw-rw---- 1 root dialout 204, 64 Jan 15 10:17 /dev/ttyAMA0
2
crw-rw---- 1 root tty       4, 64 Jan 15 10:17 /dev/ttyS0

demnach müsste ttyS0 doch verfügbar sein, oder?
Daraufhin habe ich nochmal versucht einen Port über ttyS0 zu öffnen.
folgende Fehlermeldung:
1
 
2
SerialException: could not open port /dev/ttyS0: [Errno 13] Permission denied: "/dev/ttyS0"

Nach einigen Recherchen fand ich raus das der User (pi) der gruppe 
dialout zugehören muss.
Pi ist jedoch schon in der Gruppe dialout.

von Harry L. (mysth)


Lesenswert?

Die erste serielle Schnittstelle ist standadrtmässig als Console 
eingerichtet:
1
root@pi3:/boot# cat cmdline.txt 
2
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 elevator=deadline root=/dev/mmcblk0p2 rootfstype=ext4 fsck.repair=yes rootwait
3
root@pi3:/boot#

Ausserdem findet sich in /etc/inittab folgendes:
1
root@pi3:/etc# cat inittab 
2
#Spawn a getty on Raspberry Pi serial line
3
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
4
root@pi3:/etc#

Will man diese Schnittstelle für eigene Zwecke nutzen, muß man zunächst 
diese Bindung auflösen.

von S. R. (svenska)


Lesenswert?

> [    0.289215] 3f215040.uart: ttyS0 at MMIO 0x3f215040 (irq = 59,
> base_baud = 31250000) is a 16550
> [    0.841760] 3f201000.uart: ttyAMA0 at MMIO 0x3f201000 (irq = 87,
> base_baud = 0) is a PL011 rev2

Es gibt also offensichtlich zwei serielle Schnittstellen, /dev/ttyS0 und 
/dev/ttyAMA0.

> Beim RPi wird doch ttyAMA0 durch Bluetooth belegt... Wenn ich diesen
> Port öffnen will, kommt:SerialException: Port is already open

Gut, dann ist deine gewünschte Schnittstelle wohl /dev/ttyS0.

> da wird ausgegeben:
> crw-rw---- 1 root dialout 204, 64 Jan 15 10:17 /dev/ttyAMA0
> crw-rw---- 1 root tty       4, 64 Jan 15 10:17 /dev/ttyS0

Das ist eine Bestätigung dessen, was der Kernel dir oben schrieb.

> Daraufhin habe ich nochmal versucht einen Port über ttyS0 zu öffnen.
> folgende Fehlermeldung:
> SerialException: could not open port /dev/ttyS0: [Errno 13] Permission
> denied: "/dev/ttyS0"

Deine erste Fehlermeldung war demnach irreführend.
"Kann ich nicht öffnen" ist ein anderes Problem als "gibt es nicht".

> Nach einigen Recherchen fand ich raus das der User (pi) der gruppe
> dialout zugehören muss.

Du hast vermutlich kurz Google angeworfen, oder? ;-)
Hättest du die von dir gerade gepostete Ausgabe angeschaut, hättest du 
gesehen, dass der Benutzer in der Gruppe "tty" sein muss, um ttyS0 
anzusprechen, und in der Gruppe "dialout" sein muss, um ttyAMA0 
anzusprechen.

> Pi ist jedoch schon in der Gruppe dialout.

Dann füge ihn mal der Gruppe "tty" hinzu und starte neu.
Das sollte mit "sudo adduser pi tty; sudo reboot" funktionieren.

von schnarc (Gast)


Lesenswert?

Timo S. schrieb:
> Nach einigen Recherchen fand ich raus das der User (pi) der gruppe
> dialout zugehören muss.

Nein, es ist die Gruppe tty

von Harry L. (mysth)


Lesenswert?

S. R. schrieb:
> Es gibt also offensichtlich zwei serielle Schnittstellen, /dev/ttyS0 und
> /dev/ttyAMA0.

Ja, ttyAMA0 geht auf Bluetooth und ttyS0 auf den GPIO-Header.
Das ist seit RPi3 so.
Bei älterem RPis war ttyAMA0 auf dem GPIO-Header.

S. R. schrieb:
> Dann füge ihn mal der Gruppe "tty" hinzu und starte neu.
> Das sollte mit "sudo adduser pi tty; sudo reboot" funktionieren.

No!
Entscheidend für den Zugriff auf die Serielle ist die Gruppe dialout.
Es ist auch kein Reboot erforderlich.
Es reicht völlig, sich einmal aus und wieder einzuloggen.

Die Serielle auf dem GPIO-Header ist per default belegt.
Beim Start durch die Kernel-Messages und im Betrieb durch einen 
getty-Prozess.

Wenn man die selbst nutzen will:
Beitrag "Re: Raspberry Pi: USB und GPIO: Serielle Schnittstellen gleichzeitig nutzen"

und ggf ttyAMA0 gegen ttyS0 erstetzen..

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Harry L. schrieb:
> S. R. schrieb:
>> Dann füge ihn mal der Gruppe "tty" hinzu und starte neu.
>> Das sollte mit "sudo adduser pi tty; sudo reboot" funktionieren.
>
> No!
> Entscheidend für den Zugriff auf die Serielle ist die Gruppe dialout.

Die oben gepostete Ausgabe von "ls" sagt das Gegenteil.

Harry L. schrieb:
> Es reicht völlig, sich einmal aus und wieder einzuloggen.

Stimmt, aber ein Reboot funktioniert ebenfalls und ist für einen 
unbedarften Anfänger einfacher.

Harry L. schrieb:
> Beim Start durch die Kernel-Messages und im Betrieb durch einen
> getty-Prozess.

Nutzen aktuelle Raspberry-Images nicht systemd? Da gibt es (zumindest 
auf meinem Debian) kein /etc/inittab mehr. Aber ja, mit dem getty hast 
du natürlich recht. Warten wir mal ab, was Jobst sagt, denn um dessen 
System geht's ja.

von Timo S. (ti_mo)


Lesenswert?

Ich habs jetzt hinbekommen!
Habe die Schnittstelle nach der Anleitung von der Netzmafia 
freigeschalten.

http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_Serial.html
Da wird auch explizit erklärt, wie man es mit einem Pi3 hinbekommt. 
(etc/inittab gibt es nicht mehr)
Vielen Dank für eure Geduld und eure Hilfe, alleine hätte ich das nie 
hinbekommen.

Liebe Grüße,
Timo

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.