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

LsComm 串口類 v1.2 更新日誌:Bug 修復與架構反思

     編輯:關於VC++

版本資訊

  • 版本:v1.2
  • 平台:Windows 98 / 2000 / XP
  • 基礎:二次封裝 PJ Naughter 的 CSerialPort,支援多執行緒、四種接收模式

修復的五大關鍵 Bug

1. Win98 下 AutoReceiveBySignal 發送異常

現象:Win98 發送資料失敗,Win2K 正常。
根因:m_WriteOverlapped.hEvent 未建立事件物件。
修復:


if (this->IsOverlapped()) {
    this->m_hWriteEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
    if (this->m_hCloseEvent == NULL) return FALSE;
    this->m_WriteOverlapped.hEvent = this->m_hWriteEvent;  // 關鍵:綁定事件
}

2. ManualReceiveByQuery 模式發送卡死

現象:查詢模式下 Write 呼叫不返回。
根因:發送前殘留中斷遮罩,導致等待永不觸發。
修復:移除發送前的 SetMask(dwStoredFlags) 呼叫。

3. 開啟不存在的 COM 埠無異常捕獲

現象:程式直接崩潰而非回傳失敗。
根因:CSerialPort::Open 拋出 CSerialException 未捕獲。
修復:


try {
    this->m_pPort->Open(nPort, dwBaud, spParity, DataBits, spStopbits, spFC, m_IsOverlapped);
} catch (CSerialException* pE) {
    pE->Delete();
    return FALSE;  // 優雅失敗
}

4. AutoReceiveByBreak 模式語意重複

分析:EV_BREAK 等事件皆可由 AutoReceiveBySignal 涵蓋。
決定:暫保留相容性,標記棄用。

5. ManualReceiveByConst 實作缺陷

問題:依賴 CommTimeouts 導致定時接收不精準。
決定:暫保留,文件標註不推薦新專案使用。

遺留已知問題

問題影響狀態
流控制模式未驗證RTS/CTS、DTR/DSR 可能失效待測試
封裝洩漏 GetSerialPort()使用者可繞過類別直接操作底層,破壞封裝架構限制
ManualReceiveByConst 受 Timeout 影響定時精度不足已棄用標記
單機單 COM 測試環境短接 2/3 腳自測,真實多機環境未驗證需實機測試

社群問答精選

Q1:如何實現雙機即時字元傳輸?


// 1. 定義回調
void OnReceiveData(LPVOID pSender, void* pBuf, DWORD InBufferCount) {
    // 處理接收資料...
}

// 2. 開啟並註冊
m_ComPort.Open(2, LsComm::CComPort::AutoReceiveBySignal);
m_ComPort.SetReceiveFunc((FOnReceiveData)OnReceiveData, this);

// 3. 發送
char a[10000]; memset(a, 'a', sizeof(a));
m_ComPort.Output(a, sizeof(a));

Q2:中斷事件 OnComBreak 如何使用?


void OnComBreak(LPVOID pSender, DWORD dwMask, COMSTAT stat) {
    switch (dwMask) {
        case EV_BREAK:  /* 處理中斷訊號 */ break;
        case EV_CTS:    /* 處理 CTS 變化 */ break;
        // EV_DSR, EV_ERR, EV_RING, EV_RLSD...
    }
}
m_ComPort.SetBreakHandleFunc(OnComBreak);

Q3:DataWaiting 與 Attach 無關?

確認:DataWaiting 內部自行 SetMask(EV_RXCHAR) + WaitEvent,與 Attach 無關。但會暫時修改事件遮罩,併發場景需注意。

Q4:Win2000 支援 Non-Overlapped 模式嗎?

MSDN CreateFile 文件未限制,理論支援。實測建議仍優先用 Overlapped。

Q5:Overlapped 事件觸發與 COMMTIMEOUTS 關係?

ReadFile 受 SetCommTimeouts 控制,超時會觸發 hEvent。但 WaitForSingleObject(hEvent, timeout) 的 timeout 與 CommTimeouts 疊加,實際等待時間可能超出預期。

架構圖解

LsComm 類別圖
核心:CComPort 聚合 CSerialPort + CReadComThread,四種模式由執行緒 Execute 分派

開發者心聲

「寫程式,就是要認真仔細地面對自己寫的每一行代碼,不放過自己的每一個 Bug。誰都希望自己的程式不出一個 Bug,可這實在是說起來容易做起來難。」

歡迎回報 Issue 至 Milo2002@sohu.com,有空持續迭代。

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