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

C++ Builder 串行通信編程實戰:Windows API 與 MSComm32 控件方案

     編輯:關於C++

C++ Builder 串口編程不再直接操作硬件,而是通過 Windows API 或 ActiveX 控件實現。本文對比兩種方案並給出完整代碼示例。

方案一:Windows API 函數

核心函數:

  • CreateFile - 打開串口設備(\\.\COM1)
  • GetCommState / SetCommState - 獲取/設置通信參數(波特率、校驗位等)
  • ReadFile / WriteFile - 數據收發
  • SetCommTimeouts - 設置超時屬性
  • CloseHandle - 關閉串口

方案二:MSComm32.OCX 控件(VB 遺產)

Builder 3/4 中導入後,Input/Output 屬性為 OleVariant 類型,需特殊處理:

發送數據

OleVariant TxBuff;
TxBuff = VarArrayCreate(OPENARRAY(int, (0, n)), varByte);
for (int i = 0; i < n; i++)
    TxBuff.PutElement(buf[i], i);
MSComm1->Output = TxBuff;

接收數據

OleVariant RxBuff;
if (MSComm1->InBuffCount > 0) {
    RxBuff = MSComm1->Input;
    int ByteNum = RxBuff.ArrayHighBound(1);
    for (int i = 0; i <= ByteNum; i++)
        buff[BuffPtr++] = RxBuff.GetElement(i);
}

事件驅動與輪詢

  • OnComm 事件:設置 RThreshold 門檻值觸發
  • ⚠️ OnComm 不可靠,易丟失事件
  • 推薦:使用 Timer 定時輪詢 InBuffCount

關鍵屬性設置

建議:新項目優先使用 Windows API,舊項目維護可用 MSComm32 但需注意其局限性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
屬性說明
CommPort串口號(1=COM1)
Settings如 "9600,n,8,1"
RThreshold接收觸發字節數,0=不觸發事件
InputMode0=文本,1=二進制