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

C++ Builder 串口通訊實戰:基於 MSComm 控件的完整開發指南

     編輯:關於C++

串口作為電腦與外部串行設備通訊的經典介面,應用極廣。本文詳細介紹在 C++ Builder 中註冊與使用 VB 經典的 MSComm 控件進行串口程式開發,涵蓋屬性配置、事件驅動與輪詢兩種模式、資料收發與檔案儲存完整實作。

MSComm 控件核心屬性與事件

關鍵屬性

屬性說明本文設定
CommPort通訊埠號 (1-16)2
Settings波特率、校驗、資料位、停止位"9600,n,8,1"
PortOpen開關埠狀態true/false
InBufferSize/OutBufferSize接收/發送緩衝區大小1024/512 bytes
InputLen讀取字元數,0=全部0
InputMode0=文字,1=二進位1 (二進位)
RThreshold觸發 OnComm 的接收字元數1 (每字元觸發)
SThreshold觸發 OnComm 的發送緩衝閾值0 (不觸發)

OnComm 事件代碼

CommEvent 屬性識別觸發原因:

  • 1:發送緩衝區低於 SThreshold
  • 2:接收緩衝區達到 RThreshold (核心接收事件)
  • 3-6:CTS/DSR/CD/振鈴訊號變化
  • 其他:通訊錯誤代碼

C++ Builder 整合 MSComm 步驟

1. 註冊 ActiveX 控件

Component → Import Active Control → Microsoft Comm Control 6.0 → Install。需預裝 VB 或擁有其運行庫。註冊後位於工具箱 ActiveX 頁面。

2. 介面設計

  • 5 個 ComboBox:埠號、波特率、校驗位、資料位、停止位
  • 4 個 Button:開啟埠、關閉埠、發送資料、儲存資料
  • 2 個 Memo:顯示發送/接收資料
  • 1 個 Shape:圓形指示燈(綠=開啟,紅=關閉)

3. 核心程式碼實作

開啟串口:

void __fastcall TForm1::Button1Click(TObject *Sender) {
    if (MSComm1->PortOpen != true) {
        MSComm1->CommPort = StrToInt(ComboBox1->Text);
        MSComm1->Settings = ComboBox2->Text + "," + ComboBox3->Text + "," +
                           ComboBox4->Text + "," + ComboBox5->Text;
        MSComm1->InputMode = 0; // 文字模式
        MSComm1->PortOpen = true;
        // 更新 UI 狀態...
    }
}

發送資料(OleVariant 轉換):

void __fastcall TForm1::Button3Click(TObject *Sender) {
    MSComm1->Output = StringToOleStr(Memo2->Text); // AnsiString → OleVariant
}

接收資料(OnComm 事件):

void __fastcall TForm1::MSComm1Comm(TObject *Sender) {
    if (MSComm1->CommEvent == comEvReceive) {
        if (MSComm1->InBufferCount) {
            OleVariant v = MSComm1->Input;
            AnsiString str = v.AsType(varString);
            Memo1->Text = Memo1->Text + str;
        }
    }
}

儲存接收資料:

void __fastcall TForm1::Button4Click(TObject *Sender) {
    SaveDialog1->Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
    if (SaveDialog1->Execute())
        Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}

關鍵技術提示

  • Input/Output 屬性:在 Object Inspector 不可見,C++ Builder 下為 OleVariant 型別,須手動轉換
  • RThreshold 必須 > 0:否則不產生接收事件
  • 事件驅動 vs 輪詢:事件驅動回應及時可靠;輪詢適合小型自維持程式

參考本文代碼架構,讀者可擴展實現檔案收發、多埠並發等進階功能。

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