юзаю такой вот тред: Код (Text): tproc proc param:DWORD .while tflag != 0 invoke WaitCommEvent,hcom,addr mask,addr ovr .endw ret tproc endp Добавки пока не цепляю, ибо и так не работает. В основном треде при определенном WM_COMMAND происходит: Код (Text): ... ; sCOM db "\\.\COM2",0 invoke CreateFile,addr sCOM,GENERIC_READ or GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL ... ; Далее SetupComm/GetCommState/SetCommState/GetCommTimeouts/SetCommTimeouts ... invoke SetCommMask,hcom,EV_RXCHAR ... mov tflag,1 ; здесь стуктура ovr заполняется нулями invoke CreateEvent,0,TRUE,FALSE,0 mov ovr.hEvent,eax ; tid dd ? invoke CreateThread,NULL,NULL,addr tproc,NULL,0,addr tid invoke CloseHandle,eax При работе треда portmon'ом (из SysInternals) наблюдаю непрерывные (всмысле их много ошибки: Код (Text): ;... request port result ... IOCTL_SERIAL_WAIT_ON_MASK Serial1 INVALID_PARAMETR в чем проблема? А вообще задача сводится к тому, что нужно получать пакован байтов из порта (от устройства), быстренько его туда-сюда и ждем следующего, пакован приходит чаще, чем раз в секунду. Кто работал с портами, подскажите в чем моя проблема или посоветуйте более эффективное решение. ps. Кстати, в чем же заключается суть OVERLAPPED? Когда ее и как именно использовать? Перед каждым Write(Read)File или как бы на один сеанс?
Процедура считывает строки из ком порта, я ее писал для чтения штрих-кодов со сканера COM_PARAM struct lpszCom dd ? ;адрес ком порта например 'com1' hWnd dd ? ;этому окну будет приходить wm_comport lpol dd ? ; указатель на OVERLAPPED COM_PARAM ends 2080875631__ComPort.asm
Спасибо - помогло. Восновном были проблемы с таймаутами и ивентом. А запись? Подойдут ли такие же таймауты? С ивентом работать примерно так? : - где-нить делаем: CreateFile/настройки/CreateEvent - затем при каждой записи: WriteFile/ResetEvent и таким образом юзать один ивент? так правильно будет?