Сначала необходимо открыть порт в асинхронном режиме.Для этого передайте флаг FILE_FLAG_OVERLAPPED
на CreateFile
.Затем, когда вы вызываете ReadFile
, передаете указатель на структуру OVERLAPPED
.Это делает асинхронное чтение и немедленно возвращает ERROR_IO_PENDING
без блокировки (или, если в ОС уже есть данные в буфере, вам может повезти и вы получите успешное чтение - будьте готовы обработать этот случай).
После запуска асинхронного ввода-вывода вы можете периодически проверять, завершилось ли оно с помощью GetOverlappedResult
.
. Это позволяет вам ответить на вопрос "доступны ли X байтов данных?"для определенного значения X (переданного ReadFile
).В 95% случаев этого достаточно, поскольку вы ищете данные в определенном формате.Остальные 5% времени вам нужно будет добавить еще один уровень вершины абстракции, где вы продолжаете выполнять асинхронное чтение и хранить данные в буфере.
Обратите внимание, что асинхронный ввод-вывод очень сложен дляполучить право, и есть много крайних случаев для рассмотрения.Внимательно прочитайте всю документацию по этим функциям, чтобы убедиться в правильности кода.