Проблема чтения данных из последовательного порта в Python - PullRequest
0 голосов
/ 21 марта 2011

У меня есть программа на Python, которая пытается прочитать 14 байтов с последовательного порта, который прибывают очень медленно. Я хочу, чтобы захватить все байты в ByteArray [14]. Я понимаю, что есть новые функции байтового массива в Python 3.0, но У меня работает только Python 2.6.6. Обновление может иметь неожиданные последствия, поэтому я должен придерживаться 2.6.6.

Данные только периодически проходят через последовательный порт. Я получаю одно сообщение на порт может быть каждые 2 минуты или около того. Эти данные текут очень медленно. Я вижу проблему что мой код не может считывать данные по одному байту за раз. Я хочу создать это данные ровно в 14 байтах, затем обрабатывают данные и начинают заново с новыми 14 байт.

Я принимаю здесь неправильный подход? Совет

    ser = serial.Serial('/dev/ttyUSB1', 1200, timeout=0)
    ser.open()
    print "connected to: " + ser.portstr
    count=0
    while True:
        line =ser.readline(size=14) # should block, not take anything less than 14 bytes
        if line:
            # Here I want to process 14 bytes worth of data and have
            # the data be consistent.
            print "line(" + str(count) + ")=" + line
            count=count+1
    ser.close()

Вот что я ожидаю: строка (1) = 0 ~ 888.ABC / заканчивается возвратом каретки

---------- начать вывод ------

line(0)=0
line(1)=~ ??1. ABC �    # here get some multiple bytes and stuff gets out of synch

�ine(2)=
line(3)=0
line(4)=~
line(5)= 
line(6)=8
line(7)=8
line(8)=8
line(9)=.
line(10)= 
line(11)=A
line(12)=B
line(13)=C
line(14)= 
line(15)=�
line(16)=

#...
line(48)=
line(49)=�
line(50)=0
line(51)=~
line(52)= 
line(53)=8
line(54)=8
line(55)=8
line(56)=.
line(57)= 
line(58)=A
line(59)=B
line(60)=C
line(61)= 
line(62)=�
line(63)=

line(64)=

---------- конечный вывод ------

Ответы [ 3 ]

4 голосов
/ 21 марта 2011

Документация API для PySerial гласит: readline () читает до \ n или до достижения размера. Однако функция read () сообщает, что будет блокироваться, пока не будет достигнут размер. Обе эти функции говорят, что вернутся рано, если установлен тайм-аут.

Possible values for the parameter timeout:

timeout = None: wait forever
timeout = 0: non-blocking mode (return immediately on read)
timeout = x: set timeout to x seconds (float allowed)

Возможно, попробуйте timeout=None вместо timeout=0

2 голосов
/ 26 января 2012

Попробуйте это:

ser = Serial('/dev/ttyUSB1', 1200, timeout=0)
print "connected to: " + ser.portstr
count=0
while True:
     for line in ser.readlines()   
          print "line(" + str(count) + ")=" + line
          count=count+1

ser.close()   

Вам также может быть интересна функция line.strip(), если вы ее не использовали. Кроме того, акцент на s в ser.readlines(), отличается от .readline().

0 голосов
/ 08 мая 2014

Измените скорость передачи.

ser = serial.Serial('/dev/ttyUSB1', 9600, timeout=0)

на совместимую скорость передачи.

Для получения 14-байтовых данных:

data = ser.read(size=14)
...