Чтение из COM порта отдельным потоком

Тема в разделе "WASM.WIN32", создана пользователем serega28, 15 июл 2009.

  1. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    В проге посылаю AT команду на модем.
    В потоке всё нормально работает в cms.cbInQue указано к примеру 45 байт.
    Но когда делается ReadFile ничего не читается, а GetLastError возвращает: ERROR_INVALID_PARAMETER.

    Почему?


    Код (Text):
    1. DWORD ThreadStatus(HANDLE hComPort)
    2. {
    3.   char szTemp[1024];
    4.   OVERLAPPED ovpr;
    5.  
    6.   ovpr.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
    7.   SetCommMask(hComPort, EV_RXCHAR);
    8.  
    9.   while (1)
    10.   {
    11.            dwEventMask = 0;
    12.     WaitCommEvent(hComPort, &dwEventMask, &ovpr);
    13.  
    14.         dwWait = WaitForSingleObject(ovpr.hEvent, INFINITE);
    15.  
    16.         switch (dwWait)
    17.         {
    18.             case WAIT_OBJECT_0:
    19.  
    20.                 ClearCommError(hComPort, &dwError, &cms);
    21.                 if (cms.cbInQue > 0)
    22.                 {
    23.                     ReadFile(hComPort, &szTemp, cms.cbInQue, &dwBytes, &ovpr);
    24.                     ........
    25.  
    26.                     if (GetOverlappedResult(hComPort, &ovpr, &dwBytes, FALSE))
    27.                     {  
    28.                         MsgAdd(hDlg, IDC_LOGLIST, szTemp, 1);
    29.                     }
    30.                 }
    31.             break;
    32.         }
     
  2. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Этот код я в Visual Studio сделал. и заметил что в режиме Debug только не работает. А если скомпилировать как Release всё отлично работает.

    Почему так?
     
  3. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Используется вот Overlapped IO. А один убеждён, что OVERLAPPED-структуру при работе с портами можно [почти] не инициализировать?
     
  4. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    так и не инициализируется он т.к. не надо.
    ovpr.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL); - этого достаточно.
     
  5. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Тогда, раз отладочная версия работает, один может сравнить содержимое 'ovpr' перед вызовом ReadFile в Release и в Debug.
     
  6. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Наоборот.
    В отладочной версии не работает.
     
  7. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Ох. Это не делает материи же. Просто сравни значения параметров для ReadFile в рабочей и нерабочей версии – всё сразу будет видно.
     
  8. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Могу дать отличный примерчик на тему многопоточной работы с COM-портами:
     
  9. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    ReadFile возвращает в обоих случаях:

    Код (Text):
    1. if (GetOverlappedResult(hComPort, &ovpr, &dwBytes, FALSE))
    А вот это не работает в одладочной версии.
     
  10. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Что ж, похоже это не может быть поможено. Покидаем тред.

    P.S.
    Намёк на решение проблемы (одной из).
     
  11. serega28

    serega28 Member

    Публикаций:
    0
    Регистрация:
    26 мар 2007
    Сообщения:
    115
    Адрес:
    Minsk
    Не решение.
    :dntknw:(((((

    Под VS 6.0 все пашет.