是否可以实现pySerial,设备响应以回车符结束

时间:2018-03-07 02:25:02

标签: python python-3.x pyserial

我花了一段时间试图解释这里找到的解决方案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),所以任何批评都会受到赞赏。

2 个答案:

答案 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')