пытаюсь послать АТ команду модему WriteFile завершается успешно. если использовать SetCommMask (hCOM, EV_RXCHAR); то WaitCommEvent не завершается вообще... без SetCommMask WaitCommEvent завершается успешно ReadFile завершается успешно, но так ничего и не прочитав! в чем может быть проблема, и как все таки получить ответ?...
вот что я делаю: Код (Text): HANDLE hCOM=CreateFile(Port.c_str(), GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0, NULL); if (hCOM!=INVALID_HANDLE_VALUE) { printf("OK\n"); COMMTIMEOUTS cto; cto.ReadIntervalTimeout = 1000; cto.ReadTotalTimeoutConstant = 1000; cto.ReadTotalTimeoutMultiplier = 1000; cto.WriteTotalTimeoutConstant = 1000; cto.WriteTotalTimeoutMultiplier = 1000; SetCommTimeouts(hCOM, &cto); PurgeComm(hCOM,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_TXABORT|PURGE_RXABORT); // SetCommMask (hCOM, EV_RXCHAR); string c="ATI1\r" ; printf("Sending %s\n", c.c_str()); DWORD nb = 1; OVERLAPPED ov; ZeroMemory( &ov , sizeof( OVERLAPPED )) ; ov.hEvent = CreateEvent( NULL , TRUE , FALSE , NULL ) ; DCB dcb; GetCommState(hCOM,&dcb); BuildCommDCB("baud=9600 parity=n data=8 stop=1", &dcb); BOOL res = WriteFile(hCOM,c.c_str(),c.length(),&nb,&ov); printf("WriteFile %i\n", res); DWORD MASK = EV_RXCHAR; DWORD *Mask = &MASK; int result = WaitCommEvent(hCOM, Mask, &ov); printf("WaitCommEvent %i\n", result); char* ans[100]; ans[0] = '\0'; nb=1; BOOL ReadRes = ReadFile(hCOM, ans, 1, &nb, &ov); printf("ReadFile %i\n", ReadRes); if (!ReadRes) { if (GetLastError()==ERROR_IO_PENDING) { DWORD resW =WaitForSingleObject(ov.hEvent, 10000); if (resW!=WAIT_OBJECT_0) printf ("TIMEOUT\n"); printf("WaitForSingleObject %i\n", ReadRes); ReadRes = GetOverlappedResult(hCOM, &ov, &nb, 0); printf("OverlappedResult %i\n", ReadRes); } } if (!ReadRes) printf("Last Error %i\n", GetLastError()); printf("ReadFile %i\n", ReadRes); ans[nb] = '\0'; printf("Answer %s\n", ans); CloseHandle(hCOM); } else printf (" Couldn't connect to COM port\n");
Ну во-первых стоит сделать Код (Text): HANDLE hCOM=CreateFile(Port.c_str(), GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED, NULL); Ну и еще такая мысль: Код (Text): DWORD MASK = EV_RXCHAR; DWORD *Mask = &MASK; int result = WaitCommEvent(hCOM, Mask, &ov); на кой? не проще Код (Text): int result = WaitCommEvent(hCOM, &MASK, &ov); ?