首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VS2010 MFC CSerialPort 類接收不到資料?排查步驟與常見坑

     編輯:程式設計綜合問答

現象確認

  • 下位機發送 BBBB,串口精靈可正常接收 → 硬體/線路/基本參數(鮑率、資料位、停止位、奇偶校驗)無誤。
  • MFC 程式使用 CSerialPort(龔建偉版本)採用「訊息響應/事件驅動」模式,接收不到資料。

系統化排查清單

  1. 檢查所有 API 回傳值:
    Open()、Setup()、SetCommunicationTimeouts()、StartListening() 等每一步必須檢查 BOOL 回傳,失敗時用 GetLastError() 取得錯誤碼並記錄。
  2. 驗證視窗訊息迴路:
    事件驅動依賴 PostMessage 將 WM_COMM_RXCHAR 送至主視窗。確認:
     ・主視窗類別有 ON_MESSAGE(WM_COMM_RXCHAR, OnCommReceive) 映射。
     ・訊息迴路暢通(無長時間阻塞 UI 執行緒)。
     ・OnCommReceive 內確實呼叫 Read() 讀取緩衝區。
  3. 排除緩衝區處理邏輯錯誤:
    若自行維護環狀緩衝,檢查讀寫指標、資料長度計算、溢位處理。建議先用 CSerialPort 內建 Read() 直接讀到 BYTE* 陣列驗證通訊暢通,再接上層解析。
  4. 參數一致性複核:
    即使串口精靈能通,程式碼中 DCB 結構的 fParity、fDtrControl、fRtsControl、XonLim/XoffLim 等細節若與下位機不一致,也會導致無法同步。逐項對照下位機文件設定。
  5. 多執行緒/同步問題:
    若在 Worker Thread 呼叫 Read(),確認 OVERLAPPED 結構正確初始化,且事件物件 CreateEvent 成功。

快速驗證最小可行程式

// OnInitDialog 或 OnCreate
if (!m_Port.Open(1, 9600, 'N', 8, 1)) { AfxMessageBox(_T("Open fail")); return; }
m_Port.Setup(1024, 1024);
m_Port.SetCommunicationTimeouts(0,0,0,0,0); // 無超時,測試用
m_Port.StartListening();

// 訊息處理
LRESULT CMyDlg::OnCommReceive(WPARAM w, LPARAM l) {
    BYTE buf[256]; DWORD len = 256;
    if (m_Port.Read(buf, len)) {
        CString s; s.Format(_T("Recv %d bytes: "), len);
        for (DWORD i=0;iSetWindowTextW(s);
    }
    return 0;
}

若最小程式仍失敗

嘗試改用 libserialport 或 Windows 原生 CreateFile/ReadFile/WaitCommEvent 寫法,隔離是否為 CSerialPort 封裝層 Bug。

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