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

MSComm 控制元件實現 Modem 串口通訊:事件驅動與 AT 指令完整範例

     編輯:關於VC++

前言

MSComm (Microsoft Communication Control) 是 Microsoft 提供的 ActiveX 控制元件,封裝 Windows 串口 API,支援 VB/VC/Delphi 等環境,提供事件驅動與輪詢兩種模式。本文以 VC++ 對話框專案為例,示範事件驅動模式下的 Modem 初始化、資料收發與常用 AT 指令。

開發環境配置

  1. 專案 → 加入元件 → Microsoft Communication Controls 6.0
  2. 對話框拖入 MSComm 控制元件,ID 設為 IDC_MSCOMM
  3. 類別向導新增控制變數 MSComm m_comm

串口初始化 OnInitDialog()


BOOL CMyDlg::OnInitDialog() {
    CDialog::OnInitDialog();

    if (m_comm.GetPortOpen()) m_comm.SetPortOpen(FALSE);

    m_comm.SetCommPort(1);                 // COM1
    m_comm.SetSettings(_T("9600,n,8,1"));  // 9600 無奇偶 8資料位 1停止位
    m_comm.SetInputMode(1);                // 二進位陣列模式
    m_comm.SetRThreshold(1);               // 收到 1 字節觸發 OnComm
    m_comm.SetPortOpen(TRUE);

    m_comm.GetInput();                     // 清空輸入緩衝區
    m_strSend = _T("ATZ\r\n");             // Modem 復位
    m_comm.SetOutput(COleVariant(m_strSend));
    return TRUE;
}

事件驅動接收 OnCommMscomm()


void CMyDlg::OnCommMscomm() {
    Sleep(500); // 視 Modem 廠商調整,否則資料不全

    VARIANT vt = m_comm.GetInput();
    long nEvent = m_comm.GetCommEvent();

    switch (nEvent) {
    case 2: // 接收字元事件
        {
            long cnt = m_comm.GetInBufferCount();
            if (cnt > 0) {
                char* pData = (char*)vt.parray->pvData;
                m_strRecv = CString(pData, cnt); // 直接轉字串
                // 這裡解析回應:OK, ERROR, CONNECT, RING 等
            }
        }
        break;
    case 3: case 4: case 5: case 6: // CTS/DSR/CD/Ring 狀態變化
        // 可記錄日誌或更新 UI 指示燈
        break;
    }
}

常用 AT 指令速查

指令功能範例
ATZ復位恢復出廠設定ATZ\r\n
ATD撥號 (音頻)ATD0212345678\r\n
+++切換到線上命令模式+++ (需前後各 1 秒靜默)
ATH掛機/摘機ATH0 掛機, ATH1 摘機
S0=n自動應答響鈴次數S0=1 (1響應答), S0=0 關閉
&F載入出廠預設設定檔&F\r\n
\N0異步模式\N0\r\n
\Q0XON/XOFF 流控\Q0\r\n

關鍵屬性設定說明

  • Handshaking = 2 (comRTS):國產 Modem 必須設定,否則無法正常通訊
  • RThreshold = 1:每收到 1 位元組即觸發事件,即時性最佳
  • InputMode = 1:二進位模式,避免 ANSI/Unicode 轉換問題
  • Settings:波特率需與 Modem 實際設定一致,常見 9600/19200/38400/57600/115200

已知問題與對策

  • Win98 下資料接收不全:作者測試發現 Win98 需增加 Sleep 延遲,建議改用 CAsyncSocket 或 Win32 API ReadFile 實現更穩定的串口通訊
  • 緩衝區溢位:高速傳輸時建議提高 InBufferSize / OutBufferSize
  • 埠號佔用:關閉視窗時務必 SetPortOpen(FALSE)

總結

MSComm 為快速開發串口/Modem 應用提供了極佳的封裝層。事件驅動模式配合 RThreshold=1 可實現近乎即時的資料接收。若需跨平台或更高效能,可考慮直接呼叫 Win32 CreateFile/ReadFile/WriteFile/SetCommState 等 API。

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