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

MFC CSerialPort 類初始化 InitPort 第一參數型別錯誤解決

     編輯:程式設計綜合問答

錯誤訊息

無法將參數 1 從“…… *const ”轉換為“HWND”

原因分析

`CSerialPort::InitPort` 第一個參數型別為 `HWND`(視窗控制代碼),用於接收序列埠通訊事件訊息(如 `WM_COMM_RXCHAR`)。在 `CWnd` 派生類(如 `CDialog`、`CView`)的成員函式中直接傳遞 `this` 指標,型別為 `CWnd*`,無法隱性轉換為 `HWND`。

正確用法

// 在 CDialog/CDialogEx/CView 等 CWnd 派生類中
CSerialPort myPort;
// 使用 m_hWnd 成員變數取得 HWND
if (!myPort.InitPort(this->m_hWnd, 1, 9600, 'N', 8, 1, EV_RXCHAR, 512)) {
    AfxMessageBox(_T("序列埠初始化失敗"));
}

關鍵點

  • `CWnd::m_hWnd` 為 `HWND` 型別,包含視窗實際控制代碼
  • `this` 型別為 `CWnd*`,需透過 `m_hWnd` 或 `GetSafeHwnd()` 取得 `HWND`
  • 若在非 `CWnd` 類別中使用,需持有目標視窗的 `HWND`(如 `AfxGetMainWnd()->GetSafeHwnd()`)

完整初始化範例

BOOL CMyDialog::OnInitDialog() {
    CDialogEx::OnInitDialog();
    
    // 序列埠 1,9600,N,8,1
    if (!m_SerialPort.InitPort(GetSafeHwnd(), 1, 9600, 'N', 8, 1, EV_RXCHAR | EV_TXEMPTY, 1024)) {
        TRACE(_T("Serial port init failed\n"));
        return FALSE;
    }
    return TRUE;
}

// 接收訊息處理
LRESULT CMyDialog::OnCommRxChar(WPARAM wParam, LPARAM lParam) {
    char buffer[1024];
    DWORD dwRead = m_SerialPort.ReadData(buffer, 1024);
    if (dwRead > 0) {
        // 處理接收資料
    }
    return 0;
}

補充:訊息映射

記得在訊息映射中加入 `ON_MESSAGE(WM_COMM_RXCHAR, OnCommRxChar)` 以接收事件通知。

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