自定协议,串口数据处理粘包方法


问题

处理串口数据过程中,当前后有连续的数据的情况下,很有可能出现数据粘包的情况。
如需要的数据是ef0001de002但是数据传输和接收过快产生粘包得到数据ef0001de00

处理思路(自定协议)

再数据包前增加1位或者2位的数据长度帧,通过先获取长度帧判断需要取的数据位。

参考代码

from .FingerProtocol import *
import serial
import time
from ._Types import *
from colorama import Fore, Style
__all__ = [
    "FingerManager",
]
class FingerManager:
    def __init__(self,serial_conn:serial.Serial) -> None:
        self.serial_conn = serial_conn
    def send_cmd(self, packet):
        """发送命令包"""
        self.serial_conn.write(packet)
        self.serial_conn.flush()
    def read_packet(self,timeout=2):
        """ 读取一个完整的数据包
            1. 读取包头9字节 (Header+Addr+ID+Len)
            2. 解析包长度 (大端)
            3. 读取剩余数据 (Len指定长度)
                1. 检查是否超时
                2. 读取数据
                3. 检查是否完整
        """
        data = b''
        start_time = time.time()
        # 1. 读取包头9字节 (Header+Addr+ID+Len)
        while len(data) < 9:
            if time.time() - start_time > timeout:
                return None
            if self.serial_conn.in_waiting > 0:
                data += self.serial_conn.read(min(9 - len(data), self.serial_conn.in_waiting))
            else:
                time.sleep(0.001)
        # 2. 解析包长度 (大端)
        pkg_len = (data[7] << 8) | data[8]
        # 3. 读取剩余数据 (Len指定长度)
        total_len = 9 + pkg_len
        while len(data) < total_len:
            if time.time() - start_time > timeout:
                return None
            if self.serial_conn.in_waiting > 0:
                data += self.serial_conn.read(min(total_len - len(data), self.serial_conn.in_waiting))
            else:
                time.sleep(0.001)
        return data

声明:一代明君的小屋|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 自定协议,串口数据处理粘包方法


欢迎来到我的小屋