簡體   English   中英

在Windows平台上用C語言獲取串口的DTR和RTS引腳

[英]Getting DTR and RTS pin of serial port in C on Windows platform

如何在windows平台上獲取串口的DTR和RTS狀態? 我想讀取這兩個引腳的當前狀態(ON 或 OFF)。

我可以設置引腳:

EscapeCommFunction(hSerial,SETRTS);

但我不知道如何讀取引腳狀態。

由於在 Linux 上,可以使用以下代碼完成,我認為它在技術上可行:

int status=0;
ioctl(fd, TIOCMGET, &status);
return status & TIOCM_RTS;

使用inc\\api\\ntddser.h API 和winioctl.h ,您可以訪問 DTR 和 RTS 狀態。 調用 DeviceIoControl,將第二個參數設置為IOCTL_SERIAL_GET_DTRRTS

稱呼:

DeviceIoControl(
    handle, // handle returned by CreateFile
    IOCTL_SERIAL_GET_DTRRTS,
    NULL,
    0,
    &Status, // pointer to a DWORD variable 1
    sizeof(Status),
    &unused, // pointer to a DWORD variable
    pOverlapped // optional pointer to overlapped buffer (may be NULL)
);

關於DeviceIoControl文檔在這里

除非你主動改變信號線,否則使用DCB中設置的值嗎?
除此之外,您自己控制信號線,因此每次更改時都應記住它。

只要您打開串行端口,您就擁有所有控制權,其他任何事情都不會改變。
現在沒有人使用握手或切換模式嗎?

SetDefaultCommConfigW 函數

BOOL SetDefaultCommConfigW( LPCWSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize );

SetCommConfig 函數

BOOL SetCommConfig( HANDLE hCommDev, LPCOMMCONFIG lpCC, DWORD dwSize );

GetCommConfig 函數

BOOL GetCommConfig( HANDLE hCommDev, LPCOMMCONFIG lpCC, LPDWORD lpdwSize );

COMMCONFIG 結構

typedef struct _COMMCONFIG { ... DCB dcb; ... } COMMCONFIG, *LPCOMMCONFIG;

DCB結構

typedef struct _DCB { DWORD DCBlength; ... DWORD fDtrControl : 2; ... DWORD fRtsControl : 2; ... } DCB, *LPDCB; DTR_CONTROL_DISABLE 0x00 DTR_CONTROL_ENABLE 0x01 DTR_CONTROL_HANDSHAKE 0x02 RTS_CONTROL_DISABLE 0x00 RTS_CONTROL_ENABLE 0x01 RTS_CONTROL_HANDSHAKE 0x02 RTS_CONTROL_TOGGLE 0x03

如果您仍然想這樣做,請使用@Hans Passant 評論的 DeviceIoControl()。
但是,不能保證它得到適當的支持,因為大多數人不會使用它。

設備輸入和輸出控制 (IOCTL)
DeviceIoControl 函數

以下是磁盤驅動器的 DeviceIoControl 調用示例,但您可以通過將這些參數中的每一個更改為與串行端口的 IOCTL_SERIAL_GET_DTRRTS 相關的參數來調用它。
調用 DeviceIoControl

串行設備控制請求
IOCTL_SERIAL_GET_DTRRTS IOCTL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM