Hallo Leute,
hab schwierigkeiten mit Python über dem COM-Port daten zu senden. Ich
wollte einfach mal nach dem Enter einen reboot befehl senden, allerdings
bekomme ich immer "error communications". Woran kann es liegen? Hier ein
kleiner Code:
import serial
import sys
import threading
import re
import time
ser = serial.Serial( port=COM1,
baudrate=115200,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
timeout=2)
try:
print ("Serial port is open")
ser.isOpen()
except Exception:
print ("error open serial port: " + str(e))
exit()
if ser.isOpen():
try:
ser.write('\r')
ser.write('reboot')
print("write data: reboot")
except Exception:
print ("error communicating...: " + str())
else:
print ("cannot open serial port ")
Vielen Dank im Vorraus!
Gruß
Max
Max schrieb:> ser = serial.Serial( port=COM1,
Sofern Du nicht vorher eine Zuweisung wie z.B. COM1='COM1' durchgeführt
hast, ist das falsch. Korrekt wäre z.B. unter MS Windows:
ser = serial.Serial( port='COM1',
Andreas Schweigstill schrieb:> ser = serial.Serial( port='COM1',
Wenn er wirklich COM1 haben will, muss er (glaube ich) 'COM0' angeben,
da das bei M$ immer um eins verschoben ist.
ser = serial.Serial( port='COM0'
oder:
COM1 = 'COM0'
ser = serial.Serial( port=COM1,
Aber sonsten hast du natuerlich recht: der Portname muss als string
angegeben werden, wie unter linux auch (port='/dev/ttyUSB0', z.B.)
Gruesse
Kaj schrieb:> Wenn er wirklich COM1 haben will, muss er (glaube ich) 'COM0' angeben,> da das bei M$ immer um eins verschoben ist.
Das ist doch eher umgekehrt. Die Beschriftungen an Motherboards und
Einsteckkarten beziehen sich meist auf die alte DOS-Konvention mit COM1
als erstem Port. Unter unixoiden BS beginnt die Zählung jedoch mit 0,
z.B. /dev/ttyS0 == COM1.
Hallo,
erstmal danke für die Feedbacks. Ich habe es nun korrigiert. Nun wenn
ich es so ändere:
"ser = serial.Serial( port='COM1',..."
dann habe ich die gleiche Meldung wieder "error communicating..." . Wenn
ich es nun auf 'COM0' ändere dann bekomme ich eine menge von
Fehlermeldungen beim compilieren.
Gruß
Max
Max schrieb:> ser.write('\r')> ser.write('reboot')
Du verwendest offensichtlich Python 3. Dort sind die Strings '\r' und
'reboot' Unicode-Strings, mit denen pySerial nichts anzufangen weiß.
Nimm stattdessen Byte-Strings:
Noch ein paar Anmerkungen:
port='COM1' läuft nur auf Windows, port='/dev/ttyS0' nur auf Linux,
port=0 hingegen auf beidem. Die 0 wird von pySerial automatisch in den
richtigen Pseudodateinamen umgesetzt.
Das erste try-except sollte das Öffnen der Schnittstelle umschließen,
sonst steigt das Programm im Fehlerfall dort schon aus, ohne die von dir
vorgesehene Fehlermeldung auszugeben. Die Abfrage ser.isOpen() kannst du
dir dann sparen.
Die prints in den except-Zweigen sind beide fehlerhaft: Im ersten Fall
ist die Variable e undefiniert, im zweiten Fall hat die str-Funktion
kein Argument und liefert somit immer den Leerstring zurück.
Hier ist eine korrigierte Fassung des PRogramms:
Hallo Leute,
vieleicht noch eine kurze Frage:
Wie ist es in Python3 das lesen vom COM Port möglich?
ser.read('Waiting for connection','r')
anscheinend funktioniert es so nicht!
Gruß
Max
Max schrieb:> ser.read('Waiting for connection','r')>> anscheinend funktioniert es so nicht!
Wie kommst du darauf, dass das funktionieren könnte?
Die read-Methode erwartet 1 Integer-Argument, nämlich die Anzahl der zu
lesenden Bytes. Man darf dieses Argument auch weglassen, dann wird ein
Default von 1 genommen. Du übergibst stattdessen aber 2 Strings. Was
möchtest du damit überhaupt bezwecken?
Hier ist noch die Doku zu read:
1
Help on method read in module serial.serialposix:
2
3
read(self, size=1) method of serial.serialposix.Serial instance
4
Read size bytes from the serial port. If a timeout is set it may
5
return less characters as requested. With no timeout it will block