serial: Problem mit der Übertragungsrate

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nitram
User
Beiträge: 3
Registriert: Mittwoch 8. Juni 2016, 11:28

Guten Tag,

ich bin Python-Neuling und kämpfe mit der Übertragung von Daten über die serielle Schnittstelle.
Die Daten stammen von einem Arduino, der nichts anders macht als sich zu "melden".

Code: Alles auswählen

void setup() {
Serial.begin(115200);
}
void loop() {
  Serial.println("Hier bin ich.");
  delay(1000);
}
Nun der Python-Teil.
Wenn ich die serielle Schnittstelle mit der am Arduino eingestellten Übertragungsrate 115200 öffne, erhalte ich "Müll".
Wenn ich sie mit einer falschen Übertragungsrate (9200) öffne, wieder schließe und dann mit 115200 öffne, erhalte ich die gewünschten Daten.

Auf der Konsole sieht das so aus:

Code: Alles auswählen

Python 2.7.8 (default, Sep 30 2014, 15:34:38) [GCC] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> ser=serial.Serial('/dev/ttyUSB0',115200)
>>> print(ser.read(15))
�a
�▒�▒▒�p�1�:�
>>> ser.close()
>>> ser=serial.Serial('/dev/ttyUSB0',115200)
>>> print(ser.read(15))

�▒��p��8p�p���
>>> ser.close()
>>> ser=serial.Serial('/dev/ttyUSB0',9200)
>>> ser.close()
>>> ser=serial.Serial('/dev/ttyUSB0',115200)
>>> print(ser.read(15))
Hier bin ich.

>>> print(ser.read(15))
Hier bin ich.

>>> print(ser.read(15))
Hier bin ich.

>>> ser.close()
Wenn ich wieder / weiter lesen will wiederholt sich das Spiel.
Auch jetzt muss ich erst mit 9200 öffnen, um dann erfolgreich mit 115200 lesen zu können.

Code: Alles auswählen

>>> ser=serial.Serial('/dev/ttyUSB0',115200)
>>> print(ser.read(15))
p�p�p�1�:1�>:�▒
>>> ser.close()
>>> ser=serial.Serial('/dev/ttyUSB0',115200)
>>> print(ser.read(15))
p�>:�a��a▒��p��
>>> ser.close()
>>> ser=serial.Serial('/dev/ttyUSB0',9200)
>>> ser.close()
>>> ser=serial.Serial('/dev/ttyUSB0',115200)
>>> print(ser.read(15))
Hier bin ich.

>>> ser.close()
>>> 
Das Problem tritt auch auf, wenn ich serial.tools.miniterm verwende:

Code: Alles auswählen

nitram@linux-DrDet:~/Downloads/ArduinoPlot-master> python -m serial.tools.miniterm -p /dev/ttyUSB0 -b 115200
--- Miniterm on /dev/ttyUSB0: 115200,8,N,1 ---
--- Quit: Ctrl+]  |  Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Hier bin ich.
Hier bin ich.
Hier bin ich.
--- exit ---
nitram@linux-DrDet:~/Downloads/ArduinoPlot-master> python -m serial.tools.miniterm -p /dev/ttyUSB0 -b 115200
--- Miniterm on /dev/ttyUSB0: 115200,8,N,1 ---
--- Quit: Ctrl+]  |  Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
p�p�>:
--- exit ---
nitram@linux-DrDet:~/Downloads/ArduinoPlot-master> python -m serial.tools.miniterm -p /dev/ttyUSB0 -b 115200
--- Miniterm on /dev/ttyUSB0: 115200,8,N,1 ---
--- Quit: Ctrl+]  |  Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
�▒▒
--- exit --
nitram@linux-DrDet:~/Downloads/ArduinoPlot-master> python -m serial.tools.miniterm -p /dev/ttyUSB0 -b 9200
--- Miniterm on /dev/ttyUSB0: 9200,8,N,1 ---
--- Quit: Ctrl+]  |  Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
�]�
--- exit ---
nitram@linux-DrDet:~/Downloads/ArduinoPlot-master> python -m serial.tools.miniterm -p /dev/ttyUSB0 -b 115200
--- Miniterm on /dev/ttyUSB0: 115200,8,N,1 ---
--- Quit: Ctrl+]  |  Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
Hier bin ich.
Hier bin ich.
Hier bin ich.
Hier bin ich.
Hier bin ich.

--- exit ---
nitram@linux-DrDet:~/Downloads/ArduinoPlot-master> ^C
Kann mir jemand einen Tipp geben, wie ich die Verbindung "sicher" in einem Versuch aufbauen kann?

Gruß
Nitram
BlackJack

@Nitram: Je nachdem welchen Arduino Du hast kann es sein das der jedesmal wenn eine Serielle Verbindung aufgebaut wird resettet und die ersten 1 oder zwei Sekunden nicht Dein Programm auf dem Arduino auf der seriellen Schnittstelle lauscht sondern die Firmware kurz wartet ob man versucht den Arduino über die serielle Schnittstelle neu zu flashen. Also bau nach dem Verbindungsaufbau einfach mal eine kurze Wartezeit ein und schau ob es dann funktioniert.
Nitram
User
Beiträge: 3
Registriert: Mittwoch 8. Juni 2016, 11:28

Leider nicht.
Ich habe mit zwei Nanos und einem Duemilanove getestet.
Die Code-Schnippsel oben sind wirklich "von der Konsole", d.h. während ich Tippe hatte der Arduino viel Zeit ("mehrere" bis "viele" Sekunden , bis ich das nächste mal auf Return gedrückt habe.

Gruß
Nitam
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ich habe dein Code ausprobiert. Sowohl auf Arduino als auch Python Seite kann ich das Verhalten nicht bestätigen.

Xubuntu 14.04 mit Python 2.7.6 und Arduino Nano.
Nitram
User
Beiträge: 3
Registriert: Mittwoch 8. Juni 2016, 11:28

Danke für die Hilfe-Versuche.
Ich habe mittlerweile mit einem Raspi (Phyton 2.7.3) statt PC (OpenSuse 13.2 mit Phyton 2.7.8 und Phyton 3.4.1) getestet.
Dort gibt es keine Probleme.

Ist wohl kein Python-Problem, sondern irgendwo bei der Installation oder Hardware meines PCs zu suchen.

Gruß
Nitram
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Installation kannst du mit einer Live CD schnell testen.

Ich könnte mir vorstellen das mehr als ein zweites Programm mit falschen Einstellungen auf die Schnittstelle zugreift und das dadurch das Verhalten ausgelöst wird.

PS: Unter meinem Laptop Xubuntu 16.04 mit Python 2.7.11+ funktioniert es auch.
Antworten