2013-04-18 4 views
11

Ho problemi a leggere più di un personaggio utilizzando il mio programma, non riesco a capire cosa è andato storto con il mio programma , come sono molto nuovo per Python.Seriale Python: Come utilizzare la funzione di lettura o readline per leggere più di 1 carattere alla volta

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

qui sono i risultati che ottengo

connected to: COM5 
1: 1 
2: 2 
3: 4 
4: 3 
5: 1 

in realtà mi aspettavo questa

connected to: COM5 
1:12431 
2:12431 

qualcosa di simile a quanto sopra citato, che è in grado di leggere più personaggi allo stesso tempo non uno per uno.

risposta

3

La serie invia 8 bit di dati alla volta, che si traduce in 1 byte e 1 byte in 1 carattere.

È necessario implementare il proprio metodo in grado di leggere i caratteri in un buffer fino a quando non viene raggiunta una sentinella. La convenzione è inviare un messaggio come 12431\n indicando una riga.

Quindi quello che devi fare è implementare un buffer che memorizzerà il numero X di caratteri e non appena lo raggiungi \n, esegui l'operazione sulla linea e procedi a leggere la riga successiva nel buffer.

Nota si dovrà prendere cura di casi di buffer overflow ad esempio quando una linea viene ricevuto questo è superiore a buffer ecc ...

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: " + line) 
      line = [] 
      break 

ser.close() 
+0

Salve, potrebbe darmi qualche guida sul buffer? Sono davvero confuso adesso. – user2294001

+0

Ho modificato il codice, dai un'occhiata. Ricorda solo una cosa: il codice qui sopra manterrà la lettura nella matrice 'line' finché non vedrà un carattere' \ n', quindi assicurati che nel tuo dispositivo seriale venga inviato un '\ n'. – 1337holiday

+0

Ciao, i codici non sembra funzionare. dice che il char non è definito. – user2294001

21

Vedo un paio di problemi.

Primo:

ser.read() è solo andare a ritornare 1 byte alla volta.

Se si specifica un conteggio

ser.read(5) 

si leggerà 5 byte (meno se timeout occurrs prima di 5 byte arrivano.)

Se sapete che il vostro ingresso sia sempre correttamente terminato con caratteri EOL, modo migliore è quello di utilizzare

ser.readline() 

che continuerà a leggere i caratteri fino a quando viene ricevuto un EOL.

Secondo:

Anche se si ottiene ser.read() o ser.readline() per restituire più byte, dal momento che si effettua l'iterazione il valore di ritorno, si ancora essere maneggiarlo un byte alla un tempo.

Sbarazzarsi della

for line in ser.read(): 

e solo dire:

line = ser.readline() 
+0

Ciao, quando sto usando line = ser.readline(), mi chiede sempre una stampa intera (str (count) + str (':') + chr (linea)) TypeError: è richiesto un numero intero – user2294001

+0

chr (linea) si aspetta un argomento intero. Gli stai dando una stringa. – jwygralak67

1

stavo reciving una data dal mio Arduino Uno (0-1023 numeri). Usando il codice da 1337holiday, jwygralak67 e alcuni suggerimenti da altre fonti:

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

Penso che il tuo commento #convert da ansii dovrebbe essere # convertito da ascii –

+0

@NatoSaichek sì, hai ragione, grazie! – Desprit

Problemi correlati