Microsoft Communications Control 6.0 (MSComm32.ocx) 是 Windows 經典的序列埠 ActiveX 控制項,封裝了底層 API,讓序列埠程式設計變得極簡單。本文詳細記錄從元件安裝、專案整合、屬性設定到收發程式碼的完整流程。
執行 開始 → 執行,輸入:
regsvr32 mscomm32.ocx
註冊成功後重新開啟 Components and Controls 對話框即可找到。
將控制項拖入對話方塊,用 ClassWizard 加入成員變數 m_msCom,設定關鍵屬性:
| 屬性 | 設定值 | 說明 |
|---|---|---|
| CommPort | 1 | 序列埠號 (視實際硬體而定) |
| InputMode | 1 - Binary | 以二進位模式讀取資料 |
| RThreshold | 1 | 接收緩衝區 ≥1 字元觸發 OnComm 事件 |
| 其他 | 預設值 | 波特率、資料位、停止位、奇偶校驗等 |
或在 OnInitDialog() 以程式碼設定:
m_msCom.SetCommPort(1);
if (m_msCom.GetPortOpen()) m_msCom.SetPortOpen(FALSE);
m_msCom.SetInputMode(1); // Binary 模式
m_msCom.SetRThreshold(1); // 觸發閾值
// OnInitDialog 中開啟序列埠
m_msCom.SetPortOpen(TRUE);
m_msCom.GetInput(); // 預讀清除殘留資料
// 發送資料 (任意位置呼叫)
COleVariant txData("Hello Serial");
m_msCom.SetOutput(txData);
OnOnCommMscomm1void CMyDlg::OnOnCommMscomm1() {
if (m_msCom.GetCommEvent() == 2) { // 事件 2 = 接收緩衝區有字元
Sleep(100); // 等待資料完整到達 (視波特率調整)
VARIANT rec_data = m_msCom.GetInput(); // 讀取緩衝區
int data_len = rec_data.parray->rgsabound->cElements;
char cData[1024];
memcpy(cData, (char*)rec_data.parray->pvData, data_len);
cData[data_len] = '\0'; // 字串結束
// cData 即為接收到的字串
m_list.AddString(cData); // 顯示於 ListBox
}
}
| 項目 | 說明 |
|---|---|
| 事件驅動模型 | RThreshold 觸發 OnComm 事件,無需輪詢 |
| VARIANT 資料格式 | SafeArray 封裝,需透過 parray->pvData 存取實際資料 |
| 二進位模式 | InputMode=1 可正確處理 0x00 等控制字元 |
| Sleep(100) 技巧 | 低波特率下確保封包完整,高速傳輸需改用封包協議 |
適合快速原型、教學、簡單儀器控制等場景。專案部署時記得將 mscomm32.ocx 納入安裝包並註冊。