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

基於 PcommPro 的串口通訊開發全攻略:從安裝到中斷驅動收發

     編輯:VC 教學

為什麼選 PcommPro?

Windows 串口編程涉及複雜的 API(CreateFile、SetCommState、WaitCommEvent、Overlapped I/O)與多執行緒同步,門檻極高。MOXA PcommPro 將底層封裝為 sio_xxx() 系列 C 函數,提供 DLL + 靜態庫 + 頭文件,讓 BCB 開發者以「事件驅動」方式輕鬆實現收發。

環境配置三步走

  1. 加入靜態庫:專案管理器 → 右鍵 Add → 選擇 PcommPro\Lib\PcommB.lib(BCB 專用 .lib)。
  2. 包含頭文件:#include "PComm.h"(路徑視安裝目錄調整)。
  3. 部署 DLL:編譯後將 Pcomm.dll 放入 EXE 同目錄或系統路徑。

表單佈局與關鍵變量

  • 按鈕:BtnOpen、BtnSend、BtnClose
  • 編輯框:EdtSend (AnsiString)、EdtRecv (AnsiString)
  • 全域變量:int port = 1; // COM1

核心代碼實現

打開串口並設置中斷

void __fastcall TForm1::BtnOpenClick(TObject *Sender) {
    sio_open(port);                                   // 打開 COM1
    sio_ioctl(port, B2400, P_NONE | BIT_7 | STOP_1); // 2400,7,N,1
    // 註冊中斷回調:當接收緩衝區有數據觸發
    void __stdcall (*p)(int) = CntIrq;
    sio_cnt_irq(port, p, 1); // 觸發閾值=1字節
}

發送數據

void __fastcall TForm1::BtnSendClick(TObject *Sender) {
    char* buf = EdtSend->Text.c_str(); // AnsiString → char*
    sio_write(port, buf, strlen(buf));
}

關閉串口

void __fastcall TForm1::BtnCloseClick(TObject *Sender) {
    sio_close(port);
}

中斷服務程序(手工編寫)

void __stdcall CntIrq(int port) {
    char ibuf[256];
    int len = sio_read(port, ibuf, sizeof(ibuf)); // 讀取可用數據
    if (len > 0) {
        ibuf[len] = '\0';
        // char* → AnsiString 並顯示(注意:跨執行緒更新 UI 需 Synchronize/PostMessage)
        Form1->EdtRecv->Text = AnsiString(ibuf);
    }
}

關鍵函數速查表

函數說明
sio_open(port)打開指定端口
sio_close(port)關閉端口
sio_ioctl(port, baud, mode)設置波特率、校驗、數據位、停止位
sio_write(port, buf, len)發送數據
sio_read(port, buf, len)接收數據
sio_cnt_irq(port, callback, count)設置接收中斷:緩衝區達 count 字節觸發 callback

進階擴展:用戶可配置參數

在表單加入 ComboBox(端口)、ComboBox(波特率)、RadioGroup(校驗/數據位/停止位)、CheckBox(流控),將上述硬編碼參數改為讀取控件屬性,即可實現通用串口調試工具。

常見問題

  • 跨執行緒 UI 更新崩潰:中斷回調非主執行緒,必須用 PostMessage、Synchronize 或 TThread::Queue 轉發到主執行緒更新控件。
  • 資料截斷/亂碼:檢查雙方波特率、校驗位、流控一致;啟用硬體流控 (RTS/CTS) 可大幅減少高速傳輸丟包。
  • 多端口並發:每個端口對應獨立回調函數或傳入 port 參數區分,建議封裝 TSerialPort 類管理多實例。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved