Сом порт

Тема в разделе "WASM.ELECTRONICS", создана пользователем mha, 4 май 2006.

  1. mha

    mha New Member

    Публикаций:
    0
    Регистрация:
    4 май 2006
    Сообщения:
    6
    У меня есть устройство которое пише в сом-порт пакетную информацию. Я открываю порт CreateFile, настраиваю его как надо и далее читаю например =>



    DWORD dwCommEvent;

    if(WaitCommEvent(hCom,&dwCommEvent,NULL))

    {

    return ReadFile(hCom,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,NULL);

    }

    else return 0;



    проблема в том что данные читаются не полностью, те часть читается остальное остаются в его буффере и при дальнейшем чтении я получаю те данные которые не прочитал сразу
    Код (Text):
    1.  
    Код (Text):
    1.  
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Ну да, а в чем проблема?

    Лучше всего отвести для читалки отдельный thread и пусть складирует пакеты. Правда мой коллега вот шипит мне в ухо - мутексы, только мутексы!
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Читать асинхронно, хотя бы через thread, как советует Ustus. Или настроить таймауты в порту (SetCommTimeouts) на более длительный промежуток, чтоб все данные читались сразу.



    Ustus

    Коллега не шарит.
     
  4. mha

    mha New Member

    Публикаций:
    0
    Регистрация:
    4 май 2006
    Сообщения:
    6
    Хорошо так и сделано отдельный поток, асинхронный режим, но есть ли в винде другие средства для работы с USB и COM кроме ReadFile. и что значит "хотя бы через thread"? Посоветуйте ссылочку или книжечку по написанию драверов UNIX -WINDOWS
     
  5. AndreyZi

    AndreyZi New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2005
    Сообщения:
    9
    Адрес:
    Almaty
    //Да что может быть проще задай в структуре событие
    OVERLAPPED OverLapped;

    OverLapped.hEvent = CreateEvent(0,TRUE,0,0);
    //м ожидай его после чтения скок нажно
    ReadFile(hCom,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,&OverLapped);
    if(WAIT_TIMEOUT == WaitForSingleObjectEx(OverLapped.hEvent,3000,FALSE)){
    CloseHandle(OverLapped.hEvent);
    return FALSE;
    }