針對傳統串口開發中緩衝區管理困難、多視窗資料分發不便、大數據塊傳輸支援不足等痛點,作者重構設計了 CSuperSerialPort 核心類別。該類別整合了重疊 I/O、接收執行緒、訊息分發機制與統計功能,並內建記錄檔自動儲存特性,大幅提升開發效率與程式穩定性。
支援單一串口物件向多個視窗發送資料:
typedef struct WIN_ARG {
UINT winId; // 視窗識別碼
CWnd* pWin; // 視窗指標
DWORD msg; // 自訂訊息 ID
} WINARG, *pWINARG;
解決大數據塊分片傳輸問題,最大 1024 位元組:
typedef struct tagPackage {
enum emMaxSize { emMAX_SIZE = 1024 };
UINT iLen; // 資料長度
UINT iType; // 資料類別
BYTE pData[emMAX_SIZE]; // 資料緩衝
} PACKAGE, *pPACKAGE;
初始化時啟用 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() 管理訂閱關係。接收執行緒遍歷列表向各視窗發送自訂訊息,實現「一對多」資料廣播。
使用互斥體與臨界區保護共享資源(緩衝區、統計計數器),確保多執行緒環境下資料一致性。內建收發位元組統計功能,便於監控通訊品質。
提供三種擴充途徑:
CSuperSerialPort 原始碼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。