Такие вот грабли - необходимо функцией WaitCommEvent отловить изменение флага EV_RING, функция циклится, но на сигналы девайса не реаирует.... Хотя если по таймеру снимать GetCommStatus-ом то всё норм....
А кто у тебя в алертабле стэйт переходит? Где функции аля SleepEx или WaitForSingleObject? WaitCommEvent - помоему сама по себе не работает... Код (Text): WaitCommEvent(m_hCommPort,&dwEventMask, &ov) ; if ( WaitForSingleObject(ov.hEvent,INFINITE) == WAIT_OBJECT_0) { char szBuf[100]; memset(szBuf,0,sizeof(szBuf)); do { ReadFile( hPort,szBuf,sizeof(szBuf),&dwBytesRead,&ov); }while (dwBytesRead > 0 ); }
Этот пример вырезан из МСДН..... ПО идее, функция сама ждет изменения состояния порта, потом выходит.
Прошу прощения, меня сбило столку CreateEvent! Вставьте это перед SetCommEvent и всё будет работать! Код (Text): DCB dcb = {0}; dcb.DCBlength = sizeof(DCB); if (!GetCommState (hCom,&dcb)) { Memo1->Lines->Add("ErrorGet"); } dcb.fOutX = true; dcb.fInX = true; if (!SetCommState (hCom,&dcb)) { Memo1->Lines->Add("ErrorSet"); }
Чё та я... Внимательность сегодня на нуле... Видимо семь дней празднования сказываются. придумали же!! 10 дней балду пинать... Ни в одной цивилизованной стране такого разброда нет. Ещё отметить хочу, что событие в первый раз сработает при отрицательном напряжении на пине!
Ай!! Memo1->Lines->Add замени на какой-нить MessageBox или ShowMessage... Оверлэппид тебе не нужен. Пока... Я прямо твой файл в проекте скомпилил, всё работало. Только вставь изменение в структуре DCB.
Компиллить то всё компилится..... Мемо я убирал уже..... Ток не ловит гад..... GetCommModemStatus ловит, а WaitCommEvent нет Просто уходит в цикл и висит....
Это моя процедура, при нажатии на бутон, поток виснет. при подачи +9вольт на CTS: gnd - pin5, CTS - pin7 (если через кабель, без кабеля pin8) - выходит из ожидания. Могу, предположить, что в железе глюк (пины попутал, али вообще порты) Код (Text): HANDLE hCom = CreateFile( "COM1", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); if (hCom == INVALID_HANDLE_VALUE) { MessageBox (0, "Invalid Handle Value", "ERROR!", MB_OK); } ///=========================================================== DCB dcb = {0}; dcb.DCBlength = sizeof(DCB); if (!GetCommState (hCom,&dcb)) { Memo1->Lines->Add("ErrorGet"); } dcb.fOutX = true; dcb.fInX = true; if (!SetCommState (hCom,&dcb)) { Memo1->Lines->Add("ErrorSet"); } ////========================================================== BOOL fSuccess = SetCommMask(hCom, EV_CTS); if (!fSuccess) { LPVOID lpMsgBuf; if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),//LastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL)) MessageBox( NULL,(LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONSTOP ); LocalFree( lpMsgBuf ); } DWORD dwEvtMask; if (WaitCommEvent(hCom, &dwEvtMask, NULL /*&o*/)) { if (dwEvtMask & EV_DSR) { MessageBox (0, "Test", "DSR", MB_OK); } if (dwEvtMask & EV_CTS) { MessageBox (0, "Test", "CTS", MB_OK); } } else Memo1->Lines->Add("Error WAIT"); Memo1->Lines->Add("ready"); CloseHandle(hCom);
Эти строчки можно не вписывать: dcb.fOutX = true; dcb.fInX = true; Главное, что б это было: if (!SetCommState (hCom,&dcb)) И такой вопрос: "Хотя если по таймеру снимать GetCommStatus-ом то всё норм...." Не понятно - что в норме? Ты как то, можешь посмотреть уровень напряжения на пине?
Девайс элементарный - светодиод и пара резисторов.... Для проверки просто опрашиваем GetCommModemStatus по таймеру на 100 мс, и соответственно в диаложке надпись включен/выключен... То есть GetCommModemStatus считывает EV_RING нормально.
Volk То есть GetCommModemStatus считывает EV_RING нормально. А как CTS считывает? Я просто попробовал у себя GetCommModemStatus(); Функциклирует нормально. И WaitCommEvent видит и DSR и CTS. Но только после (!SetCommState (hCom,&dcb))... Всё под Win2000.