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