Python PySerial 读取行超时

11 投票
2 回答
37428 浏览
提问于 2025-04-16 02:30

我正在使用pyserial来和一个嵌入式设备进行通信。

ser = serial.Serial(PORT, BAUD, timeout = TOUT)
ser.write(CMD)
z = ser.readline(eol='\n')

我们向设备发送命令,然后设备会回复一个长度不固定的字符串,最后以一个'\n'结束。

如果设备没有回复,readline()就会超时,这时候z=''

如果设备在发送数据时被中断或者崩溃,readline()也会超时,这时z的值会是一个没有'\n'结尾的字符串。

有没有什么好的方法可以检查readline()是否超时,而不是单纯检查z的状态呢?

2 个回答

0

PySerial 有一个叫做 read_until 的方法,专门用来做这个事情。它会一直读取串口的数据,直到找到你预期的内容(默认是换行符‘\n’),或者读取的数据超过了设定的大小,或者超时了。

5

我觉得你可能想要做的是……

import re
import time
import serial

def doRead(ser,term):
    matcher = re.compile(term)    #gives you the ability to search for anything
    tic     = time.time()
    buff    = ser.read(128)
    # you can use if not ('\n' in buff) too if you don't like re
    while ((time.time() - tic) < tout) and (not matcher.search(buff)):
       buff += ser.read(128)

    return buff

if __name__ == "__main__":
    ser = serial.Serial(PORT, BAUD, timeout = TOUT)
    ser.write(CMD)
    print doRead(ser,term='\n')

撰写回答