6种串口协议的实现

》》串口协议开发
	以下解析范式都是采用数据队列的形似来存储,并且根据设备运行速度差异,还需增加数据包队列来存储解析完毕的数据包

1.范式一《固定长度》无校验
		
		0x6B----------20字节--------0xB6
		上面数据中有一个帧头0x6B,帧尾0xB6,中间数据20个。
		每次数据要找到帧头0x6B才开始存储,读取完22个字节后结束储存,并判断最后一个字节是否为0xB6.
		
		这种范式如果出现误码,整个包就会变成错误包,会比较危险。

1.范式二《固定长度》有校验
		
		0x6B----------20字节--------校验-0xB6
		上面数据中有一个帧头0x6B,帧尾0xB6,中间数据20个,帧尾前面有一个校验码。
		每次数据要找到帧头0x6B才开始存储,读取完23个字节后结束储存,并判断最后一个字节是否为0xB6.
		并且判断校验码。
		
		这种范式解决上述出现的误码问题。

1.范式三《不固定长度》无校验
		
		0x6B----------N字节---------0xB6
		上面数据中有一个帧头0x6B,帧尾0xB6,中间数据N个,帧尾前面有一个校验码。
		每次数据要找到帧头0x6B才开始存储,读取到0xB6后结束储存,并判断最后一个字节是否为0xB6.
		
		
		这种范式会出现错误解包的问题,例如数据中出现了0xB6的数据,这个包就丢了。
		依然会有误码的问题。

1.范式四《不固定长度》有校验
		
		0x6B----------N字节--------校验-0xB6
		上面数据中有一个帧头0x6B,帧尾0xB6,中间数据N个,帧尾前面有一个校验码。
		每次数据要找到帧头0x6B才开始存储,读取到0xB6后结束储存,并判断最后一个字节是否为0xB6.
		并且判断校验码。
		
		这种范式解决上述出现的误码问题。
		这种范式会出现错误解包的问题,例如数据中出现了0xB6的数据,这个包就丢了。

1.范式五《不固定长度》有校验,加入转义字符
		
		0x6B----------N字节--------校验-0xB6

		如果数据中有0xB6数据,那么数据包就被提前结束了,并不是我们想要的数据。
		这里需要加入转义字符

		0xB6   ->		0xBf,0x01
		0xBf   ->		0xBf,0x02

		上面数据中有一个帧头0x6B,帧尾0xB6,中间数据N个,帧尾前面有一个校验码。
		每次数据要找到帧头0x6B才开始存储,读取到0xB6后结束储存,并判断最后一个字节是否为0xB6.
		并且判断校验码。
		需要去解析特定的转义字符
		
		这种范式解决上述出现的误码问题。
		这种范式不会出现错误解包的问题。

1.范式6《不固定长度》有校验
		
		0x6B-0xB6-N数据长度---------N字节--------校验

		上面数据中有一个帧头0x6B,0xB6,数据长度,中间数据N个,校验码。
		每次数据要找到帧头0x6B才开始存储,读取到数据长度后读取对应长度,再读取一个校验码。

		判断校验码即可。
		
		这种范式解决上述出现的误码问题。
		这种范式不会出现错误解包的问题。


2018-2-13:

以上都是单帧头,为了保证安全最好使用双帧头,三帧头,四帧头。根据实际情况而定。




  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用QT串口助手实现协议解析的步骤: 1.打开QT串口助手,连接串口设备。 2.在串口助手中设置协议解析规则,例如:以“#”作为帧头,“\r\n”作为帧尾,第1-2个字节表示数据长度,第3个字节表示命令类型,第4-5个字节表示数据内容。 3.在串口助手中接收到数据后,根据协议解析规则进行解析,提取出数据内容并进行处理。 4.将处理后的数据显示在串口助手的界面上或者发送给其他设备。 下面是一个简单的QT串口助手协议解析的示例代码: ```python # 导入必要的模块 from PyQt5.QtCore import QIODevice, QByteArray from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo # 定义协议解析规则 FRAME_HEAD = b'#' FRAME_TAIL = b'\r\n' DATA_LEN_INDEX = 0 CMD_TYPE_INDEX = 2 DATA_CONTENT_INDEX = 3 # 定义串口助手类 class SerialHelper: def __init__(self): self.serial = QSerialPort() self.serial.readyRead.connect(self.receive_data) # 打开串口 def open_serial(self, port_name, baud_rate): self.serial.setPortName(port_name) self.serial.setBaudRate(baud_rate) self.serial.setDataBits(QSerialPort.Data8) self.serial.setParity(QSerialPort.NoParity) self.serial.setStopBits(QSerialPort.OneStop) self.serial.setFlowControl(QSerialPort.NoFlowControl) if self.serial.open(QIODevice.ReadWrite): return True else: return False # 关闭串口 def close_serial(self): self.serial.close() # 发送数据 def send_data(self, data): self.serial.write(data) # 接收数据 def receive_data(self): data = self.serial.readAll() if data: self.parse_data(data) # 解析数据 def parse_data(self, data): frame_head_pos = data.indexOf(FRAME_HEAD) frame_tail_pos = data.indexOf(FRAME_TAIL) if frame_head_pos != -1 and frame_tail_pos != -1 and frame_tail_pos > frame_head_pos: data_len = data[DATA_LEN_INDEX:CMD_TYPE_INDEX] cmd_type = data[CMD_TYPE_INDEX] data_content = data[DATA_CONTENT_INDEX:frame_tail_pos] # 处理数据内容 print(data_content) ``` 相关问题:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值