【发布时间】:2018-12-13 00:13:18
【问题描述】:
我正在尝试使用基于PySerial 库的以下代码读取写入串行端口的 JSON 字符串:
while True:
if serial_port.in_waiting > 0:
buffer = serial_port.readline()
print('buffer=', buffer)
ascii = buffer.decode('ascii')
print('ascii=', ascii)
我试图嗅探端口上的数据,并确保数据被完整写入而没有任何分散:
jpnevulator --ascii --tty "/dev/ttyACM1" --read
7B 22 30 22 3A 31 7D {"0":1}
7B 22 30 22 3A 32 7D {"0":2}
7B 22 30 22 3A 33 7D {"0":3}
7B 22 30 22 3A 34 7D {"0":4}
7B 22 30 22 3A 35 7D {"0":5}
7B 22 30 22 3A 36 7D {"0":6}
但是使用的代码导致读取的数据分散,因此显示如下结果:
buffer= b'{"0'
ascii= {"0
buffer= b'":1}'
ascii= ":1}
buffer= b'{"'
ascii= {"
buffer= b'0":2'
ascii= 0":2
buffer= b'}'
ascii= }
此外,当我使用 read() 而不是 readline() 时,我会得到相同的行为:
buffer= b'{'
data_str= {
buffer= b'"'
data_str= "
buffer= b'3'
data_str= 3
buffer= b'"'
data_str= "
buffer= b':'
data_str= :
buffer= b'1'
data_str= 1
buffer= b'}'
data_str= }
我什至尝试使用使用相同库的another code,但遇到了同样的问题。
我不确定我为什么会遇到这种行为。
【问题讨论】:
-
Readline() 可能不是您所追求的,因为您的数据似乎没有以换行符“\n”终止,因此请尝试使用 read() 代替,同样您可能也是不耐烦,当串口只接收到第一个字符时,它会说那里有数据,所以你的 buffer.decode 在只输入 1 或 2 个字符时可能会表现得很奇怪
-
@Reroute 正如我在编辑中指出的那样,使用
read()而不是解决问题。 -
正如@Reroute 在评论末尾所建议的那样。一旦有任何可用输入 (
.in_waiting > 0),您就会立即采取行动。你有什么办法可以告诉你有一个完整的“消息”然后才读?或者......您仍然可以逐个阅读,但您必须自己组装所需的内容......即收集到右括号,然后开始新的ascii。你输入的大小是固定的吗?那会让你的生活更轻松。 ;)
标签: python string io serial-port pyserial