如何从串口读取响应

时间:2018-07-05 13:33:50

标签: python python-3.x serial-port pyserial

我是python语言的新手

我有一个uart蓝牙加密狗,我在下面编写了此代码,并且write方法可以正常工作,因为我可以使用 gtkterm 软件

查看响应

代码:

import serial

ser = serial.Serial()
ser.baudrate = 115200
ser.port = '/dev/ttyUSB0'

ser.open()
print(ser.is_open)

ser.write(b'info\r\n')  # get info command 
ser.write(b'scan=00\r\n')  # start scan command

gtkterm 软件中显示的响应:

Device information
firmware: nrf_dongle
firmware_version: 0.2.5-ba519b3
firmware_build: 20180413-104249
device_name: amine
serial_number: a58f2080352ac55bd1850576df54
mac_address: d1850576df54
device_state: 1
adv_state: 0
scan_state: 0
END

@scan:d1850576df54,20fabb03c064,-71,2,30,0201041aff4c00021570996ffaa2c34f00b776a3852c4bbd790cb90006c2
@scan:d1850576df54,20fabb044b2c,-62,2,30,0201041aff4c000215023f3d601143013582ba2e1e1603bcb9ffff02e5c5
@scan:d1850576df54,20fabb044b51,-54,3,30,0201041aff4c000215023f3d601143013582ba2e1e1603bcb9ffff02c8c5
@scan:d1850576df54,20fabb044b2c,-62,2,30,0201041aff4c000215023f3d601143013582ba2e1e1603bcb9ffff02e5c5
.
.
.

所以我的问题是如何使用pyserial模块或任何其他方法读取此数据?

1 个答案:

答案 0 :(得分:1)

有很多方法可以解决此问题。首先,问题是-您是否想通过练习来实现每个细节?如果是这样,那么您可以实现一个将从串口一次读取一个字节的功能,如下所示:

def readline(port):
    message = ""
    byte = ""
    while True:
        byte = port.read()
        if byte == "\n":
            break
        message += byte
    return message

遇到换行符时它将停止从端口读取,并返回到目前为止的消息。但是请注意,这里存在一些问题(end-of-line字符始终为"\n"吗?如果read函数超时,该怎么办?)

此处是link to the documentation,涉及read函数的行为。请注意,如果Serial对象没有设置超时,则该函数将阻塞,这意味着它将等待来自串行端口的传入数据。

PySerial文档是有关该主题的重要信息来源-它们还提供了一个使用readline函数的示例,该示例考虑了与换行符不同(行尾字符)有关的问题。这是为您的示例重写的文档中的示例:

import serial
import io

ser = serial.Serial()
ser.baudrate = 115200
ser.port = '/dev/ttyUSB0'

ser.open()
print(ser.is_open)

sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))

sio.write(b'info\r\n')
sio.flush() # it is buffering. required to get the data out *now*
response = sio.readline()
print(response)

我强烈建议您查看PySerial模块随附的miniterm.py模块。尽管起初可能很困难,但在我看来这是习惯该库的很好的学习材料。