1 通信库设计需求
- 解决芯片间的数据交互
- 超时重发
- 重发次数控制
- 校验
- 代码共用
- 代码可以动态静态库的形式
- 适应于裸机
- 可以创建多个实例
2 应用层数据结构
由于裸机一般没有动态内存分配,所以数据长度是固定分配
typedef struct tagMessage
{
XUSHORT paramLen; //指的是param的长度
XUCHAR type; //消息类型
XUCHAR src;//消息源模块
XUINT seq;//流水号
XUINT id; //功能号
XUCHAR param[MESSAGE_LEN];
}Message;
3 链路层数据结构
此结构主要是将发送方的Message 转成Frame结构,保存起来,用于重发。
typedef struct tagFrame
{
XUCHAR headH; //帧头
XUCHAR headL;
XUCHAR lenH;//帧长度
XUCHAR lenL;
XUCHAR type;//类型,同消息类型
XUCHAR src;//源模块,同消息源模块
XUINT seq;//流水号
XUINT id;//功能号
XUCHAR param[FRAME_LEN];
XUCHAR crcH; //crc16
XUCHAR crcL;
XUSHORT resendTimes; //重发剩余次数
XUSHORT used;//是否占用
XUINT ticks; //已经流逝的tick数 单位:ms
}Frame;
4 通信控制结构
如果有多个通信,则可以实例化多个本结构,并在相应的线程调用相关的函数。
typedef struct tagComHandle
{
MessageQueue *msgTx;
MessageQueue *msgRx; 应用层收发队列
//------------------------------------------------------
FrameQueue *backup; 重发队列
//------------------------------------------------------
RawQueue *rx;
RawQueue *tx; 字节流发收队列
//------------------------------------------------------
Logger logger; 日志
//------------------------------------------------------
XUINT *extrenTick; 外部tick
//------------------------------------------------------
}ComHandle, *pComHandle;
5 使用
在不同的线程里调用 相关的API函数
COM_DECL const char *Version(void);
COM_DECL Error Init(pComHandle);
COM_DECL int PullData(pComHandle,XUCHAR data[],int len);
COM_DECL int PushData(pComHandle,XUCHAR data[],int len);
COM_DECL Error Process(pComHandle);
COM_DECL int PullMessage(pComHandle, Message*msg);
COM_DECL int PushMessage(pComHandle, Message*msg);