1. 程式人生 > >串列埠通訊 資料抽象

串列埠通訊 資料抽象

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;