Ошибка GetCommState с кодом 87 - PullRequest
0 голосов
/ 13 мая 2011

Сбой GetCommState с кодом ошибки 87.

Может ли этот системный вызов использоваться с любым типом последовательного порта? У меня есть карта USART RS422. Порт можно настроить как Sync или Async. Я настроил его как Async и использовал boost: asio. Я заметил ошибку во время пошагового выполнения кода и оказался в приведенном ниже коде в файле надстройки. Я взял его и положил в свой основной вместе с вызовом CreateFile прямо перед ним. Я получаю хороший дескриптор (дескриптор не INVALID_HANDLE_VALUE). Я не могу заставить его вернуться успешно. Есть идеи? Я позвонил в техподдержку последовательной карты, и мне сказали, что этот звонок должен работать.

Вот мой код:

using namespace std; // For memset.
DCB dcb;
//memset(&dcb, 0, sizeof(DCB));
SecureZeroMemory(&dcb, sizeof(DCB)); // tried this from a suggestion I saw online somewhere
dcb.DCBlength = sizeof(DCB);
if (!GetCommState(hDevice, &dcb))
{
  DWORD last_error = ::GetLastError();
  CloseHandle(hDevice);
  exit(1);
 // ec = boost::system::error_code(last_error,
 //   boost::asio::error::get_system_category());
//return ec;
}

1 Ответ

0 голосов
/ 22 мая 2011

Если вы работали на платформе * NIX, посмотрите /usr/include/errno.h (где, вероятно, есть #include для /usr/include/sys/errno.h) и посмотрите, что совпадает с вашим кодом возврата , Так как вы работаете в Windows, вам придется использовать MSDN. Код ошибки 87:

ERROR_INVALID_PARAMETER 87  One of the parameters was invalid.

Я полагаю, что GetCommState () не нравится ваш параметр hDevice. Вызов SecureZeroMemory () не требуется, если вы используете memset (). Вы проверили, установлены ли все необходимые параметры dcb относительно hDevice?

...