[英]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.