windows平台下如何获取串口的DTR和RTS状态?我想读取这两个引脚的当前状态(开或关)。
我可以设置引脚:
EscapeCommFunction(hSerial,SETRTS);
但我不知道如何读取引脚状态。
由于在 Linux 上,可以使用以下代码完成,我认为它在技术上是可行的:
int status=0;
ioctl(fd, TIOCMGET, &status);
return status & TIOCM_RTS;
windows平台下如何获取串口的DTR和RTS状态?我想读取这两个引脚的当前状态(开或关)。
我可以设置引脚:
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 中设置的值?
除此之外,您自己控制信号线,因此每次更改时都要记住它。
只要您打开串行端口,您就可以控制一切,其他任何事情都不会改变。
现在没有人使用握手或切换模式吗?
BOOL SetDefaultCommConfigW( LPCWSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize );
BOOL SetCommConfig( HANDLE hCommDev, LPCOMMCONFIG lpCC, DWORD dwSize );
BOOL GetCommConfig( HANDLE hCommDev, LPCOMMCONFIG lpCC, LPDWORD lpdwSize );
typedef struct _COMMCONFIG { ... DCB dcb; ... } COMMCONFIG, *LPCOMMCONFIG;
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