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

Win32 API 實作序列埠通訊:從開啟埠到多執行緒收發完整指南

     編輯:關於VC++

程式介面示意

本文介紹 Win32 平台以檔案操作方式實作序列埠通訊,使用 kernel32.lib 提供的 API。Windows 將序列埠視為檔案裝置,透過 CreateFile 取得控制代碼後,即可用標準檔案 I/O 函式收發資料。並說明多執行緒架構讓收發、GUI 並行運作。

核心步驟與 API

1. 建立埠控制代碼

HANDLE hPort = CreateFile(
    "COM1",                    // 埠名稱
    GENERIC_READ | GENERIC_WRITE, // 讀寫模式
    0,                         // 不共享
    NULL,                      // 預設安全性
    OPEN_EXISTING,             // 開啟現有裝置
    0,                         // 預設屬性
    NULL);                     // 無樣板檔案

2. 取得與修改裝置控制區塊 (DCB)

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 會重新初始化硬體但不清空緩衝區。

3. 設定通訊逾時 (COMMTIMEOUTS)

COMMTIMEOUTS cto = {
    100, // ReadIntervalTimeout: 字元間最大間隔
    3,   // ReadTotalTimeoutMultiplier: 每位元組乘數
    2,   // ReadTotalTimeoutConstant: 讀取固定逾時
    3,   // WriteTotalTimeoutMultiplier: 寫入每位元組乘數
    2    // WriteTotalTimeoutConstant: 寫入固定逾時
};
SetCommTimeouts(hPort, &cto);

總逾時 = Multiplier × 位元組數 + Constant。設定得當可避免讀寫無限期阻塞。

4. 發送資料 (WriteFile)

DWORD dwWritten;
WriteFile(hPort, pBuffer, nBytes, &dwWritten, NULL);

5. 接收資料 (ReadFile)

DWORD dwRead;
ReadFile(hPort, pBuffer, nBytes, &dwRead, NULL);

6. 關閉埠 (CloseHandle)

CloseHandle(hPort);

多執行緒架構設計

為達到同時處理「讀取資料」、「發送資料」、「GUI 回應」三大任務,建議採用多執行緒:

  • 主執行緒:處理視窗訊息、使用者介面
  • 工作執行緒:封裝序列埠讀寫邏輯,透過事件/訊息與主執行緒通訊

同步阻塞模式下,ReadFile 會依逾時設定返回,配合工作執行緒輪詢或事件通知,可構建高回應性的通訊程式。

關鍵參數對照表

DCB 成員說明預設值
BaudRate鮑率9600
StopBits0=1, 1=1.5, 2=20
Parity0=無, 1=奇, 2=偶, 3=標記, 4=空白0
ByteSize資料位 4-88

序列埠設定監看視窗

圖:典型通訊預設值監看

完整錯誤處理

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved