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

MSComm 控制項完整指南:C++Builder 串口通訊的事件驅動與輪詢兩種模式

     編輯:關於C++

MSComm (Microsoft Communications Control) 是 ActiveX 控制項,封裝 Windows 串口 API,提供 Visual Basic 風格的事件驅動介面,在 C++Builder、Delphi、VB 中廣泛使用。本文系統整理屬性、事件、錯誤碼、常數,並對比**事件驅動**與**輪詢**兩種程式設計模式,給出完整設定流程與代碼範例。

核心屬性速查

屬性用途關鍵值/範例
CommPort通訊埠號 (1~16)預設 1,必在 PortOpen=true 前設定
Settings連線參數字串"9600,N,8,1" (Baud, Parity, Data, Stop)
PortOpen開啟/關閉埠true/false
RThreshold觸發 OnComm 的接收字元數0=不觸發, 1=每字元觸發, N=累積 N 字元觸發
SThreshold觸發發送事件的緩衝區剩餘字元數0=不觸發, 1=緩衝區空觸發
InputLenInput 讀取字元數0=讀取全部
InputMode讀取模式comInputModeText (0) / comInputModeBinary (1)
Handshaking握手協定comNone(0), comXonXoff(1), comRTS(2), comRTSXOnXOff(3)
CTSHoldingCTS 線狀態 (唯讀)True/False
DSRHoldingDSR 線狀態 (唯讀)True/False
CDHoldingCD 線狀態 (唯讀)True/False
EOFEnable是否檢查 EOF 字元True/False

OnComm 事件常數 (CommEvent 屬性)

常數值觸發條件
comEvSend1發送緩衝區低於 SThreshold
comEvReceive2接收緩衝區達到 RThreshold
comEvCTS3CTS 線狀態變化
comEvDSR4DSR 線狀態變化
comEvCD5CD 線狀態變化
comEvRing6偵測到振鈴 (RI)
comEvEOF7接收到 EOF 字元

錯誤碼常數 (CommEvent 為錯誤時)

常數值意義
comEventBreak1001收到中斷訊號
comEventCTSTO1002CTS 逾時
comEventDSRTO1003DSR 逾時
comEventFrame1004幀錯誤
comEventOverrun1006埠過載 (資料來不及讀)
comEventCDTO1007CD 逾時
comEventRxOver1008接收緩衝區溢位
comEventRxParity1009奇偶校驗錯誤
comEventTxFull1010發送緩衝區滿
comEventDCB1011DCB 取得失敗

兩種程式設計模式

1. 事件驅動模式 (推薦)

void __fastcall TForm1::MSComm1OnComm(TObject *Sender) {
    switch (MSComm1->CommEvent) {
        case 2: // comEvReceive
            AnsiString data = MSComm1->Input; // 讀取文字
            Memo1->Lines->Add(data);
            break;
        case 1008: // comEventRxOver
            // 處理緩衝區溢位
            break;
        // ... 其他事件
    }
}

優點:即時響應、CPU 佔用低、適合高頻資料流。
缺點:需處理重入、執行緒安全(VCL 非執行緒安全,事件在主執行緒)。

2. 輪詢模式

void __fastcall TForm1::Timer1Timer(TObject *Sender) {
    if (MSComm1->CommEvent == 2) { // 檢查是否有資料
        AnsiString data = MSComm1->Input;
        Memo1->Lines->Add(data);
    }
    // 定期檢查錯誤碼
    if (MSComm1->CommEvent >= 1000) HandleError(MSComm1->CommEvent);
}

優點:邏輯線性、易除錯、適合簡單查詢-回應協定 (如 AT 指令)。
缺點:輪詢間隔權衡延遲與 CPU、易漏讀高速資料。

完整初始化流程

void __fastcall TForm1::FormCreate(TObject *Sender) {
    MSComm1->CommPort = 1;
    MSComm1->Settings = "9600,N,8,1";
    MSComm1->RThreshold = 1;       // 逐字元觸發
    MSComm1->InputLen = 0;         // 讀全部
    MSComm1->InputMode = 0;        // 文字模式
    MSComm1->Handshaking = 0;      // 無握手
    MSComm1->PortOpen = true;      // 開啟埠
}

void __fastcall TForm1::FormDestroy(TObject *Sender) {
    if (MSComm1->PortOpen) MSComm1->PortOpen = false;
}

常見問題排查

  • 埠被佔用:檢查裝置管理員、其他程式 (HyperTerminal, PuTTY) 是否佔用。
  • 收到亂碼:確認雙方 Settings 完全一致 (鮑率、奇偶、資料位、停止位)。
  • 緩衝區溢位:提高 RThreshold、改用二進制模式批次讀取、或啟用硬體流控 (RTS/CTS)。
  • 64 位元專案無法使用:MSComm 是 32 位元 ActiveX,C++Builder 64-bit 專案需改用 Win32 API (CreateFile, ReadFile, SetCommMask + WaitCommEvent) 或第三方元件 (如 TComPort)。
「MSComm 適合快速原型、低速裝置、32 位元應用;高可靠、高速、64 位元、跨平台專案請直接使用 Win32 Serial API 或成熟開源元件。」
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved