Python 串行 (pySerial) 使用 EOL \\r 而不是 \\n 读取行

新手上路,请多包涵

我正在通过 RS232 电缆与 SR830 锁定放大器通信。读取数据时如下代码:

 import serial

def main():
    ser = serial.Serial(
        port='COM6',
        baudrate=19200,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS)
    ser.timeout=1
    ser.write("OUTP? 1 \r\n".encode()) #Asks the Lock-in for x-value
    ser.write("++read\r\n".encode())
    x=ser.readline()
    print (x)
if __name__ == '__main__': main()

我得到一个像 b'-3.7486e-008\r' 这样的字节串。但是 ser.readline() 函数无法将 \r 识别为 EOL。所以我每次读取数据都要等待超时,这样会很麻烦,因为我想尽可能快地取很多点。而且数字的长度变化很大,所以我不能只使用 ser.read(12) 例如。我试过使用 io.TextIOWrapper 但我不清楚如何实现它。这是我的尝试:

 import serial
import io
def main():
    ser = serial.Serial(
        port='COM6',
        baudrate=19200,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS)
    ser.timeout=1
    sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))
    sio.write("OUTP? 1 \r\n") #Asks the Lock-in for x-value
    sio.write("++read\r\n")
    x=sio.readline()
    print (x)
if __name__ == '__main__': main()

这只是打印一个空格。任何帮助将不胜感激,谢谢。

编辑:这是答案后我的工作代码,使用循环:

 import serial
def main():
    ser = serial.Serial(
        port='COM6',
        baudrate=19200,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS)
    ser.timeout=5
    ser.write("OUTP? 1 \r\n".encode()) #Asks the Lock-in for x-value
    ser.write("++read\r\n".encode())
    buffer = ""
    while True:
        oneByte = ser.read(1)
        if oneByte == b"\r":    #method should returns bytes
            print (buffer)
            break
        else:
            buffer += oneByte.decode()
if __name__ == '__main__': main()

原文由 Calum Beck 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

使用简单循环进行阅读怎么样?

 def readData():
    buffer = ""
    while True:
        oneByte = ser.read(1)
        if oneByte == b"\r":    #method should returns bytes
            return buffer
        else:
            buffer += oneByte.decode("ascii")

您可以查看 Pyserial 包中的 serialutil.py 文件,它们使用相同的方式实现方法 read_until

原文由 Erik Šťastný 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 Serial.read_until() 代替:

 ser.read_until(b'\r')

注意:不要忘记 b 指定字节对象而不是标准字符串。否则,即使它读取了 '\r' ,函数也会阻塞直到连接超时。

原文由 Girl Spider 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题