ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 июля
661473 Топик полностью
Mebius (19.03.2016 21:09, просмотров: 128) KLIM83 ответил Mebius на Други, владеющие Win32! Помогите Христа ради! Почему GetOverlappedResult упорно возвращает мне 4 байта, в то время как я посылаю 14? Код ниже. Цель кода - принять посылку произвольной длины.
В общем, други мои, разобрался я с асинхронным чтением из компорта :) 1. События, которые ловит WaitCommEvent действительно генерируются драйвером компорта, но они никак не связаны с работой ReadFile. Они генерируются намного раньше, чем драйвер будет готов отдать принятые данные функции ReadFile. И если ReadFile вызывать по этому событию она возвратит что-то фиг знает что. 2. Поскольку CreateFile мы запускали с флагом OVERLAPPED, и ReadFile запускаем с указателем на OVERLAPPED структуру, то система запускает эту ReadFile в отдельном потоке и там она висит пока не примет кол-во байт которое указано в 3-м аргументе, либо по сработке таймаутов ReadIntervalTimeout или WriteTotalTimeoutMultiplier*WriteTotalTimeoutConstant. Но, ЛЯДЬ! НИГДЕ ЖЕ НЕ СКАЗАНО что по завершению работы эта ReadFile так же выставляет евент в OVERLAPPED структуре в сработавшее состояние! До всего приходится доходить опытным путём! В общем, SetCommMask и WaitCommEvent выкидываем, SetCommTimeouts заряжаем нужными тайм-аутами (мне например, нужен только ReadIntervalTimeout) и спокойно ждём WaitForSingleObject. Очень удобно, прогрессивно и инновационно :)