串口通信 数据抽象

1、栈式缓冲

  将需要请求的帧,存放不同的栈,com->TxBuf[SCOM_4_TX_STACK][SCOM_4_TX_BUF_LEN]

  目标栈计算:dst_stk = com->tx_stk_cur + com->tx_stk_cnt;

2、应答式,主机主动发起请求,从机响应的方式

  从机未响应,尝试计数器:com->tx_retry,尝试 SCOM_4_TX_RETRY 后,拆除请求帧。

综上:a) 栈式分布是缓冲,避免主机请求阻塞(云端信息,主机要及时请求)。b) 应答式避免从机无序响应

  注意:虽然分布式缓冲解决了主机阻塞,但同一时刻只有一个数据帧等到响应(com->tx_stk_cur ),响应后立即拆除

3、帧协议可以传输文件,要求:a)文件传输必须快,2) 不能影响正常的业务信息

  解决方式:1)文件在每一帧的空闲位置传送,帧的最大容量为 SCOM_4_TX_BUF_LEN

        2)保证文件的立即快速传送

数据抽象:

typedef struct
{
    CWnd*                m_pOwner;
    void                *udat;
    f_Com4Cb            msg_callback;                        //串口发送,串口接收数据处理
    f_Com4Ex            exd_callback;
    S_Com4Tsk            *task;
    unsigned short         rx_pos;                                //分析接收栈的位置指示器
    unsigned char         tx_retry;                            //应答重试次数计数器,无应答重复发送相同帧次数
    unsigned char         tx_sem;                                //计数字节,每发送一帧数据+1
    unsigned short         tx_tick;                            //发送数据帧的时间间隔,SCOM_4_BIT_CYCLE*主循环时间
    unsigned char         tx_stk_cnt;                            //待发送栈的数量,总共有SCOM_4_TX_STACK,超过后不允许打包数据
    unsigned char         tx_stk_cur;                            //当前正在等待处理的栈,即当前栈需要等待接收应答
    unsigned char         TxBuf[SCOM_4_TX_STACK][SCOM_4_TX_BUF_LEN];//栈发送数据实例
    unsigned int        TxLen[SCOM_4_TX_STACK];                //每个栈待发送数据的长度
    unsigned char        TxSem[SCOM_4_TX_STACK];                //每个栈的计数字节
    unsigned char         RxBuf[SCOM_4_RX_BUF_LEN];            //接收BUF
    //extra data transmit function
#ifdef SCOM_4_MASTER
    unsigned char         PadBuf[SCOM_4_TX_BUF_LEN];
#endif
    unsigned short        ex_fun;                                //文件任务是否停止指示器,如果文件未发送完成,应立即发送
    unsigned char        ex_cmd;                                //文件传输状态命令字
    unsigned char        ex_typ;
    unsigned int        ex_len;                                //发送文件的总长度
    unsigned int        ex_ptr;                                //已发送文件长度,未发送文件的起始位置
    unsigned char        *ex_str;
    unsigned char        crc64[8];
} S_Com4hd;

猜你喜欢

转载自www.cnblogs.com/jiangzhaowei/p/10135859.html