从python中的串口读取数据时出现问题

时间:2011-03-21 03:58:56

标签: python serial-port device

我有一个python程序试图从串口读取14个字节 来得很慢。我想要捕获a中的所有字节 字节组[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()

这是我所期待的:line(1)= 0~88.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 个答案:

答案 0 :(得分:4)

PySerial的API文档说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

答案 1 :(得分:2)

试试这个:

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()功能,您可能也会感兴趣。此外,强调ser.readlines()中的 s ,与.readline()不同。

答案 2 :(得分:-1)

更改波特率。

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

兼容波特率。

获取14字节数据:

data = ser.read(size=14)