嵌入式系统通信库设计

1 通信库设计需求

  1. 解决芯片间的数据交互
  2. 超时重发
  3. 重发次数控制
  4. 校验
  5. 代码共用
  6. 代码可以动态静态库的形式
  7. 适应于裸机
  8. 可以创建多个实例

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);

6 源码

https://gitee.com/amwha/comlib

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值