串列埠通訊 資料抽象
阿新 • • 發佈:2018-12-18
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;