原创文章,禁止转载

很久没有更新文章了,来两篇硬核点的自定义协议,不接受转载,仅做笔记备忘~

  在数据传输过程中,数据的安全传输是非常非常重要的,比如TIP/IP七层模型,每一层模型中都需要遵守对应的协议,它有着严格的标准,无规矩不成方圆。只有所有的设备厂商,软件开发者,和上层应用都遵守同一套标准协议,数据才能完整、安全地传输。

举个例子,在发起一次HTTP请求时,需要TCP经过三次/四次握手的阶段,注意三次挥手与四次握手是在TCP中进行的!而不是HTTP!
如图:
163ea23be8742518.png

TCP三次握手的目的,是为了解决UDP传输不可靠缺点,因为它能保证数据准确到达客户端设备,这里不介绍TCP三次握手的具体步骤,而是通过这个例子来说明,数据传输过程中,安全性是最重要的。而如何确保数据的安全传输,就需要有特定的协议来规范数据。

  前些时间,遇到了一个产品上报的数据时不时就会出错的情况,经过仔细排查之后发现,是串口收发的数据存在丢包的情况,但是在测试时却很难复现,猜测可能是在实际环境中存在干扰所致,所以问题也就很简单:给串口传输加一层协议。也就是本篇文章的重点,自定义串口协议的实现

多数情况下,工业应用中串口设备传输的数据,都是以16进制字节流的形式,而不会传输string字符串,当然string在ASIIC码中也是以字节表示。但是如果你直接使用string对数据进行描述的话,产品被人抄袭或破解的可能性就会大大增加,所以这也是有安全性考虑的。

  遵循商业保密的原则,下图所示的串口协议均为本人自行定义,网上类似文章很多,不参与深入讨论。且文中所有代码均只做示范参考,点到为止。写本篇文章的目的也仅仅作为自己的技术笔记,本人对此文拥有绝对解释权利,禁止一切形式转载与盗用,必要情况下会对此文章进行加密。

152601.png

如上图,一帧串口数据可以分为起始位,包长,报文类型,数据长度,数据域,校验和还有结束位

在 C 实现中,可以将一帧数据包定义为一个结构体;

此处内容需要评论回复后(审核通过)方可阅读。

我们知道,串口数据是要通过串口中断进行接收的,但是在中断中是不能运行占时间的处理程序的,所以,数据处理函数千万不要放在串口中断中,一定要等到串口接收完成之后,再跳转到数据接收函数,也就是说:在串口中断中,先将所有数据收进串口FIFO,同时标志位置位,再另开线程通过判断标志位的方法,去处理接收进来的数据,此时的数据是完整收进来了的。

串口接收进程示例:

此处内容需要评论回复后(审核通过)方可阅读。

这个程序的核心在于,串口接收进程的处理上,按字节处理,通过数组进行偏移,同时需要特别注意的是:串口接收Buff(FIFO)数组,与协议解析Buff数组 不要混用同一个!这是很多新手容易忽视的一个细节,因为串口中断接收与协议解析,几乎是同时正在进行的两个任务,如果通用一个Buff数组,这会导致数组出错!同理,协议解析与数据处理函数也不要公用一个Buff。

最好在传入数组之后,做一个判断,判断前后两个数组是否已经完全拷贝成功,确保数据传入成功了再对前一个数组进行清零,释放内存。

此处内容需要评论回复后(审核通过)方可阅读。

接收函数就是这样,比较简单但也容易出错,下一篇更新:
自定义通信协议—基于串口的C实现(发送篇)

感谢您的阅读与支持~




The End~

最后修改:2021 年 03 月 02 日
您的支持就是我持续更新的动力!