我会努力解决这个问题的。:)循环等待任何输入可用serial_port.in_waiting > 0。因此你所看到的行为。一旦可以获取任何内容,就会开始读取。似乎PySerial没有任何额外的抽象可以让您知道,比如最后一个readed byte将是一个ASCII大括号字符(我实际上刚刚浏览了文档)。您总是可以在Python脚本中应用一个通用的解决方案,让它变得有意义。在
先问一个问题。您的输入示例建议您处理同样大小的string/JSON?我们真的应该那么幸运吗?如果是这样的话,您可以等到这个或更多字节可用,然后将所需的大小读入buffer。在
否则,您的代码将发生变化:buffer = bytes() # .read() returns bytes right?
while True:
if serial_port.in_waiting > 0:
buffer += serial_port.read(serial_port.in_waiting)
try:
complete = buffer[:buffer.index(b'}')+1] # get up to '}'
buffer = buffer[buffer.index(b'}')+1:] # leave the rest in buffer
except ValueError:
continue # Go back and keep reading
print('buffer=', complete)
ascii = buffer.decode('ascii')
print('ascii=', ascii)
注1:我推测serial_port.in_waiting在理论上可以在if和read之间改变,但我也假设未读字节只是停留在缓冲区中,我们没事。在
注2:这种方法有点幼稚,没有考虑到您也可以读取两段JSON代码。在
注3:如果是这样的话,它也不考虑JSON中的嵌套映射。在
希望还是有用的。底线。除非处理固定大小的输入或使用任何其他方法让pySerial按需要将内容分块提供给您,否则您必须读入内容并在脚本中进行处理。在
更新:在评论中反映讨论。在
你真正的问题是你只是在看串行端口上的字节流。在这个层次上,对传递的数据没有任何有用的理解。您需要一个更高的层次(应用程序或中间层)来理解即将到来的内容。换句话说,解析封装传输数据的协议。在
事实上,如果我们知道代表JSON的字符串(字节束)是通过的(服务器作为协议,封装/表示数据(结构)的方式),那就可以工作了,但是重组需要在原始串行通信之上进行。我们的应用程序(或库/模块)可以读取原始的串行数据,使其有意义,并将它们提供给更高级别。在