原创文章,禁止转载
很久没有更新文章了,来两篇硬核点的自定义协议,不接受转载,仅做笔记备忘~
在数据传输过程中,数据的安全传输是非常非常重要的,比如TIP/IP七层模型,每一层模型中都需要遵守对应的协议,它有着严格的标准,无规矩不成方圆。只有所有的设备厂商,软件开发者,和上层应用都遵守同一套标准协议,数据才能完整、安全地传输。
举个例子,在发起一次HTTP请求时,需要TCP经过三次/四次握手的阶段,注意:三次挥手与四次握手是在TCP中进行的!而不是HTTP!
如图:
TCP三次握手的目的,是为了解决UDP传输不可靠缺点,因为它能保证数据准确到达客户端设备,这里不介绍TCP三次握手的具体步骤,而是通过这个例子来说明,数据传输过程中,安全性是最重要的。而如何确保数据的安全传输,就需要有特定的协议来规范数据。
前些时间,遇到了一个产品上报的数据时不时就会出错的情况,经过仔细排查之后发现,是串口收发的数据存在丢包的情况,但是在测试时却很难复现,猜测可能是在实际环境中存在干扰所致,所以问题也就很简单:给串口传输加一层协议。也就是本篇文章的重点,自定义串口协议的实现。
多数情况下,工业应用中串口设备传输的数据,都是以16进制字节流的形式,而不会传输string
字符串,当然string
在ASIIC码中也是以字节表示。但是如果你直接使用string
对数据进行描述的话,产品被人抄袭或破解的可能性就会大大增加,所以这也是有安全性考虑的。
遵循商业保密的原则,下图所示的串口协议均为本人自行定义,网上类似文章很多,不参与深入讨论。且文中所有代码均只做示范参考,点到为止。写本篇文章的目的也仅仅作为自己的技术笔记,本人对此文拥有绝对解释权利,禁止一切形式转载与盗用,必要情况下会对此文章进行加密。
如上图,一帧串口数据可以分为起始位,包长,报文类型,数据长度,数据域,校验和还有结束位
。
在 C 实现中,可以将一帧数据包定义为一个结构体;
我们知道,串口数据是要通过串口中断进行接收的,但是在中断中是不能运行占时间的处理程序的,所以,数据处理函数千万不要放在串口中断中,一定要等到串口接收完成之后,再跳转到数据接收函数
,也就是说:在串口中断中,先将所有数据收进串口FIFO,同时标志位置位,再另开线程通过判断标志位的方法,去处理接收进来的数据,此时的数据是完整收进来了的。
串口接收进程示例:
这个程序的核心在于,串口接收进程的处理上,按字节处理,通过数组进行偏移,同时需要特别注意的是:串口接收Buff(FIFO)数组,与协议解析Buff数组 不要混用同一个!
这是很多新手容易忽视的一个细节,因为串口中断接收与协议解析,几乎是同时正在进行的两个任务,如果通用一个Buff数组,这会导致数组出错!同理,协议解析与数据处理函数也不要公用一个Buff。
最好在传入数组之后,做一个判断,判断前后两个数组是否已经完全拷贝成功,确保数据传入成功了再对前一个数组进行清零,释放内存。
接收函数就是这样,比较简单但也容易出错,下一篇更新:
自定义通信协议—基于串口的C实现(发送篇)
感谢您的阅读与支持~
The End~
版权属于:编码书生
本文链接:https://codess.cc/archives/405.html
所有原创文章采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
除特别注明,您可以自由的转载和修改,但请务必注明文章来源且不可用于商业目的。
![]()