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;