我花了一段时间试图解释这里找到的解决方案pySerial 2.6: specify end-of-line in readline()和Line buffered serial input,但对于我的生活,我似乎无法快速地#34;与我的一个压力监视器进行通信,这些压力监视器回复时以回车字符终止的响应(' \ r')
我可以可靠地与设备通信,但在定义串口时,它总是受到超时参数的限制。我可以看到设备实际上是使用传统方法显示的\ r \ n字符响应。当使用io.TextIOWrapper时,我得到了剪切终止字符所需的功能,但它仍然是超时作为原始方法。
我的python代码如下:
import serial,io,timeit
cmd = b'#0002UAUX1\r'
ser = serial.Serial(port='COM4',baudrate=9600,timeout=1)
def readline1(ser):
return(ser.readline())
def readline2(ser):
sio = io.TextIOWrapper(io.BufferedRWPair(ser,ser,1),newline='\r')
return(sio.readline().encode())
def readline3(ser):
out = b''
while True:
ch = ser.read()
out += ch
if(ch == b'\r' or ch == b''):
break
return(out)
def timer(func):
tic = timeit.default_timer()
ser.write(cmd)
print(func())
toc = timeit.default_timer()
print('%0.2f seconds' % (toc-tic))
for func in (readline1,readline3,readline2):
timer(lambda : func(ser))
我的shell响应是:
b'>3.066E-02\r'
1.03 seconds
b'>3.066E-02\r'
0.02 seconds
b'>3.066E-02\r'
1.06 seconds
所有方法都返回相同的输出,但readline3运行得更快,因为它没有超时。我不明白为什么它不像
那么容易ser.readline(eol='\r')
P.S。我对python很新(严重依赖于MATLAB),所以任何批评都会受到赞赏。
答案 0 :(得分:0)
在Python3.x中,字符串中的前缀b''表示它正在显示为字节类型的实例,这意味着它将忽略为其目的显示诸如转义序列之类的内容,'\ n'将是显示到终端代替新行。
如果使用命令print('Hello \ r \ n \ nWorld'),它将显示 你好 世界 ,而不是'Hello \ r \ nWorld',但print(b'Hello \ r \ nWorld')或print(repr('Hello \ r \ n \ nWorld'))将显示'Hello \ r \ nWorld'。
要查看rwSerial1中的情况是否使用print(repr(out))替换print(out),它应显示包含所有字符的字符串。
答案 1 :(得分:-1)
事实证明答案是:
ser.read_until(b'\r')