我有一个串口设备,我正在尝试从中读取输入.我发送了一个字符串"ID\r \n",它返回"ID XX\r"(其中\ r是ASCII回车,十六进制0x0d).
由于不再支持serial.readline上的eol选项,我使用TextIOWrapper从串口读取并一次返回一行.
我的问题是,它不会在看到回车后立即返回我的字符串,而是等到我打开串口时设置的超时时间的两倍.我希望它在读取整行后立即返回字符串,因为我可能有数百个命令发送到设备,我不想每次都等待超时.如果我超时设置为0,然后我得到根本没有输出(大概是因为我的脚本将停止等待的设备有机会输出任何东西前),如果我超时设置为无,脚本块,直到永远.
这是一个简单的测试脚本:
import serial
import io
import time
ser = serial.Serial("/dev/ttyUSB0", baudrate=9600,
bytesize=8, parity='N', stopbits=1,
xonxoff=0, rtscts=1, timeout=5)
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser),
newline=None)
sio.write(unicode("ID\r"))
sio.flush()
print "reading..."
x = sio.readline()
print len(x)
print x
Run Code Online (Sandbox Code Playgroud)
脚本始终需要10秒钟才能显示"读取",直到打印出从串行端口读取的"ID XX"字符串.
我确定设备正在输出回车,因为我使用了strace来观察读数:
select(4, [3], [], [], {5, 0}) = 1 (in [3], left {4, 991704})
read(3, "I", 8192) = 1
select(4, [3], [], [], {5, 0}) = 1 (in [3], left {4, 999267})
read(3, "D", 8191) = 1
select(4, [3], …Run Code Online (Sandbox Code Playgroud)