如何读取串口响应
How to read the response from serial port
我是 python 语言的新手
我有一个 uart 蓝牙加密狗,我在下面编写了这段代码并且写入方法工作正常,因为我可以使用 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 模块或任何其他方法读取这些数据?
有很多方法可以解决这个问题。首先的问题是——你想自己实施每个细节作为练习吗?如果是这样,那么您可以实现一个函数,一次从串行端口读取一个字节,如下所示:
def readline(port):
message = ""
byte = ""
while True:
byte = port.read()
if byte == "\n":
break
message += byte
return message
当遇到换行符和return到此为止的消息时,它将停止从端口读取。但是要注意这里有一些问题(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
模块。虽然一开始可能很难,但在我看来,这是一个很好的学习来源 material 来习惯这个库。
我是 python 语言的新手
我有一个 uart 蓝牙加密狗,我在下面编写了这段代码并且写入方法工作正常,因为我可以使用 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 模块或任何其他方法读取这些数据?
有很多方法可以解决这个问题。首先的问题是——你想自己实施每个细节作为练习吗?如果是这样,那么您可以实现一个函数,一次从串行端口读取一个字节,如下所示:
def readline(port):
message = ""
byte = ""
while True:
byte = port.read()
if byte == "\n":
break
message += byte
return message
当遇到换行符和return到此为止的消息时,它将停止从端口读取。但是要注意这里有一些问题(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
模块。虽然一开始可能很难,但在我看来,这是一个很好的学习来源 material 来习惯这个库。