Ich habe Probleme, mehr als einen Charakter mit meinem Programm zu lesen. Ich kann nicht herausfinden, was mit meinem Programm schief gelaufen ist, da ich mit Python sehr neu bin.
import serial
ser = serial.Serial(
port='COM5',\
baudrate=9600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
timeout=0)
print("connected to: " + ser.portstr)
count=1
while True:
for line in ser.read():
print(str(count) + str(': ') + chr(line) )
count = count+1
ser.close()
hier sind die Ergebnisse, die ich bekomme
connected to: COM5
1: 1
2: 2
3: 4
4: 3
5: 1
eigentlich habe ich das erwartet
connected to: COM5
1:12431
2:12431
so etwas wie das oben genannte, das mehrere Zeichen gleichzeitig lesen kann, nicht nacheinander.
Ich sehe ein paar Probleme.
Zuerst:
ser.read () gibt nur jeweils 1 Byte zurück.
Wenn Sie eine Anzahl angeben
ser.read(5)
es liest 5 Bytes (weniger, wenn ein Timeout auftritt, bevor 5 Bytes ankommen.)
Wenn Sie wissen, dass Ihre Eingabe immer ordnungsgemäß mit EOL-Zeichen abgeschlossen wird, besserer Weg ist zu verwenden
ser.readline()
Dadurch werden weiterhin Zeichen gelesen, bis eine EOL empfangen wird.
Zweite:
Selbst wenn Sie ser.read () oder ser.readline () erhalten, um mehrere Bytes zurückzugeben, Da Sie den Rückgabewert iterieren, behandeln Sie Immer noch ein Byte.
Loswerden
for line in ser.read():
und sag einfach:
line = ser.readline()
Serial sendet Daten mit jeweils 8 Bits, dh 1 Byte und 1 Byte bedeutet 1 Zeichen.
Sie müssen Ihre eigene Methode implementieren, die Zeichen in einen Puffer lesen kann, bis ein bestimmter Wächter erreicht wird. Die Konvention besteht darin, eine Nachricht wie 12431\n
zu senden, die eine Zeile angibt.
Sie müssen also einen Puffer implementieren, der X Anzahl der Zeichen speichert. Sobald Sie \n
erreicht haben, führen Sie die Operation in der Zeile aus und lesen die nächste Zeile in den Puffer.
NoteSie müssen sich um Pufferüberlauffälle kümmern, d. H. Wenn eine Leitung empfangen wird, die länger ist als Ihr Puffer usw.
EDIT
import serial
ser = serial.Serial(
port='COM5',\
baudrate=9600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
timeout=0)
print("connected to: " + ser.portstr)
#this will store the line
line = []
while True:
for c in ser.read():
line.append(c)
if c == '\n':
print("Line: " + ''.join(line))
line = []
break
ser.close()
Ich verwende diese kleine Methode, um den seriellen Arduino-Monitor mit Python zu lesen
import serial
ser = serial.Serial("COM11", 9600)
while True:
cc=str(ser.readline())
print(cc[2:][:-5])
Ich erhielt ein Datum aus meinem arduino uno (0-1023-Nummern) ... mit Code von 1337holiday, jwygralak67 und ein paar Tipps aus anderen Quellen:
import serial
import time
ser = serial.Serial(
port='COM4',\
baudrate=9600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
timeout=0)
print("connected to: " + ser.portstr)
#this will store the line
seq = []
count = 1
while True:
for c in ser.read():
seq.append(chr(c)) #convert from ANSII
joined_seq = ''.join(str(v) for v in seq) #Make a string from array
if chr(c) == '\n':
print("Line " + str(count) + ': ' + joined_seq)
seq = []
count += 1
break
ser.close()