EV_RING

Тема в разделе "WASM.WIN32", создана пользователем Volk, 7 янв 2005.

  1. Volk

    Volk New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2005
    Сообщения:
    8
    Такие вот грабли - необходимо функцией WaitCommEvent отловить изменение флага EV_RING, функция циклится, но на сигналы девайса не реаирует.... Хотя если по таймеру снимать GetCommStatus-ом то всё норм....
     
  2. Volk

    Volk New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2005
    Сообщения:
    8
  3. Trashy

    Trashy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    44
    Адрес:
    Russia
    А кто у тебя в алертабле стэйт переходит?

    Где функции аля SleepEx или WaitForSingleObject?

    WaitCommEvent - помоему сама по себе не работает...
    Код (Text):
    1.  
    2.     WaitCommEvent(m_hCommPort,&dwEventMask, &ov) ;
    3.     if ( WaitForSingleObject(ov.hEvent,INFINITE) == WAIT_OBJECT_0)
    4.     {    
    5.         char szBuf[100];
    6.         memset(szBuf,0,sizeof(szBuf));
    7.         do
    8.         {
    9.             ReadFile( hPort,szBuf,sizeof(szBuf),&dwBytesRead,&ov);
    10.         }while (dwBytesRead > 0 );    
    11.     }
     
  4. Volk

    Volk New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2005
    Сообщения:
    8
    Этот пример вырезан из МСДН..... ПО идее, функция сама ждет изменения состояния порта, потом выходит.
     
  5. Trashy

    Trashy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    44
    Адрес:
    Russia
    У тебя в WaitCommEvent не передан указатель на Overlapped структуру.
     
  6. Trashy

    Trashy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    44
    Адрес:
    Russia
    Прошу прощения, меня сбило столку CreateEvent!

    Вставьте это перед SetCommEvent и всё будет работать!


    Код (Text):
    1.  
    2. DCB dcb = {0};
    3. dcb.DCBlength = sizeof(DCB);
    4.  
    5. if (!GetCommState (hCom,&dcb))
    6. {
    7.  Memo1->Lines->Add("ErrorGet");
    8. }
    9.  
    10. dcb.fOutX    = true;
    11. dcb.fInX    = true;
    12.  
    13.  
    14. if (!SetCommState (hCom,&dcb))
    15. {
    16.  Memo1->Lines->Add("ErrorSet");
    17. }
     
  7. Trashy

    Trashy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    44
    Адрес:
    Russia
    Я глюканул!

    Перед:

    SetCommMask
     
  8. Trashy

    Trashy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    44
    Адрес:
    Russia
    Чё та я... Внимательность сегодня на нуле...

    Видимо семь дней празднования сказываются. придумали же!! 10 дней балду пинать... Ни в одной цивилизованной стране такого разброда нет.

    Ещё отметить хочу, что событие в первый раз сработает при отрицательном напряжении на пине!
     
  9. Trashy

    Trashy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    44
    Адрес:
    Russia
    Ой... Простите меня, дуру грешную(ц)...

    При положительном напряжении!

    Эт я в проводах запутался...
     
  10. Volk

    Volk New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2005
    Сообщения:
    8
    Хорошо, щас попробую.....Спасибо...
     
  11. Volk

    Volk New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2005
    Сообщения:
    8
    1) Ругается на Memo1

    2) Если открывать порт как overlapped то возникает ошибка io_pending....
     
  12. Trashy

    Trashy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    44
    Адрес:
    Russia
    Ай!!

    Memo1->Lines->Add замени на какой-нить MessageBox или ShowMessage...

    Оверлэппид тебе не нужен. Пока...

    Я прямо твой файл в проекте скомпилил, всё работало. Только вставь изменение в структуре DCB.
     
  13. Volk

    Volk New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2005
    Сообщения:
    8
    Компиллить то всё компилится..... Мемо я убирал уже..... Ток не ловит гад..... GetCommModemStatus ловит, а WaitCommEvent нет :dntknw: Просто уходит в цикл и висит....
     
  14. Trashy

    Trashy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    44
    Адрес:
    Russia
    Это моя процедура, при нажатии на бутон, поток виснет. при подачи +9вольт на CTS: gnd - pin5, CTS - pin7 (если через кабель, без кабеля pin8) - выходит из ожидания.

    Могу, предположить, что в железе глюк (пины попутал, али вообще порты)


    Код (Text):
    1. HANDLE hCom = CreateFile( "COM1",
    2.                           GENERIC_WRITE,
    3.                           FILE_SHARE_WRITE,
    4.                           NULL,
    5.                           OPEN_EXISTING,
    6.                           0,
    7.                           NULL
    8.                           );
    9.  
    10. if (hCom == INVALID_HANDLE_VALUE)
    11. {
    12.   MessageBox (0, "Invalid Handle Value", "ERROR!", MB_OK);
    13. }
    14. ///===========================================================
    15. DCB dcb = {0};
    16. dcb.DCBlength = sizeof(DCB);
    17.  
    18. if (!GetCommState (hCom,&dcb))
    19. {
    20.  Memo1->Lines->Add("ErrorGet");
    21. }
    22.  
    23. dcb.fOutX    = true;
    24. dcb.fInX    = true;
    25.  
    26.  
    27. if (!SetCommState (hCom,&dcb))
    28. {
    29.  Memo1->Lines->Add("ErrorSet");
    30. }
    31. ////==========================================================
    32. BOOL fSuccess = SetCommMask(hCom, EV_CTS);
    33.  
    34. if (!fSuccess)
    35. {
    36. LPVOID lpMsgBuf;
    37.   if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    38.                                      NULL,
    39.                                      GetLastError(),//LastError,
    40.                                         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    41.                                      (LPTSTR) &lpMsgBuf,
    42.                                      0,
    43.                                      NULL))
    44.             MessageBox( NULL,(LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONSTOP );
    45. LocalFree( lpMsgBuf );
    46. }
    47.  
    48. DWORD dwEvtMask;
    49.  
    50. if (WaitCommEvent(hCom, &dwEvtMask, NULL /*&o*/))
    51. {
    52.     if (dwEvtMask & EV_DSR)
    53.         {
    54.       MessageBox (0, "Test", "DSR", MB_OK);
    55.     }
    56.  
    57.     if (dwEvtMask & EV_CTS)
    58.         {
    59.           MessageBox (0, "Test", "CTS", MB_OK);
    60.     }
    61. }
    62. else
    63. Memo1->Lines->Add("Error WAIT");
    64.  
    65. Memo1->Lines->Add("ready");
    66. CloseHandle(hCom);
     
  15. Trashy

    Trashy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    44
    Адрес:
    Russia
    Эти строчки можно не вписывать:

    dcb.fOutX = true;

    dcb.fInX = true;



    Главное, что б это было:

    if (!SetCommState (hCom,&dcb))



    И такой вопрос:

    "Хотя если по таймеру снимать GetCommStatus-ом то всё норм...."

    Не понятно - что в норме?

    Ты как то, можешь посмотреть уровень напряжения на пине?
     
  16. Volk

    Volk New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2005
    Сообщения:
    8
    Девайс элементарный - светодиод и пара резисторов.... Для проверки просто опрашиваем GetCommModemStatus по таймеру на 100 мс, и соответственно в диаложке надпись включен/выключен... То есть GetCommModemStatus считывает EV_RING нормально.
     
  17. Trashy

    Trashy New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2004
    Сообщения:
    44
    Адрес:
    Russia
    Volk

    То есть GetCommModemStatus считывает EV_RING нормально.





    А как CTS считывает?



    Я просто попробовал у себя GetCommModemStatus();

    Функциклирует нормально.

    И WaitCommEvent видит и DSR и CTS. Но только после

    (!SetCommState (hCom,&dcb))...

    Всё под Win2000.
     
  18. Volk

    Volk New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2005
    Сообщения:
    8
    У меня ХР, CTS считывать не пробовал....