首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

高效能串口通訊類 CSuperSerialPort 設計與實作

     編輯:關於VC++

專案背景與動機

針對傳統串口開發中緩衝區管理困難、多視窗資料分發不便、大數據塊傳輸支援不足等痛點,作者重構設計了 CSuperSerialPort 核心類別。該類別整合了重疊 I/O、接收執行緒、訊息分發機制與統計功能,並內建記錄檔自動儲存特性,大幅提升開發效率與程式穩定性。

核心資料結構

視窗描述結構 WIN_ARG

支援單一串口物件向多個視窗發送資料:

typedef struct WIN_ARG {
    UINT winId;      // 視窗識別碼
    CWnd* pWin;      // 視窗指標
    DWORD msg;       // 自訂訊息 ID
} WINARG, *pWINARG;

資料封包結構 tagPackage

解決大數據塊分片傳輸問題,最大 1024 位元組:

typedef struct tagPackage {
    enum emMaxSize { emMAX_SIZE = 1024 };
    UINT iLen;       // 資料長度
    UINT iType;      // 資料類別
    BYTE pData[emMAX_SIZE]; // 資料緩衝
} PACKAGE, *pPACKAGE;

關鍵技術實作

重疊 I/O 與接收執行緒

初始化時啟用 FILE_FLAG_OVERLAPPED 旗標:

CreateFile(m_com.com, GENERIC_READ | GENERIC_WRITE, 0, NULL,
           OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

接收執行緒利用 cbInQue 即時獲取輸入緩衝區位元組數,動態分配封包並透過 PostMessage 分發至掛載的視窗,避免輪詢帶來的延遲與 CPU 佔用。

多視窗訊息分發機制

內部維護 std::vector<WINARG> vWINLIST 視窗列表,提供 Attach()/Detach() 管理訂閱關係。接收執行緒遍歷列表向各視窗發送自訂訊息,實現「一對多」資料廣播。

執行緒同步與統計

使用互斥體與臨界區保護共享資源(緩衝區、統計計數器),確保多執行緒環境下資料一致性。內建收發位元組統計功能,便於監控通訊品質。

擴充性設計

提供三種擴充途徑:

  1. 直接修改 CSuperSerialPort 原始碼
  2. 繼承該類別覆寫虛擬函數
  3. 呼叫 GetComHandle() 取得原始控制代碼進行底層操作

專案附帶兩個可重用元件:superSP.cpp/h(串口通訊核心)與 fileCtrl.cpp/h(檔案操作封裝),以及 Modem AT 指令集參考檔案。

使用範例

m_pSSP->Open(m_comName, m_uComRate, m_uComParity,
             m_uComDataBits, m_fComStopBits);
m_pSSP->StartReceive(m_pSSP); // 啟動接收執行緒

詳細實作請參考 TestSerialPort2Dlg.cpp。作者歡迎技術交流:i_mlibin@163.com。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved