Python Serial

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
Benutzeravatar
Weltbesiedler
User
Beiträge: 103
Registriert: Dienstag 2. Februar 2010, 18:44
Wohnort: Bayern

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"
BlackJack

@Weltbesiedler: Dann hast Du vermutlich keinen (Byte)string übergeben. Zeig doch mal den Code und den kompletten Traceback, damit man nicht raten muss.
Benutzeravatar
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)
BlackJack

@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'
Benutzeravatar
Weltbesiedler
User
Beiträge: 103
Registriert: Dienstag 2. Februar 2010, 18:44
Wohnort: Bayern

würde man da eher einen literalen Wert verwenden: b'\x0d'
Wie kommt man auf den Wert?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
Antworten