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

C# 底層串口通訊類別:Win32 API 封裝與 DCB 結構完整實作

     編輯:關於C語言

設計定位

不使用 .NET SerialPort 類別,直接透過 P/Invoke 呼叫 Win32 API (kernel32.dll) 進行串口操作,提供更底層的控制能力。

核心結構定義

DCB (Device Control Block) 結構

對應 Win32 DCB 結構,包含完整通訊參數:

  • 鮑率 (BaudRate)、資料位 (ByteSize)、奇偶校驗 (Parity)、停止位 (StopBits)
  • 流控制旗標:fBinary、fParity、fOutxCtsFlow、fOutxDsrFlow、fDtrControl、fRtsControl 等
  • XON/XOFF 參數:XonChar、XoffChar、XonLim、XoffLim
  • 特殊字元:ErrorChar、EofChar、EvtChar

COMMTIMEOUTS 結構

ReadIntervalTimeout
ReadTotalTimeoutMultiplier
ReadTotalTimeoutConstant
WriteTotalTimeoutMultiplier
WriteTotalTimeoutConstant

OVERLAPPED 結構

支援重疊 I/O (非同步) 操作。

Win32 API 匯入宣告

[DllImport("kernel32.dll")]
static extern int CreateFile(string lpFileName, uint dwDesiredAccess, 
    int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition,
    int dwFlagsAndAttributes, int hTemplateFile);

[DllImport("kernel32.dll")]
static extern bool GetCommState(int hFile, ref DCB lpDCB);

[DllImport("kernel32.dll")]
static extern bool BuildCommDCB(string lpDef, ref DCB lpDCB);

[DllImport("kernel32.dll")]
static extern bool SetCommState(int hFile, ref DCB lpDCB);

[DllImport("kernel32.dll")]
static extern bool GetCommTimeouts(int hFile, ref COMMTIMEOUTS lpCommTimeouts);
[DllImport("kernel32.dll")]
static extern bool SetCommTimeouts(int hFile, ref COMMTIMEOUTS lpCommTimeouts);

[DllImport("kernel32.dll")]
static extern bool ReadFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToRead,
    ref int lpNumberOfBytesRead, ref OVERLAPPED lpOverlapped);

[DllImport("kernel32.dll")]
static extern bool WriteFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToWrite,
    ref int lpNumberOfBytesWritten, ref OVERLAPPED lpOverlapped);

[DllImport("kernel32.dll")]
static extern bool CloseHandle(int hObject);
[DllImport("kernel32.dll")]
static extern uint GetLastError();

核心操作流程

Open - 開啟與設定串口

  1. CreateFile 取得通訊裝置控制代碼 (GENERIC_READ | GENERIC_WRITE、OPEN_EXISTING、FILE_FLAG_OVERLAPPED)
  2. GetCommTimeouts 取得目前逾時設定,修改 ReadTotalTimeoutConstant 後 SetCommTimeouts
  3. GetCommState 取得目前 DCB,填入鮑率、旗標、資料位、奇偶、停止位
  4. SetCommState 套用設定

Read / Write

public byte[] Read(int numBytes)
{
    byte[] buf = new byte[numBytes];
    OVERLAPPED ovl = new OVERLAPPED();
    int bytesRead = 0;
    ReadFile(hComm, buf, numBytes, ref bytesRead, ref ovl);
    byte[] result = new byte[bytesRead];
    Array.Copy(buf, result, bytesRead);
    return result;
}

public void Write(byte[] writeBytes)
{
    OVERLAPPED ovl = new OVERLAPPED();
    int bytesWritten = 0;
    WriteFile(hComm, writeBytes, writeBytes.Length, ref bytesWritten, ref ovl);
}

輔助工具:HexCon

提供位元組陣列與十六進位字串雙向轉換。

適用場景

  • 需精確控制 DCB 旗標的特殊通訊協定
  • 需使用重疊 I/O 進行高效能非同步傳輸
  • 需繞過 SerialPort 類別限制的進階應用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved