串口作為電腦與外部串行設備通訊的經典介面,應用極廣。本文詳細介紹在 C++ Builder 中註冊與使用 VB 經典的 MSComm 控件進行串口程式開發,涵蓋屬性配置、事件驅動與輪詢兩種模式、資料收發與檔案儲存完整實作。
| 屬性 | 說明 | 本文設定 |
|---|---|---|
| CommPort | 通訊埠號 (1-16) | 2 |
| Settings | 波特率、校驗、資料位、停止位 | "9600,n,8,1" |
| PortOpen | 開關埠狀態 | true/false |
| InBufferSize/OutBufferSize | 接收/發送緩衝區大小 | 1024/512 bytes |
| InputLen | 讀取字元數,0=全部 | 0 |
| InputMode | 0=文字,1=二進位 | 1 (二進位) |
| RThreshold | 觸發 OnComm 的接收字元數 | 1 (每字元觸發) |
| SThreshold | 觸發 OnComm 的發送緩衝閾值 | 0 (不觸發) |
CommEvent 屬性識別觸發原因:
Component → Import Active Control → Microsoft Comm Control 6.0 → Install。需預裝 VB 或擁有其運行庫。註冊後位於工具箱 ActiveX 頁面。
開啟串口:
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);
}
OleVariant 型別,須手動轉換參考本文代碼架構,讀者可擴展實現檔案收發、多埠並發等進階功能。