我正在研究一些基本的串行通信,我遇到过这个问题,我似乎无法解决这个问题。我正在尝试将通信状态设置为某个波特率,停止位,奇偶校验位和数据大小。如下面的示例代码所示,我从getComState获取当前的COM状态并修改了一些值。
DCB dcb = { 0 };
// for set timeout for readfile function
COMMTIMEOUTS timeouts = { 0, // interval timeout. 0 = not used
0, // read multiplier
500, // read constant (milliseconds)
0, // Write multiplier
500 // Write Constant
};
if (SetCommTimeouts(usb_device, &timeouts) == FALSE) {
"ERROR: SetCommTimeouts failed with error %d.\n", GetLastError();
add_log_trace("ERROR: SetCommTimeouts failed with error %d.\n", GetLastError());
}
BOOL fSuccess;
// Initialize the DCB structure.
SecureZeroMemory(&dcb, sizeof(DCB));
dcb.DCBlength = sizeof(DCB);
// Build on the current configuration by first retrieving all current
// settings.
fSuccess = GetCommState(usb_device, &dcb);
// Fill in some DCB values and set the com state:
// 115,200 bps, 8 data bits, no parity, and 1 stop bit.
dcb.BaudRate = CBR_115200; // baud rate
dcb.ByteSize = 8; // data size, xmit and rcv
dcb.Parity = NOPARITY; // parity bit
dcb.StopBits = ONESTOPBIT; // stop bit
fSuccess = SetCommState(usb_device, &dcb);
然而,无论我做什么,这个功能都会让我失望。该错误非常简单(error code 87),表示存在无效参数。经过一些研究后,解决方案似乎非常明显。但是,我尝试了下面列出的解决方案,包括一些健全性测试,似乎没有任何效果。
我还考虑了MSDN开发人员在使用SetComState函数时留下的评论,但是,函数调用仍然会失败。
我尝试在linux机器上运行类似的代码并设置com端口正常。我遇到了一些文章,他们声称Windows搞砸了他们的usbser.sys文件,该文件处理操作系统和设备之间的通信。
我很想尝试用较旧的文件替换usbser.sys文件,但我想就此问题提出第二意见。这是一个常见的问题吗?有更直接的解决方案吗?如果有人能指出我正确的方向或者在我的一些假设和方法中纠正我,我会很感激。希望这篇文章在范围方面不是太过分。我只是想用SetCommState设置我的波特率。 LOLZ。
谢谢