web-dev-qa-db-fra.com

Série Python: comment utiliser la fonction read ou readline pour lire plus d'un caractère à la fois

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.

14
user2294001

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

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

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

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