реклама на сайте
подробности

 
 
> Программирование COM порта, Проблемы с передачей данных устройству по COM
Yuriy_Rus
сообщение Aug 30 2006, 08:45
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 68
Регистрация: 24-07-06
Пользователь №: 19 039



Уважаемые, уже котрый день занимаюсь программированием GPRS модема по COM и не могу понять, что за фигня...
Загружаю комп втыкаю модем, запускаю прогу - всё виснет, соединения - нет.
Закрываю прогу. Запускаю гипертерминал. Ввожу любую команду - всё ништяк, устройство отвечает.

Закрываю гипертерминал. Запускаю прогу, и всё уже пашет без проблем, только установка настроек порта(SetCommState(Port, &dcb) странно работет (то работает, то не работает, но восновном не работает).
Так вроде в DCB всё указываю что надо для работы устройства.
Исходник открытия и настройки порта:

if(PortOpen == 1) return false;

DCB dcb;
COMMTIMEOUTS ct;
unsigned long int bc;

//dcb = (DCB*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DCB));
dcb.DCBlength = sizeof(DCB);
//BuildCommDCB("baud = 9600 parity = N data = 8 stop = 1", &dcb);

dcb.fBinary = TRUE;
dcb.BaudRate = 9600;
dcb.fParity = NOPARITY;
dcb.ByteSize = 8;
dcb.StopBits = ONESTOPBIT;


dcb.fNull = TRUE; //Èãíîðèðîâàíèå íóëåâûõ áàéò ïðè ïðè¸ìå
dcb.fOutX = FALSE;
dcb.fInX = FALSE;

ct.ReadIntervalTimeout = D_TimeOutValue;
ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant = D_TimeOutValue;
ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant = D_TimeOutValue;

Port = CreateFile(D_COM_Name, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

if(Port == INVALID_HANDLE_VALUE)
{
Application->MessageBox(D_ComOpenError, D_Error, MB_OK+MB_ICONERROR);
ComPortClose();
return FALSE;
}

if(!SetCommState(Port, &dcb))
{
// Application->MessageBox(D_ComOpenError, D_Error, MB_OK+MB_ICONERROR);
// ComPortClose();
// return false;
}

if (!SetCommTimeouts(Port, &ct))
{
Application->MessageBox(D_ComOpenError, D_Error, MB_OK+MB_ICONERROR);
ComPortClose();
return FALSE;
}
else PortOpen = 1;

PurgeComm(Port, PURGE_RXABORT);
PurgeComm(Port, PURGE_TXCLEAR|PURGE_RXCLEAR);

Подскажите, пожалуста, как решить эту проблему. help.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Andu_
сообщение Aug 31 2006, 10:25
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 127
Регистрация: 11-07-06
Пользователь №: 18 735



У меня вот такая процедура открытия порта для COM порта.
И все работает только не для GPRS модема а для своих целей.
BOOL CSerial::Open( LPVOID dr )
{
BYTE ByteSize = 8; // number of bits/byte, 4-8
BYTE Parity = 0; // 0-4=no,odd,even,mark,space
BYTE StopBits = 0; // 0,1,2 = 1, 1.5, 2

CDriver *driver = (CDriver *)dr;
m_driver = dr;
int nPort = driver->kanal.port;
DWORD nBaud = driver->kanal.speed;
ByteSize = driver->kanal.ByteSize;
Parity = driver->kanal.Parity;
StopBits = driver->kanal.StopBits;


int rw = 3;
if( m_bOpened ) return( TRUE );

char szPort[15];
char szComParams[50];
DCB dcb;

wsprintf( szPort, "COM%d", nPort);


m_hIDComDev = CreateFile(szPort,
GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_OVERLAPPED | DDL_SYSTEM,
NULL);


if( m_hIDComDev == NULL ) return( FALSE );
DWORD yy = GetFileAttributes(szPort);

memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );

DWORD b = driver->status.waitin + driver->status.waitout + driver->status.waitout_ + driver->status.timeout;// + 25;//driver->status.waitin;
DWORD c=driver->status.waitoutall;
DWORD a=driver->status.timeout;

COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 0;//a;//0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;//10;
CommTimeOuts.ReadTotalTimeoutConstant = b;//100;
CommTimeOuts.WriteTotalTimeoutMultiplier = (15000/(nBaud));//c;//10;
CommTimeOuts.WriteTotalTimeoutConstant = 0xFFFFFFFF;//c;//50;
SetCommTimeouts( m_hIDComDev, &CommTimeOuts );

wsprintf( szComParams, "COM%d:%d,n,8,1", nPort, nBaud );
m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

dcb.DCBlength = sizeof( DCB );
GetCommState( m_hIDComDev, &dcb );
dcb.BaudRate = nBaud;
dcb.ByteSize = ByteSize;
dcb.Parity = Parity;
dcb.StopBits = StopBits;
//dcb.fNull=true;

/////////////////////////
dcb.fRtsControl = RTS_CONTROL_ENABLE;

/////////////////////////
unsigned char ucSet;
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_DTRDSR ) != 0 );
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_RTSCTS ) != 0 );
ucSet = (unsigned char) ( ( FC_RTSCTS & FC_XONXOFF ) != 0 );
if( !SetCommState( m_hIDComDev, &dcb ) ||
!SetupComm( m_hIDComDev, 1000, 1000 ) ||
m_OverlappedRead.hEvent == NULL ||
m_OverlappedWrite.hEvent == NULL )
{
DWORD dwError = GetLastError();
if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
CloseHandle( m_hIDComDev );
return( FALSE );
}
SetupComm(m_hIDComDev, 1024, 1024);

SetCommMask(m_hIDComDev,EV_ERR);
DWORD dwError;
ClearCommError( m_hIDComDev, &dwError, NULL);
m_bOpened = TRUE;

PurgeRx();
PurgeTx();
SetRTS(FALSE);

CString qqq;
qqq.Format("SHLPICR");
if(m_bOpened){qqq.Format("SHLPICR [COM%d]", driver->kanal.port);}
if(driver->mainWnd!=NULL)
((CWnd *)driver->mainWnd)->SetWindowText(LPCSTR(qqq));


return( m_bOpened );

}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th August 2025 - 06:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016