
本文介紹 Win32 平台以檔案操作方式實作序列埠通訊,使用 kernel32.lib 提供的 API。Windows 將序列埠視為檔案裝置,透過 CreateFile 取得控制代碼後,即可用標準檔案 I/O 函式收發資料。並說明多執行緒架構讓收發、GUI 並行運作。
HANDLE hPort = CreateFile(
"COM1", // 埠名稱
GENERIC_READ | GENERIC_WRITE, // 讀寫模式
0, // 不共享
NULL, // 預設安全性
OPEN_EXISTING, // 開啟現有裝置
0, // 預設屬性
NULL); // 無樣板檔案
DCB dcb;
GetCommState(hPort, &dcb); // 取得目前設定
dcb.BaudRate = 9600; // 鮑率
dcb.StopBits = ONESTOPBIT; // 停止位
dcb.Parity = NOPARITY; // 校驗
dcb.ByteSize = 8; // 資料位
SetCommState(hPort, &dcb); // 套用設定
典型預設值:9600,N,8,1。SetCommState 會重新初始化硬體但不清空緩衝區。
COMMTIMEOUTS cto = {
100, // ReadIntervalTimeout: 字元間最大間隔
3, // ReadTotalTimeoutMultiplier: 每位元組乘數
2, // ReadTotalTimeoutConstant: 讀取固定逾時
3, // WriteTotalTimeoutMultiplier: 寫入每位元組乘數
2 // WriteTotalTimeoutConstant: 寫入固定逾時
};
SetCommTimeouts(hPort, &cto);
總逾時 = Multiplier × 位元組數 + Constant。設定得當可避免讀寫無限期阻塞。
DWORD dwWritten;
WriteFile(hPort, pBuffer, nBytes, &dwWritten, NULL);
DWORD dwRead;
ReadFile(hPort, pBuffer, nBytes, &dwRead, NULL);
CloseHandle(hPort);
為達到同時處理「讀取資料」、「發送資料」、「GUI 回應」三大任務,建議採用多執行緒:
同步阻塞模式下,ReadFile 會依逾時設定返回,配合工作執行緒輪詢或事件通知,可構建高回應性的通訊程式。
| DCB 成員 | 說明 | 預設值 |
|---|---|---|
| BaudRate | 鮑率 | 9600 |
| StopBits | 0=1, 1=1.5, 2=2 | 0 |
| Parity | 0=無, 1=奇, 2=偶, 3=標記, 4=空白 | 0 |
| ByteSize | 資料位 4-8 | 8 |

圖:典型通訊預設值監看
每個 API 呼叫皆需檢查回傳值,失敗時透過 GetLastError() 取得錯誤碼,並以 AfxMessageBox 或日誌記錄,確保程式健壯性。