работа с СОМ портом
Пишу прогу для работы с модемом. Проблема заключается в следующем:
когда запускаю прогу в режиме дебага с брекпоинтами, обмен данными вродебы работает нормально, пишет, читает нормально, но как только запускаю собранный .ехе комманда записи прокатывает нормально - модем коннектиться, но в ответ - тишина. в чем проблема, помогите пожалуйста!
вызываю WriteToPort, потом сразу читаю ReadFromPort.
вот реализация записи в порт.
BOOL CMyGSMDlg::WriteToPort(const CString &editValue)
{
OVERLAPPED overWrite;
overWrite.Internal = 0;
overWrite.InternalHigh = 0;
overWrite.Offset = 0 ;
overWrite.OffsetHigh = 0 ;
overWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
PurgeComm(hCOM,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); ///restart
CString packToSend = editValue;
packToSend.Insert(packToSend.GetLength(),0x0d);// 0D
packToSend.Insert(packToSend.GetLength(),0x0a);// 0A
DWORD dw = 0;
BOOL bSuccess = FALSE;
if(!WriteFile(hCOM, packToSend.GetString(),
packToSend.GetLength()*sizeof(char), &dw, &overWrite))
{
if (GetLastError() == ERROR_IO_PENDING)
{
DWORD dwRes = WaitForSingleObject(overWrite.hEvent, 500);
if (dwRes == WAIT_OBJECT_0)
{
if (GetOverlappedResult(hCOM, &overWrite, &dw, FALSE))
{
bSuccess = (packToSend.GetLength()*sizeof(char) == dw);
}
}
}
} else
bSuccess = (packToSend.GetLength()*sizeof(char) == dw);
ResetEvent(overWrite.hEvent);
PurgeComm(hCOM,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); ///restart
return bSuccess;
}
а вот чтение из порта.
BOOL CMyGSMDlg::ReadFromPort()
{
OVERLAPPED overRead;
overRead.Internal = 0;
overRead.InternalHigh = 0;
overRead.Offset = 0 ;
overRead.OffsetHigh = 0 ;
overRead.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
BOOL bSuccess = FALSE;
DWORD EventMask = 0;
if ((!WaitCommEvent(hCOM, &EventMask, &overRead)) && (GetLastError()==ERROR_IO_PENDING))
WaitForSingleObject(overRead.hEvent, INFINITE);
DWORD ErrorMask = 0; // сюда будет занесен код ошибки порта, если таковая была
COMSTAT CStat;
ClearCommError(hCOM, &ErrorMask, &CStat);
int quelen = CStat.cbInQue; // число прочитанных бит
char *lpInBuffer = new char[quelen+1];
lpInBuffer[quelen] = '\0';
memset(lpInBuffer, 0, sizeof(char) * quelen);
DWORD dwReaded = 0;
int retcode = ReadFile(hCOM, lpInBuffer, sizeof(char)*quelen, &dwReaded, &overRead);
if((dwReaded == 0) && (GetLastError() == ERROR_IO_PENDING))
{
if(GetOverlappedResult(hCOM, &overRead, &dwReaded, FALSE))
{
bSuccess = (dwReaded == sizeof(char)*quelen);
}
} else
{
if (dwReaded > 0)
{ //если прочитали данные
//что-то делаем
}
bSuccess = (dwReaded == sizeof(char)*quelen);
}
PurgeComm(hCOM, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
EventMask = 0;
ResetEvent(overRead.hEvent);
return bSuccess;
}