чтение из com-порта через WaitCommEvent

Тема в разделе "WASM.WIN32", создана пользователем freddy, 30 июл 2005.

  1. freddy

    freddy New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    2
    юзаю такой вот тред:


    Код (Text):
    1. tproc proc param:DWORD
    2.     .while tflag != 0
    3.         invoke  WaitCommEvent,hcom,addr mask,addr ovr
    4.     .endw
    5.     ret
    6. tproc endp




    Добавки пока не цепляю, ибо и так не работает.

    В основном треде при определенном WM_COMMAND происходит:
    Код (Text):
    1. ...
    2. ; sCOM db "\\.\COM2",0
    3. invoke  CreateFile,addr sCOM,GENERIC_READ or GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL
    4. ...
    5. ; Далее SetupComm/GetCommState/SetCommState/GetCommTimeouts/SetCommTimeouts
    6. ...
    7. invoke  SetCommMask,hcom,EV_RXCHAR
    8. ...
    9. mov tflag,1
    10. ; здесь стуктура ovr заполняется нулями
    11. invoke  CreateEvent,0,TRUE,FALSE,0
    12. mov  ovr.hEvent,eax
    13. ; tid dd ?
    14. invoke  CreateThread,NULL,NULL,addr tproc,NULL,0,addr tid
    15. invoke  CloseHandle,eax




    При работе треда portmon'ом (из SysInternals) наблюдаю непрерывные (всмысле их много :) ошибки:
    Код (Text):
    1. ;...    request                  port       result
    2. ... IOCTL_SERIAL_WAIT_ON_MASK  Serial1  INVALID_PARAMETR




    в чем проблема?



    А вообще задача сводится к тому, что нужно получать пакован байтов из порта (от устройства), быстренько его туда-сюда и ждем следующего, пакован приходит чаще, чем раз в секунду.



    Кто работал с портами, подскажите в чем моя проблема или посоветуйте более эффективное решение.



    ps. Кстати, в чем же заключается суть OVERLAPPED? Когда ее и как именно использовать? Перед каждым Write(Read)File или как бы на один сеанс?
     
  2. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Процедура считывает строки из ком порта, я ее писал для чтения штрих-кодов со сканера

    COM_PARAM struct

    lpszCom dd ? ;адрес ком порта например 'com1'

    hWnd dd ? ;этому окну будет приходить wm_comport

    lpol dd ? ; указатель на OVERLAPPED

    COM_PARAM ends



    [​IMG] 2080875631__ComPort.asm
     
  3. freddy

    freddy New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    2
    Спасибо - помогло. Восновном были проблемы с таймаутами и ивентом.



    А запись? Подойдут ли такие же таймауты? С ивентом работать примерно так? :

    - где-нить делаем: CreateFile/настройки/CreateEvent

    - затем при каждой записи: WriteFile/ResetEvent

    и таким образом юзать один ивент?



    так правильно будет? :)