J'ai du mal à lire plus d'un caractère avec mon programme, je n'arrive pas à comprendre ce qui n'allait pas avec mon programme, car je suis très nouveau sur Python.
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()
voici les résultats que j'obtiens
connected to: COM5
1: 1
2: 2
3: 4
4: 3
5: 1
en fait je m'y attendais
connected to: COM5
1:12431
2:12431
quelque chose comme ce qui est mentionné ci-dessus, capable de lire plusieurs caractères en même temps, pas un par un.
Je vois quelques problèmes.
Premier:
ser.read () ne retourne qu'un octet à la fois.
Si vous spécifiez un nombre
ser.read(5)
il lira 5 octets (moins si le délai d'attente survient avant que 5 octets n'arrivent.)
Si vous savez que votre entrée se termine toujours correctement par des caractères EOL, meilleur moyen est d'utiliser
ser.readline()
Cela continuera à lire les caractères jusqu'à ce qu'un EOL soit reçu.
Seconde:
Même si vous demandez à ser.read () ou ser.readline () de renvoyer plusieurs octets, Étant donné que vous effectuez une itération sur la valeur renvoyée, vous devrez toujours le traiter octet par octet.
Débarasse-toi du
for line in ser.read():
et juste dire:
line = ser.readline()
Série envoie des données 8 bits à la fois, ce qui se traduit par 1 octet et 1 octet signifie 1 caractère.
Vous devez implémenter votre propre méthode, capable de lire les caractères dans une mémoire tampon jusqu'à atteindre une certaine sentinelle. La convention consiste à envoyer un message du type 12431\n
indiquant une ligne.
Vous devez donc implémenter un tampon qui stockera un nombre X de caractères. Dès que vous atteignez ce \n
, effectuez votre opération sur la ligne et lisez la ligne suivante dans le tampon.
Notevous devrez vous occuper des cas de dépassement de tampon, c'est-à-dire quand une ligne reçue est plus longue que votre tampon, etc.
MODIFIER
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()
J'utilise cette petite méthode pour lire le moniteur série Arduino avec Python
import serial
ser = serial.Serial("COM11", 9600)
while True:
cc=str(ser.readline())
print(cc[2:][:-5])
Je recevais une date de mon arduino uno (0-1023 numéros) . En utilisant le code de 1337holiday, jwygralak67 et quelques astuces d'autres sources
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()