Windows 串口編程涉及複雜的 API(CreateFile、SetCommState、WaitCommEvent、Overlapped I/O)與多執行緒同步,門檻極高。MOXA PcommPro 將底層封裝為 sio_xxx() 系列 C 函數,提供 DLL + 靜態庫 + 頭文件,讓 BCB 開發者以「事件驅動」方式輕鬆實現收發。
PcommPro\Lib\PcommB.lib(BCB 專用 .lib)。#include "PComm.h"(路徑視安裝目錄調整)。Pcomm.dll 放入 EXE 同目錄或系統路徑。BtnOpen、BtnSend、BtnCloseEdtSend (AnsiString)、EdtRecv (AnsiString)int port = 1; // COM1void __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(流控),將上述硬編碼參數改為讀取控件屬性,即可實現通用串口調試工具。
PostMessage、Synchronize 或 TThread::Queue 轉發到主執行緒更新控件。TSerialPort 類管理多實例。