[英]Disable CTS flow control on windows COM port
我正在使用SetCommState配置 COM 端口。
if (!BuildCommDCBA(
"baud=9600 parity=N data=8 stop=1",
&dcbSerialParams))
return;
SetCommState(myCOMHandle, &dcbSerialParams);
这似乎启用了我的硬件不支持的 CTS 流控制
_COMMCONFIG cfg;
DWORD sz = sizeof(cfg);
if (!GetCommConfig(
myCOMHandle, // Handle to the Serial port
&cfg,
&sz))
std::cout << "GetCommConfig FAILED\n";
DCB dcb = cfg.dcb;
std::cout << "\nBaudRate " << dcb.BaudRate
<< "\nfBinary " << dcb.fBinary
<< "\nfParity " << dcb.fParity
<< "\nfOutxCtsFlow " << dcb.fOutxCtsFlow ...
输出
BaudRate 9600
fBinary 1
fParity 0
fOutxCtsFlow 1
我试过使用
"baud=9600 parity=N data=8 stop=1 octs=off"
但这给出了相同的结果。
我也尝试过从 BuildCommDCBA 重写 output
dcbSerialParams.fOutxCtsFlow = 0;
if (!BuildCommDCBA(
"baud=9600 parity=N data=8 stop=1",
&dcbSerialParams))
return;
dcbSerialParams.fOutxCtsFlow = 0;
SetCommState(myCOMHandle, &dcbSerialParams);
但这也给出了相同的结果。
BuildCommDCBA的文档说明了这一点
模式语法有较旧和较新的 forms。 BuildCommDCB function 支持 forms。 但是,您不能将两个 forms 混合在一起。
较新形式的模式语法允许您显式设置 DCB 结构的流控制成员的值。 如果您使用较旧形式的模式语法,则 BuildCommDCB function 设置 DCB 结构的流控制成员,
这当然似乎与我的问题有关。 但是我找不到模式语法的新旧 forms 的描述。 我看过这个。
我可以假设我使用的是较新的吗? 为什么要设置 fOutxCtsFlow? 我怎样才能强制它取消设置?
根据MSDN :
BuildCommDCB function 仅调整 DCB 结构中受 lpDef 参数影响的那些成员...
因此,您需要确保所有其他字段都具有可接受的值。 最简单的方法是初始化
DCB dcbSerialParams = { 0 };
这应该通过将所有相关值设置为FALSE
或0
来禁用所有流控制。 只要您的字符串设置了所有其他重要的东西(波特率、奇偶校验、停止位和数据大小),这应该没问题。 特别是,您将获得:
fBinary = FALSE;
fNull = FALSE;
fErrorChar = FALSE;
fParity = FALSE;
fRtsControl = RTS_CONTROL_DISABLE;
fOutxCtsFlow = FALSE;
fOutX = FALSE;
fInX = FALSE;
fDtrControl = DTR_CONTROL_DISABLE;
fOutxDsrFlow = FALSE;
另一种选择是通过调用其中一个来初始化字段
GetCommConfig()
-检索通信设备的当前配置。GetDefaultCommConfigA()
-检索指定通信设备的默认配置。GetCommState()
-检索指定通信设备的当前控制设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.