neubi
July 8, 2018, 10:18pm
1
Hallo,
ich habe 3 Arduino Nanos, die an einem PC mit Debian Jessie über USB angebunden sind. In den Sketchen verwende ich die Library "SerialCommand" ((GitHub - kroimon/Arduino-SerialCommand: A Wiring/Arduino library to tokenize and parse commands received over a serial port. ). PC-seitig erfolgt die Kommunikation über Python 2.7.
Mein Problem: Wenn ich das Python Skript zum ersten Mal starte, reagieren die Arduinos überhaupt nicht. Wenn ich das Skript mit + abbreche und neu starte, kann ich die Arduinos ansprechen. Allerdings muss ich den Vorgang ggf. mehrmals wiederholen, bevor das funktioniert.
Wenn ich die Arduino IDE starte und die Arduinos über den Serial Monitor anspreche, reagieren sie zuverlässig und führen alle Befehle aus.
Weiß jemand einen Rat?
Gruß Jürgen
neubi:
Weiß jemand einen Rat?
Verfolge mal die Logdateien unter /var/log. Eine der vielen. In syslog oder messages solltest Du sehen können, ob das Stöpseln des Arduinos einen Eintrag erzeugt. Probiere mal, eine serielle Kommunikation zw. Arduinos und Python zustande zu bringen. Python kenne ich nicht ansatzweise.
Gruß
Gregor
neubi
July 11, 2018, 4:33pm
3
Hallo Gregor,
vielen Dank für Dein Feedback. Mittlerweile habe ich eine Lösung gefunden.
Das Problem wird hier beschrieben:
opened 08:51PM - 04 Jun 16 UTC
Python 3.5.1 on Windows 8.1 64 bit, hardware is Silabs CP2102 USB-UART bridge wi… th current drivers. pySerial upgraded from 3.0.1 to current 3.1 via pip3 (as admin)
```
>pip show pyserial
---
Metadata-Version: 2.0
Name: pyserial
Version: 3.1
Summary: Python Serial Port Extension
Home-page: https://github.com/pyserial/pyserial
```
Invoked with
`import serial
ser = serial.Serial('COM3', 38400)`
causes the DTR line to change (at least once) so my connected hardware is reset. This does not happen if the port is opened with another software, HTerm (http://www.der-hammer.info/terminal/) which also allows individual control of these lines.
Testing
```
import serial
ser = serial.Serial()
ser.baudrate = 38400
ser.port = 'COM3'
print(ser)
sys.exit()
```
results in
```
opening serial port...
Serial<id=0x40979e3860, open=False>(port='COM3', baudrate=38400, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
```
But it does toggle the control line(s) despite the "False".
See also http://stackoverflow.com/questions/15460865/disable-dtr-in-pyserial-from-code
But
```
print("opening serial port...")
import serial
ser = serial.Serial()
ser.baudrate = 38400
ser.port = 'COM3'
print(ser)
ser.setDTR(0)
print(ser)
#sys.exit()
ser.open()
```
works.
The method is deprecated, however: http://pyserial.readthedocs.io/en/stable/pyserial_api.html#serial.Serial.setDTR
So let's try again with the current API:
http://pyserial.readthedocs.io/en/stable/pyserial_api.html#serial.Serial.dtr
```
print("opening serial port...")
import serial
ser = serial.Serial()
ser.baudrate = 38400
ser.port = 'COM3'
print(ser)
ser.dtr = 0
print(ser)
ser.open()
```
and `ser.dtr = None` works as well!
So something must be wrong with the initial state.
May be related to https://github.com/pyserial/pyserial/issues/89
But dev seems to have shot down a similar issue just last year:
https://sourceforge.net/p/pyserial/bugs/176/#2ce7
Please fix or mention in the docs. Thanks!
Mit dem nachfolgenden Beispielcode funktioniert die Kommunikation bei mir reibungslos.
Ich habe DTR auf Null gesetzt und warte nach dem Öffnen mindestens 2 Sekunden, bevor ich den ersten Befehl an den Arduino absetze.
import serial
import time
ser = serial.Serial()
ser.baudrate = 115200
ser.port = '/dev/ttyACM1'
# DTR auf Null setzen, sonst reagiert der Arduino nicht.
ser.dtr = 0
ser.open()
# 2 Sekunden warten...
time.sleep(2)
# Ab jetzt Kommunikation mit Arduino aufnehmen
Gruß Jürgen