Hallo,
in diversen Anleitungen: http://www.instructables.com/id/Interfa ... /?ALLSTEPS
kann man der Funktion "serial.write()" anscheinend einen String übergeben. Bei meiner installierten pySerial Version (2.7) erscheint dann der Error: "An integer is required"
Python Serial
- Weltbesiedler
- User
- Beiträge: 103
- Registriert: Dienstag 2. Februar 2010, 18:44
- Wohnort: Bayern
@Weltbesiedler: Dann hast Du vermutlich keinen (Byte)string übergeben. Zeig doch mal den Code und den kompletten Traceback, damit man nicht raten muss.
- Weltbesiedler
- User
- Beiträge: 103
- Registriert: Dienstag 2. Februar 2010, 18:44
- Wohnort: Bayern
Code: Alles auswählen
import serial
ser = serial.Serial(port='COM4', baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, timeout=2)
try:
ser.isOpen()
except:
exit()
try:
ser.write(str(chr(13)))
except Exception as e:
print(e)
@Weltbesiedler: Die Zeilen 4 bis 7 sind überflüssig denn erstens ist die serielle Verbindung an der Stelle garantiert offen, denn sonst hätte es in Zeile 3 schon eine Ausnahme gegeben und dann ist dieses nackte ``except`` nicht gut, und was für eine Ausnahme sollte denn da überhaupt auftreten? Und selbst wenn eine Auftritt bricht das Programm damit ja ab, also ist die ”Fehlerbehandlung” mit dem `exit()` unnötig.
Auch die zweite ”Fehlerbehandlung” ist nicht angemessen, denn das einzige was die tut ist wichtige Information wegwerfen.
Es sieht so aus als wenn Du Python 3 verwendest. Da sind Zeichenketten echte Unicode-Zeichenketten, über die serielle Verbindung kann man aber nur Bytes versenden und empfangen. Du musst also den entsprechenden Bytewert als `bytes`-Objekt statt als `str`-Objekt dort schreiben. Der `str()`-Aufruf wäre an der Stelle übrigens überflüssig, denn `chr()` liefert ja schon ein Objekt vom Typ `str`. Statt einer Zahl und zwei Funktionsaufrufen würde man da eher einen literalen Wert verwenden: b'\x0d'
Auch die zweite ”Fehlerbehandlung” ist nicht angemessen, denn das einzige was die tut ist wichtige Information wegwerfen.
Es sieht so aus als wenn Du Python 3 verwendest. Da sind Zeichenketten echte Unicode-Zeichenketten, über die serielle Verbindung kann man aber nur Bytes versenden und empfangen. Du musst also den entsprechenden Bytewert als `bytes`-Objekt statt als `str`-Objekt dort schreiben. Der `str()`-Aufruf wäre an der Stelle übrigens überflüssig, denn `chr()` liefert ja schon ein Objekt vom Typ `str`. Statt einer Zahl und zwei Funktionsaufrufen würde man da eher einen literalen Wert verwenden: b'\x0d'
- Weltbesiedler
- User
- Beiträge: 103
- Registriert: Dienstag 2. Februar 2010, 18:44
- Wohnort: Bayern
Wie kommt man auf den Wert?würde man da eher einen literalen Wert verwenden: b'\x0d'
Code: Alles auswählen
In [1]: hex(13)
Out[1]: '0xd'
In [2]: chr(13)
Out[2]: '\r'
In [3]: ord(chr(13))
Out[3]: 13
In [4]: hex(ord(chr(13)))
Out[4]: '0xd'
In [5]: '\x0d'
Out[5]: '\r'
the more they change the more they stay the same