Ошибка SetCommState в Windows 7 - PullRequest
       0

Ошибка SetCommState в Windows 7

4 голосов
/ 14 сентября 2010

У нас есть код, который взаимодействует с нашим устройством класса USB COMM, который отлично работает в Windows XP, но не работает в Windows 7. В частности, вызов SetCommState не выполняется.Вот упрощенный фрагмент.Обратите внимание, что в этом случае мы даже не изменяем никакие поля из GetCommState, но в результате происходит сбой SetCommState с кодом ошибки 87 (недопустимый параметр).

DCB dcb;

SecureZeroMemory(&dcb, sizeof(DCB));
dcb.DCBlength = sizeof(DCB);
if (!GetCommState(m_hIDComDev, &dcb)) {
    DWORD dwError = GetLastError();
    CloseHandle(m_hIDComDev);
    dlDebug(5, "SerialPort::openPort") << "GetCommState failed for" << m_portName << dwError;
    return 0;
}

dlDebug(5, "SerialPort::openPort") << m_portName << "rate" << dcb.BaudRate << "size" << dcb.ByteSize;

// dcb.BaudRate = baud;
// dcb.ByteSize = 8;
if (!SetCommState(m_hIDComDev, &dcb)) {
    DWORD dwError = GetLastError();
    CloseHandle(m_hIDComDev);
    dlDebug(5, "SerialPort::openPort") << "SetCommState failed for" << m_portName << dwError;
    return 0;
}

Любые идеи о том, что может быть не так?Одна мысль состоит в том, что дескриптор USB-устройства неверен, и Win7 более строго относится к двойной проверке (но я немного скептически отношусь к этому, поскольку устройство отлично работает под MacOS X и Linux без проблем).Я в тупике!

1 Ответ

1 голос
/ 22 сентября 2010

Если вы работаете с 64-битной версией, возможно, вам нужно установить dcb.DCBLength не для sizeof (DCB), а для следующего наибольшего значения, кратного 8.

...