BBBB,串口精靈可正常接收 → 硬體/線路/基本參數(鮑率、資料位、停止位、奇偶校驗)無誤。CSerialPort(龔建偉版本)採用「訊息響應/事件驅動」模式,接收不到資料。Open()、Setup()、SetCommunicationTimeouts()、StartListening() 等每一步必須檢查 BOOL 回傳,失敗時用 GetLastError() 取得錯誤碼並記錄。
PostMessage 將 WM_COMM_RXCHAR 送至主視窗。確認:ON_MESSAGE(WM_COMM_RXCHAR, OnCommReceive) 映射。OnCommReceive 內確實呼叫 Read() 讀取緩衝區。
CSerialPort 內建 Read() 直接讀到 BYTE* 陣列驗證通訊暢通,再接上層解析。
DCB 結構的 fParity、fDtrControl、fRtsControl、XonLim/XoffLim 等細節若與下位機不一致,也會導致無法同步。逐項對照下位機文件設定。
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。