嵌入式硬件通信接口协议-UART(五)数据包设计与解析

文章首发于同名微信公众号:DigCore

欢迎关注同名微信公众号:DigCore,及时获取最新技术博文。

原文链接:https://mp.weixin.qq.com/s/z2aiapgiTFYAmgn4FvBhZQ

 

上一节讲到起止式SST(Start-Stop-Type)帧结构协议,该协议利用帧头、长度、校验构建帧结构,基于帧结构能实现对数据包的可靠、准确传输。

 

  • 应用层数据包设计思路


回到工程本身,帧结构中的数据包才是应用程序最终需要解析使用的,且与具体的业务需求有关。

 

这篇文章将简单介绍,在数据包里如何设计应用层的交互指令,从而实现具体的业务需求。分享个思路,就当抛砖引玉了。

 

类似于帧结构,在设计数据包时,根据交互逻辑的具体需求,同样采用逐字节组成字段,字段组成数据包,从而完成指令交互。

 

具体到项目中,一般地有目标地址、源地址、指令类型、传输方向、级联序号、参数ID、参数值等等。

 

字段的定义因项目需求而定,以上提及的字段可能存在且不限于此。

 

以下介绍在具体项目中,对数据包设计与解析思路。工程实践中方法众多,相信很多经验娴熟的老工程师肯定都有各自巧妙的编程思路,欢迎在本页留言交流。

 

  • 项目案例


基于nRF51822的BLE终端设备,与上位机使用UART通信,物理线路使用USB转UART。

 

数据包定义

类型定义

参数名&参数值定义

 

根据以上定义,可以为应用程序设计指令解析的结构体,结构体中所定义的类型type和参数名para,使用枚举类型定义:

 

 

  • 常规解析过程


解析函数,一般地会把输入参数的 *indata,利用一个新的结构体指针指向该输入参数,之后的解析使用结构体指针来对数据处理,增强代码可读性!

 

上述截图中的定义方式出现了警告,这里需要做个如下的强制转换:

 

常规的判断处理,多采用switch(){case :}联合if(...){;}else(...){;}判断逻辑,这个模式的判断处理架构如下:

 

 

以上的做法,依次去判断类型type、参数名para,然后直接处理。当这两个字段的枚举成员数量少,倒还可以这么判断;但是如果工程需要扩展、业务有了新的需求,那么if(...){;}else(...){;}的逐一判断将会使得解析函数里的代码量巨大!

 

总结有这几个缺点:

1.业务需求有多少个类型或者其他分支,就需要多少个这样的判断逻辑,对于编写代码变成个体力活;

2.在代码查看、维护时,面对的还是罗列了一大堆的switch(){case :}和if(...){;}else(...){;}语句;

3.增删功能时,需要找到代码中具体的判断位置,然后小心翼翼给注释或者修改掉。

 

这里已经没有任何的技术含量,基本上就是复制粘贴判断语句、修改判断对象,说到底也就是个查表的过程!

 

  • 构建查表方式解析


既然要查表,当然是有个while()循环,然后递增某一变量来查表的过程。在这里,数据包结构体中定义的类型type、参数名para,都可以作为查表的对象,该如何选择?

 

假设:

1.以类型作为查表对象,假如查表后类型等于查询参数,那么参数名仍然是个多个分支的情况,要么继续查表要么继续采用switch(){case :}或者if(...){;}else(...){;}来判断众多不同的参数名;

2.以参数名作为查表对象,假如查表后参数名等于设备运行状态,那么类型需要做最多三种判断:查询、设置、其他。    

 

对比以上两种,必然是第2个更能提高编程效率、缕清逻辑框架。

要查表就要建表,建表的结构体,以参数名para作为被查对象,并且以回调函数的形式执行查表结果。建表如下:

 

 

说是建表,其实就是定义一个结构体数组,数组的每个元素都是结构体类型,这里的结构体,主要由数据包协议的参数名和回调函数组成,定义如下:

 

 

 

 

在执行数据包解析的时候,查表的思路是:

1.先创建一个表结构的指针*ptable指向表的开始位置,也就是指向数组内第一个元素{ECHO, dcapp_dev_echo}

2.创建一个数据包结构的指针*pbuf指向输入数据首地址

3.通过递增ptable指针,对ptable与pbuf的参数名成员进行比对

4.最后执行ptable指针对应回调函数

 

 

以上的思路,放到代码中,仅仅数行就可以实现对输入数据包参数名的解析!高效、清晰!

 

另外,建表时,把无效参数名对应的值和对应的回调函数放在最后,这样做的好处是查完整个表,无需区分是否找到对应的参数名,而直接执行指针对应的回调函数即可。

 

这样即使是未找到参数名,也会执行表中最后一个元素,就是错误解析的回调函数dcapp_parser_err()。

有了这样一个查表的处理方式,增删指令功能就变得简单太多了!增加功能,只需要在表中添加参数名和对应的回调函数,删除某功能,也是回到表中找到对应的参数名和回调函数即可!

 


 

总结一下,虽然查表方式非常清晰,但是对应的回调函数内部,需要独自处理和实现,并且每个参数名都需要单独处理。相比于采用switch(){case :}联合if(...){;}else(...){;}判断逻辑,确实清晰很多。

 

以上的查表思路,来源于经历的项目,同时还参考了

《STM32CubeExpansion_MEMSMIC1_V1.1》

这个ST官方的数字麦克风开源项目示例,作为USB音频设备时,类似的回调函数方式:

 

调试截图

正确解析了数据包的参数名之后,对应的函数执行结果是打印输出调试信息,如下截图:

 

 

以上是初步的解析效果,可以通过回调函数,正确地跳转到对应的函数执行。具体的处理仍需要针对项目的业务需求而设计,在此不做更多的延伸。

 

参考资料:

《X-CUBE-MEMSMIC1》@

http://www.stmcu.org.cn/document/detail/index/id-216480

 

长按二维码关注DigCore


关注公众号,发消息:

下载&Packet_Parse

获取本文PDF原文源代码下载链接

### 回答1: FPGA是可编程逻辑器件,可以根据需要自定义其功能。UART是通用异步收发传输接口的缩写。FPGA可以通过UART与外界进行通信,而数据包则是UART通信中用来传输数据的核心。 在FPGA中,通常会使用串口通信模块来实现与外部设备的通信,这包括与计算机、单片机等的通信。而UART通信中,数据包则是按照一定的格式传输数据的。数据包通常包括起始位、数据位、校验位、停止位等。在接收端,通过识别数据包中的这些信息,可以正确解读出发送端发送的数据。 在FPGA中实现UART通信数据包传输,需要编写相应的Verilog或VHDL代码。其中,串口通信模块需要实现串口波特率设置、发送数据和接收数据等功能,而数据包传输则需要对数据采集、同步、CRC校验等进行处理。 总之,FPGA UART数据包是在FPGA中实现串口通信数据传输的重要组成部分,通过合理的设计和编程可以实现高效、稳定和可靠的通信。 ### 回答2: FPGA UART数据包是在FPGA板上使用通用异步收发器传输数据的一种方式。通用异步收发器(UART)是一种常见的串行通信协议,通常用于在微处理器和外部设备之间进行数据传输。UART传输数据的方式是将数据分割成小的数据包数据帧),然后添加一些控制信息,例如起始位、停止位、校验位等等,以确保数据的准确性和完整性。FPGA可以通过使用UART协议来与其他外设进行数据传输,例如电脑、传感器等。 在FPGA中,使用UART数据包的主要步骤包括:首先,设置串口通信的波特率,数据位数和校验方式等参数。然后,根据协议规定,将数据分割为,并在其前后添加控制位,以确保数据传输的正确。在传输数据时,FPGA通过将数据帧转换成串行数据流来发送给外设,然后接收外设发送的数据并进行解析和处理。 总之,FPGA使用UART数据包是FPGA与外设进行通信的一种可靠方式,可以用于传输各种类型的数据。通过使用UART协议,FPGA可以与许多不同的设备进行通信,并且在数据传输中具有高度可靠性和准确性。 ### 回答3: FPGA UART数据包是指使用FPGA实现通用异步收发传输器(UART协议数据包UART是一种串行通信协议,常用于嵌入式系统中,可实现单向或双向通信。FPGA作为可编程逻辑器件,可以实现复杂的逻辑功能,因此可以用来实现UART协议。FPGA UART数据包通常包括起始位、数据位、校验位和停止位等几部分。起始位表示传输数据的开始,通常为逻辑0电平;数据位为实际传输的数据位数,可选5、6、7、8位之一;校验位用于确保数据传输的准确性,可选奇偶校验或无校验;停止位用于表示数据传输的结束,通常为逻辑1电平。FPGA UART数据包的组合和解析过程需要编写相应的Verilog或VHDL代码,其中包括时序控制、数据缓存、校验等基本模块。FPGA UART数据包的优点在于实现灵活、速度快、可扩展性强等方面,通常被应用于高性能的通信领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值