2

windows平台下如何获取串口的DTR和RTS状态?我想读取这两个引脚的当前状态(开或关)。

我可以设置引脚:

EscapeCommFunction(hSerial,SETRTS);

但我不知道如何读取引脚状态。

由于在 Linux 上,可以使用以下代码完成,我认为它在技术上是可行的:

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

2 回答 2

1

使用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 关于这里的文档。

于 2019-12-29T06:02:25.397 回答
0

除非您主动更改信号线,否则是否使用 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 函数

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

串行设备控制请求
IOCTL_SERIAL_GET_DTRRTS IOCTL

于 2019-12-22T23:35:08.440 回答