我是在树莓派上跑Python程序,获取树莓派的串口数据,从网上找了模板直接ctrl c、ctrl v拿来就想用,结果发现一个严重的问题,串口可以读取到数据但是数据总是只能获取到一部分,后面的半截就丢了,整个读出来的数据完全没法看.
我从网上找的代码大多是这样的


然后我参考这种格式写了一个,发现总是丢数据,半段半段就没了,非常奇怪,不论是ttyAMA0、ttyS0还是USB都是这样的。
在搞了好几天,改了好几个地方之后,终于找到一个还算是好使的写法:

代码放在这里:
mser_device.flushInput()
while True:
try:
#mser_device.flushInput() # 不要随意flushInput 容易导致数据丢失
res = mser_device.read_all()
if len(res) != 0:
print(res)
实际测试发现读出来的数据还是一段一段的,但是好在可以稳定的把所有数据都拿出来,我们需要做的就是将被打断的数据重新拼接为一个完整的数据。

具体拼接的时候需要数据本身带有数据帧头标志数据开始,然后还需要数据帧尾标志数据结束(或者知道数据帧长度也可以)。
比如我这里是知道数据帧的帧头和帧尾,我这样就可以把数据重新拼接起来:
def read_serial_info():
serial_tmp = b''
serial_rece_tmp = b'' #因为收到的数据是二进制数据,所以用一个空的b''接收
mser_device.flushInput()
while True:
try:
#mser_device.flushInput() # 不要随意flushInput 容易导致数据丢失
res = mser_device.read_all()
if len(res) != 0:
print(res)
# 板子的回复提示 [- recv -] ============================================
if (res[0] == 91 and res[1] == 45): # 帧头为[-
serial_rece_tmp = res
elif(res[-1] == 93 and res[-2] == 45): # 帧尾为 -]
if (serial_rece_tmp[0] == 91 and serial_rece_tmp[1] == 45):
serial_rece_tmp = serial_rece_tmp + res
if len(serial_rece_tmp) != 0:
if serial_rece_tmp[-1] == 93 and serial_rece_tmp[-2] == 45 : # 格式判别正确后对数据处理
from_serial_info_array.append(serial_rece_tmp)
serial_rece_tmp = b''
continue
# ========================================================================