【资料图】

不管是线程间,还是设备间通信,都需制定一个通信协议,规定数据的格式、内容等。

线程间通信因为在芯片内部传输,基本可以排除数据干扰导致的异常,所以通常会设计的比较简单。但是,设备之间的通信(不管是无线还是有线)就会复杂一些,一般都包含帧头、校验位之类的。因此,之前给大家介绍了一个基本的串口协议框架《如何写一个健壮且高效的串口接收程序?》。

因为当时刚毕业没多久,所以,虽然从大的方向介绍了基本协议内容,但在细节处理上还不够好,比如可维护性、可读性等方面。

后来,我在学习开源的飞控源码时,发现里面使用了“联合体+结构体”的方式,大大提高了程序的可维护性和可读性。比如,我们的协议中有这样三条命令:心跳包、获取固件版本号、获取序列号。

一般这样写的,大概率是工作1-2年的,当然也不排除工作好多年的。这看似简单,但可维护性、可读性都非常差。

中级版本:使用结构体的形式声明各种消息内容。

如果其它代码写的比较好,甚至不需要多大改动,即可完成一次扩展。

高级版本:在中级版本的基础上,使用联合体容纳前面的所有消息类型。

当你需要发送消息的时候,可以这样发送:

因为现在大部分IDE都有代码提示功能,所以,当你需要发送数据的时候,可以根据提示选择你需要的消息进行发送,相当方便快捷,也不容易出错。

推荐内容