序列埠通訊分同步(共享時脈、效率高)與非同步(字元為單位、靈活)兩種。Win32 API 支援同步/非同步 I/O,但同步模式在 Win9x/NT 差異導致執行緒阻塞問題,工業級應用普遍採用非同步模式。三種開發方式:
CreateFile 開啟埠 → Get/SetCommState 設定 DCB → SetCommMask 設定事件 → CreateThread + WaitCommEvent 監視執行緒 → ReadFile/WriteFile 傳輸。功能強但程式碼龐大、需深厚系統知識。| 屬性 | 說明 |
|---|---|
| CommPort | 序列埠號(預設 1) |
| Settings | 通訊參數「Baud,Parity,Data,Stop」 |
| PortOpen | 開啟/關閉埠 |
| InBufferSize/Count | 接收緩衝區大小/待讀位元組數 |
| RThreshold | 接收觸發閾值,達到觸發 OnComm |
| SThreshold | 發送緩衝區低水位觸發閾值 |
| InputLen/Input | 讀取長度/讀取資料 |
| InputMode | 資料類型:文字/二進位陣列 |
| Output/OutBufferSize/Count | 發送資料/發送緩衝區大小/待送數量 |
OnComm 事件由 CommEvent 代碼區分:1=發送閾值、2=接收閾值、1004=幀錯誤、1008=接收溢位、1010=發送溢位、1009=奇偶校驗錯、7=EOF字元。
控制命令格式(定長資料包):
非索取資料命令時起迄時間為 0。下位機上傳資料包格式:
標誌 0xFFFF、序號校驗、結束標誌 0xFFFF。序號錯誤觸發重傳命令(起始時間填入需重傳序號)。
二進位資料接收與轉換:
vDataBuffer: OleVariant;
DataBuffer: Variant;
vDataBuffer := MSComm1.Input; // 讀取二進位資料
DataBuffer := VarArrayCreate([0, 2048], varByte); // 建立位元組陣列
DataBuffer := vDataBuffer; // 轉換為可索引陣列
監視執行緒邏輯: 主執行緒發送命令後啟動監視執行緒,每收 1032 位元組檢查結束標誌與序號。錯誤通知主執行緒重傳;收到結束標誌通知主執行緒處理資料、銷毀監視執行緒。
系統已應用於遠端心電醫療診斷軟體,運行穩定、差錯控制優異。進階開發可考慮 DSPack(DirectShow/DirectX 元件套件,支援 DirectX 9、Win9x/ME/2000/XP),提供更豐富的多媒體串流處理能力。視訊聊天實現核心在於壓縮編碼、網路傳輸、解碼顯示,工程挑戰不容小覷。