XMODEM设计与C代码实现(2.代码设计篇)

本文详细介绍了XMODEM协议的关键数据定义、接口函数设计以及状态机处理流程,包括阻塞与非阻塞处理、空闲、就绪、接收、完成、取消和停止模式,以及帧处理的各个阶段。文章结合代码详细阐述了每个模式和处理过程的工作原理。
摘要由CSDN通过智能技术生成

1. 关键数据定义

  在上一篇中,我们对XMODEM的系统结构以及关键流程进行了详细设计,所以,我们在设计代码前,先对几个重要的数据进行定义,相关的解释我都写在注释中。

typedef enum xmodem_rx_st       xmodem_rx_st_t;
//数据接收状态
enum xmodem_rx_st
{
   
    XMODEM_RX_ST_IDLE,          //接收空闲
    XMODEM_RX_ST_WAIT,          //接收等待,只用于非阻塞接收
    XMODEM_RX_ST_TIMEOUT,       //接收超时
    XMODEM_RX_ST_OK,            //接收完成
};

typedef enum xmodem_chk_md      xmodem_chk_md_t;
//XMODEM校验模式配置
enum xmodem_chk_md
{
   
    XMODEM_CHK_MD_ADD,          //累加和校验
    XMODEM_CHK_MD_CRC,          //CRC校验
    XMODEM_CHK_MD_MAX
};

typedef enum xmodem_data_md     xmodem_data_md_t;
//XMODEM数据模式配置
enum xmodem_data_md
{
   
    XMODEM_DATA_128,            //128字节数据
    XMODEM_DATA_1024            //1024字节数据
};

typedef enum xmodem_req         xmodem_req_t;
//XMODEM请求
enum xmodem_req
{
   
    XMODEM_REQ_NONE,            //无请求
    XMODEM_REQ_START,           //开始请求
    XMODEM_REQ_STOP,            //停止请求
    XMODEM_REQ_MAX
};

typedef enum xmodem_state       xmodem_state_t;
//XMMODE工作状态
enum xmodem_state
{
   
    XMODEM_STATE_IDLE,              //XMODEM空闲状态
    XMODEM_STATE_STANDBY,           //XMODEM就绪状态
    XMODEM_STATE_RECEIVING,         //XMODEM接收状态
    XMODEM_STATE_FINISH,            //XMODEM完成状态
    XMODEM_STATE_CANCEL,            //XMODEM取消状态
    XMODEM_STATE_STOP,              //XMODEM结束状态
    XMODEM_STATE_UNKNOW,
};

typedef struct xmodem       xmodem_t;
struct xmodem
{
   
    //XMODEM数据模式
    xmodem_data_md_t data_md;
    //XMODEM校验模式
    xmodem_chk_md_t chk_md;
    //XMODEM请求
    xmodem_req_t req;
    //保存当前XMODE状态
    xmodem_state_t state;
    //保存传输等待次数
    type_uint16 wait_times;
    //保存当前传输等待计数
    type_uint16 wait_cnt;
    //保存当前接收等待状态
    xmodem_rx_st_t rx_state;
    //保存接收超时次数
    type_uint16 rx_retry;
    //保存接收超时次数计数
    type_uint16 rx_retry_cnt;
    //XMODE接口发送回调函数
    xmodem_tx_cb_t tx_cb;
    //XMODEM接口接收回调函数
    xmodem_rx_cb_t rx_cb;
    //XMODEM数据接收回调函数
    xmodem_cb_t callback;
    //XMODEM接收数据缓冲区
    type_uint8 buf[XMODEM_BUF_LEN_MAX];
    //XMODEM当前接收数据长度
    type_uint16 length;
    //XMODEM帧计数
    type_uint8 frm_cnt;
};

/*======================================================
函数名:xmodem_tx_cb_t
参数:
    buf:缓冲区
    len:发送长度
返回值:
    STATE_FALSE失败
    STATE_TRUE成功
说明:
    XMODEM发送回调函数类型,XMODEM数据发送过程
=======================================================*/
typedef type_err (*xmodem_tx_cb_t)(type_uint8 *buf, type_uint16 len);

/*======================================================
函数名:xmodem_rx_st_t
参数:
    buf:缓冲区
    buf_len:需要接收长度
    len:实际长度
    timeout:超时时间,毫秒
返回值:
    XMODEM_RX_ST_OK表示接收成功
    XMODEM_RX_ST_TIMEOUT表示接收超时
    XMODEM_RX_ST_WAIT表示接收等待
说明:
    XMODEM接收回调函数类型,XMODEM数据接收过程,支持阻塞和非阻塞
=======================================================*/
typedef xmodem_rx_st_t (*xmodem_rx_cb_t)(type_uint8 *buf, type_uint16 buf_len, type_uint16 *len, type_uint16 timeout);

/*======================================================
函数名:xmodem_cb_t
参数:
    buf:缓冲区
    len:实际长度
返回值:无
说明:
    XMODEM数据回调函数类型,XMODEM调用此函数向上层通知接收到数据
    回调函数通过以下参数告知当前数据状态:
    buf为空     len为0------>表示传输故障,所有传输数据无效
    buf不为空   len不为0----->表示当前数据有效
    buf不为空   len为0------>表示当前传输完成
=======================================================*/
typedef void (*xmodem_cb_t)(type_uint8 *buf, type_uint16 len);

2. 关键接口函数定义

  同样,我们需要定义几个重要的函数,用于外接调用:

//XMODEM初始化
type_err xmodem_init(xmodem_t *obj);
//XMODEM发送回调函数注册
type_err xmodem_tx_cb_reg(xmodem_t *obj, xmodem_tx_cb_t cb);
//XMODEM接收回调函数注册
type_er
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值