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;

除非你是主动换信号线,否则是用DCB里设置的值吗?
除此之外,您自己控制信号线,因此每次更改时都应该记住它。

只要您打开串口,您就拥有所有控制权,其他一切都不会改变。
现在没有人用handshake或者toggle模式吗?

SetDefaultCommConfigW function

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

SetCommConfig function

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

GetCommConfig function

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

COMMCONFIG structure

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

DCB structure

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()。
但是,不能保证它得到适当的支持,因为大多数人不会使用它。

Device Input and Output Control (IOCTL)
DeviceIoControl function

以下是磁盘驱动器的 DeviceIoControl 调用示例,但您可以通过将这些参数中的每一个更改为与串行端口的 IOCTL_SERIAL_GET_DTRRTS 相关的参数来调用它。
Calling DeviceIoControl

Serial Device Control Requests
IOCTL_SERIAL_GET_DTRRTS IOCTL

使用inc\api\ntddser.hAPI和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 here.

的文档