通信架构设计源码范例 .c文件内容1、变量1、日志标签2、自定义的收发队列3、解析后的报文缓冲区/发送报文打包区4、交互参数1、对端的参数结构体管理用来记录对端参数状态的交互用2、己端的参数结构体管理用来记录己端参数状态的交互用3、控制过程参数一般用来做控制用状态机流程相关的控制参数2、参数名转成字符串函数翻译函数在打印日志时特变是打印参数时翻译函数可将参数从某个枚举类型值转成枚举值字符串3、参数Set Get 函数参数不在通过简单的赋值去控制而是通过Set、Get 接口函数操作通过static 关键字和.h文件的函数声明管理参数的操作权限1、Set函数说明1、函数名设计比如参数 ccuParam 的 cpState 成员的 Set 函数命名为 ccuParamSet_cpState2、当参数变化时才允许修改且把变化前后值打印出来并打印一条报文报文打印调用日志标签、翻译函数2、Get函数说明1、函数名设计比如参数 ccuParam 的 cpState 成员的 Get 函数命名为 ccuParamGet_cpState4、整个参数的RST函数当需要直接对 ccuParam 整个参数置0时可以设计如下函数5、发送/接收 hex 源码打印函数调用相应的日志标签打印 hex 源码报文6、发送报文打包接口函数按照报文信息一个一个数据顺序打包到txMsgbuff并打印一次发送 hex 源码此后即可将数据包发送到 发送队列txQue里驱动层自动调队列数据从串口发送出去7、具体某条报文的打包发送函数比如 发送到对端的一条 ccuStatus 报文用该函数打包具体的内容并打印hex打印源码一条8、table表table表是用来封装对端不同报文的处理函数9、具体对端的报文处理函数得到对端报文后用结构体指针解析每个参数的值打印参数信息格式[DB_INFO] SECC_STATUS{SessState:%s, CpPwmDuty:%d, ContactorOp:%s, CpPwmDutySet:%s}之后就是得到相应报文后做相应的操作10、对端报文解析处理函数11、通信 Comm 处理函数第一部分对端报文for 查表1、通过报文解析函数反馈值判断是否收到正确报文2、for循环查 table 表进入相应对端报文的处理函数做相应的处理第二部分主动循环处理比如状态变化100ms周期要发某条报文等等12、初始化函数1、接收回调函数初始化2、接收发送队列初始化函数3、初始化接口函数即上述的集合函数13、任务函数当初始化成功后才允许 comm通信处理.h文件内容1、字符串常量翻译函数用到的2、可用宏封装一些冗余的表达式更直观3、table表结构体函数指针枚举4、对端报文帧格式类型声明结构体/联合体1、通常我们通过指针去直接操作接收报文的方便快捷2、一般都需要按字节对齐#pragma pack(push, 1)#pragma pack(pop)5、交互参数结构体声明6、允许外部调用的函数声明3、日志打印时机日志打印时机是很重要的一个意识何时使用日志打印、哪个地方加打印这很重要上述主包的通信收发例子中主要以下的地方增加打印1、接收报文处理的地方接收的报文跟上一包有变化打印所有参数、HEX源码如下打印的内容就是[RX_HEX]:DB AC 00 01 02 ....CCU_STATUS{ocpd:1, resumeTri:2 ......}2、发送报文处理的地方发送的报文跟上一包有变化打印所有参数、HEX源码如下打印的内容就是[TX_HEX]:DB AC 00 01 02 ....SECC_STATUS{sessionState:SECC_CHARGE_IDLE, dataTransRes:2,.....}3、参数设置接口当设置参数且参数变化的时候打印变化前后值如下打印的内容是[SET_SECC_STATUS_PARA] sessionState:0 - 14、状态机切换、异常发生把状态机切换或异常发送的条件以及跳转的下一个状态名打印出来日志打印总结以上打印主要完成了如下指标1、避免重复打印2、清晰看透收发报文的内容3、系统状态运作能够通过打印日志看透4、可以看到属性参数何时发生变化5、当然还有个关键的是要写好状态机