Да, использование портов завершения ввода / вывода для последовательного ввода / вывода работает нормально. Для создания дескриптора файла для последовательного порта, подходящего для IOCP, требуется некоторая настройка. Но как только настройка завершена, вы можете выполнять асинхронные операции ReadFile()
и WriteFile()
, как с обычными файловыми дескрипторами и дескрипторами сокетов.
Настройка в основном:
- Открытый последовательный порт с
CreateFile()
передачей значения FILE_FLAG_OVERLAPPED
в качестве параметра dwFlagsAndAttributes
.
- Измените состояние последовательного порта, используя
GetCommState()
и SetCommState()
. Делайте это так же, как если бы вы не использовали IOCP.
- Используйте
GetCommTimeouts()
и SetCommTimeouts()
, чтобы отключить общее время ожидания для операций чтения, поскольку обычно не имеет смысла устанавливать время ожидания для асинхронных операций. (Вместо этого вы бы явно вызвали CancelIO()
для отмены операции чтения.) Отключение общего тайм-аута выполняется путем установки нулевых полей ReadTotalTimeoutMultiplier
и ReadTotalTimeoutConstant
структуры COMMTIMEOUTS
.
Теперь вы можете использовать дескриптор с IOCP так же, как вы это делаете с обычными файловыми дескрипторами и дескрипторами сокетов. То есть присоедините дескриптор к порту завершения, используя CreateIoCompletionPort()
, инициируйте операции ввода-вывода с помощью ReadFile()
или WriteFile()
, используя структуру OVERLAPPED
, завершите удаление из очереди, завершили сбой или отменили операции из порта завершения, используя функцию GetQueuedCompletionStatus()
.
Дополнительные события, специфичные для последовательного порта, также могут быть получены асинхронно с помощью функции WaitCommEvent()
.