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");
запись и чтение из COM port'a
пытаюсь послать АТ команду модему
WriteFile завершается успешно.
если использовать
SetCommMask (hCOM, EV_RXCHAR);
то WaitCommEvent не завершается вообще...
без SetCommMask
WaitCommEvent завершается успешно
ReadFile завершается успешно, но так ничего и не прочитав!
в чем может быть проблема, и как все таки получить ответ?...
вот что я делаю:
Sending ATI1
WriteFile 1
WaitCommEvent 1
ReadFile 1
ReadFile 1
Answer