Чтение с коммуникационного ресурса - PullRequest
2 голосов
/ 12 июля 2011

Я хочу прочитать некоторые данные с устройства, подключенного к COM-порту.

  • HANDLE handle =CreateFileW(L"\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

    дает мне действительный HANDLE, который затем настраивается через GetCommState и SetCommState.

  • OVERLAPPED ol = {0};

    char buffer[1024];

    ol.Offset = 0;

    ol.OffsetHigh = 0;

    ReadFileEx(handle, buffer, 1, &ol, NULL);

    Проблема в том, что этот вызов не выполняется и GetLastError() возвращает 87 (ERROR_INVALID_PARAMETER).

Что я могу попытаться прочитать с устройства?

Ответы [ 2 ]

1 голос
/ 07 августа 2011

Существует также ошибка в реализации MS ReadFileEx.Несмотря на документацию, в которой четко указано, что не следует полностью отвечать на возвращаемый результат BOOL и что следует также проверять GetLastError(), реализация не может устранить любую ранее существовавшую ошибку.Добавьте SetLastError(ERROR_SUCCESS) перед вызовом ReadFileEx().

1 голос
/ 12 июля 2011

В документации ReadFileEx указано, что

Функция ReadFileEx игнорирует hEvent структуры OVERLAPPED член. Приложение может свободно использовать этот элемент в своих целях. в контексте вызова ReadFileEx. ReadFileEx сигнализирует о завершении его операция чтения путем вызова или постановки в очередь вызова завершения подпрограмма, на которую указывает lpCompletionRoutine, поэтому она не нуждается в дескриптор события.

Так что, хотя в нем также говорится, что процедура завершения является необязательной, она, вероятно, необходима. Также обратите внимание на комментарий сообщества внизу страницы, на которую вы ссылались - MS, возможно, исправила эту ошибку, считая NULL lpCompletionRoutine ошибкой. Тем не менее, я не проверял это, чтобы проверить.

Если вы не используете подпрограмму завершения, вы можете использовать обычный ReadFile для перекрывающейся операции.

...