web-dev-qa-db-de.com

Python Serial: Verwendung der Funktion read oder readline zum Lesen von mehr als 1 Zeichen gleichzeitig

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.

14
user2294001

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()
23
jwygralak67

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()
8
1337holiday

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])
4

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()
1
Desprit