小编Joh*_*nny的帖子

线路缓冲串行输入

我有一个串口设备,我正在尝试从中读取输入.我发送了一个字符串"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)

python io serial-port

7
推荐指数
2
解决办法
1万
查看次数

标签 统计

io ×1

python ×1

serial-port ×1