2013-04-18 14 views
11

Mam problem z czytaniem więcej niż jednej postaci przy użyciu mojego programu, nie mogę się domyślić, co poszło nie tak z moim programem , ponieważ jestem bardzo nowy w python.Python Serial: Jak korzystać z funkcji read lub readline, aby przeczytać więcej niż 1 znak na raz

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

oto wyniki i dostać

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

faktycznie spodziewałem się tego

connected to: COM5 
1:12431 
2:12431 

coś jak wspomniano powyżej, który jest w stanie odczytać wiele znaków w tym samym czasie nie jeden przez jeden.

Odpowiedz

3

Szeregowy wysyła 8 bitów na raz, co przekłada się na 1 bajt, a 1 bajt oznacza 1 znak.

Musisz zaimplementować własną metodę, która będzie odczytywała znaki w buforze, dopóki nie zostanie osiągnięty jakiś wartownik. Konwencja polega na wysłaniu komunikatu, na przykład 12431\n, wskazującego jedną linię.

Musisz więc zaimplementować bufor, w którym będzie przechowywana X liczba znaków i jak tylko dotrzesz do \n, przeprowadź operację na linii i przejdź do następnego wiersza w buforze.

Uwaga trzeba będzie zadbać o buforowych przypadkach przelewowych czyli gdy odbierany jest linia, która jest dłuższa niż bufor etc ...

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

Hi, możesz dać mi jakieś wytyczne dotyczące buforowania? Naprawdę jestem teraz zdezorientowany. – user2294001

+0

Edytowałem kod, spójrz. Po prostu zapamiętaj jedną rzecz, powyższy kod będzie KEEP odczytywał do tablicy 'line', dopóki nie zobaczy znaku' \ n', więc upewnij się, że w twoim urządzeniu szeregowym wysłano '\ n'. – 1337holiday

+0

Witam, powyższe kody nie działają. mówi, że char nie jest zdefiniowany. – user2294001

21

Widzę kilka problemów.

pierwsze:

ser.read() jest tylko zamiar powrócić 1 bajt na raz.

Jeśli podasz liczbę

ser.read(5) 

będzie czytać 5 bajtów (mniej, jeśli limit czasu occurrs przed 5 bajtów przybyć.)

Jeśli wiesz, że Twój wkład jest zawsze prawidłowo zakończone znaków EOL, lepszym sposobem jest użycie

ser.readline() 

że będzie nadal czytać znaki, aż zostanie odebrana EOL.

drugie:

Nawet jeśli masz ser.read() lub ser.readline(), aby powrócić kilka bajtów, ponieważ jesteś iteracji nad wartością powrotnej, będzie nadal przenoszenia go na jeden bajt czas.

Pozbyć się

for line in ser.read(): 

i po prostu powiedzieć:

line = ser.readline() 
+0

Witam, kiedy używam linii = ser.readline(), zawsze pytam mnie o wydruk liczby całkowitej (str (count) + str (':') + chr (linia)) TypeError: liczba całkowita jest wymagana – user2294001

+0

chr (linia) oczekuje argumentu całkowitego. Dajesz mu ciąg. – jwygralak67

1

byłem reciving jakąś datę z mojego Arduino UNO (0-1023 numery). Korzystanie kod z 1337holiday, jwygralak67 i kilka porad z innych źródeł:

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

Myślę, że twój komentarz #convert z ansii powinien być #convert z ascii –

+0

@NatoSaichek tak, masz rację, dziękuję! – Desprit