Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

работа с СОМ портом

59K
19 апреля 2010 года
makarych
1 / / 19.04.2010
доброго времени суток.
Пишу прогу для работы с модемом. Проблема заключается в следующем:
когда запускаю прогу в режиме дебага с брекпоинтами, обмен данными вродебы работает нормально, пишет, читает нормально, но как только запускаю собранный .ехе комманда записи прокатывает нормально - модем коннектиться, но в ответ - тишина. в чем проблема, помогите пожалуйста!

вызываю 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;

}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог