SetCommState函数失败(错误87)

时间:2018-03-11 05:32:10

标签: c winapi serial-port embedded usb

我正在研究一些基本的串行通信,我遇到过这个问题,我似乎无法解决这个问题。我正在尝试将通信状态设置为某个波特率,停止位,奇偶校验位和数据大小。如下面的示例代码所示,我从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。

谢谢

0 个答案:

没有答案