Comport
2 отговора
174 прегледа
Comport
Molia, pomognete, weche ne znam kakwo da prawia. Imam edna funkcia za chetene ot comport, kojato raboti tochno edin pat, za da trugne wtori put triabwa da se rebootne mashinata inache ne chete ot comport-a nistho, bie timeouti i wrushta 0 izcheteni bytes. w sushtoto wreme, hyperterminala si chete kato puska ot comporta i kakwoto si triabwa. kakwa move da e prichinata. eto i kak ia cheta prokeltiata:
CString CComport::receive()
{
UCHAR prevbite = 0;
CString str;
DWORD dwEvtMask;
DWORD dwLength;
DWORD dwErrorFlags,dwError;
COMSTAT ComStat;
BOOL ReadStat;
UCHAR cRSChar = 0;
CHAR NumResBytes = 0;
OVERLAPPED os;
os.Offset = 0;
os.OffsetHigh = 0;
os.hEvent = NULL;
memset( &os, 0, sizeof( OVERLAPPED ) ) ;
/* os.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL
) ; // no name
if (os.hEvent == NULL)
{
MessageBox( NULL, "Failed to create event!", "Global Error!",
MB_ICONEXCLAMATION | MB_OK ) ;
{ LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error - Creating comX event", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf ); }
return ( "" ) ;
}
*/
int ctimeout = 0;
while (cRSChar != 0x0d ) // kraj na red
{
dwEvtMask = 0;
TRACE("\n");
ReadStat = ReadFile(g_hComm, &cRSChar, 1, &dwLength, &os);
// ei tuka samo 00 trace-wa sled 1wi run na cialata programa
TRACE("%02x,",cRSChar);
if (!ReadStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
Sleep(100);
// kogato posledniat parametur e true togawa ne se izpolzwa event w os strukturata zashotto OpSystem samichka si go creatwa
while ( ! ::GetOverlappedResult(g_hComm, &os, &dwLength, TRUE ) )
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
{
continue;
}
else
{
dwError = GetLastError();
if (!ClearCommError(g_hComm, &dwErrorFlags, &ComStat ) )
{ LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error Clear ComX err1", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf ); }
break;
}
} // while
} else {
dwLength = 0 ;
{ LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf ); }
if (!ClearCommError(g_hComm, &dwErrorFlags, &ComStat ) )
{ LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error Clear ComX err2", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf ); }
} // if error is not pending
} // if ne sme izcheli ot 1wi put
if ( dwLength > 0 ) {
str += cRSChar;
dwLength = 0;
ctimeout = 0;
}
if(cRSChar == 0x0d)
break;
if (++ctimeout > 10) {
// write_err("#");
str = "time-out";
break;
}
} //while(Connected)
// if (!CloseHandle(os.hEvent))
// { LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf ); }
return str;
}
CString CComport::receive()
{
UCHAR prevbite = 0;
CString str;
DWORD dwEvtMask;
DWORD dwLength;
DWORD dwErrorFlags,dwError;
COMSTAT ComStat;
BOOL ReadStat;
UCHAR cRSChar = 0;
CHAR NumResBytes = 0;
OVERLAPPED os;
os.Offset = 0;
os.OffsetHigh = 0;
os.hEvent = NULL;
memset( &os, 0, sizeof( OVERLAPPED ) ) ;
/* os.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL
) ; // no name
if (os.hEvent == NULL)
{
MessageBox( NULL, "Failed to create event!", "Global Error!",
MB_ICONEXCLAMATION | MB_OK ) ;
{ LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error - Creating comX event", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf ); }
return ( "" ) ;
}
*/
int ctimeout = 0;
while (cRSChar != 0x0d ) // kraj na red
{
dwEvtMask = 0;
TRACE("\n");
ReadStat = ReadFile(g_hComm, &cRSChar, 1, &dwLength, &os);
// ei tuka samo 00 trace-wa sled 1wi run na cialata programa
TRACE("%02x,",cRSChar);
if (!ReadStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
Sleep(100);
// kogato posledniat parametur e true togawa ne se izpolzwa event w os strukturata zashotto OpSystem samichka si go creatwa
while ( ! ::GetOverlappedResult(g_hComm, &os, &dwLength, TRUE ) )
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
{
continue;
}
else
{
dwError = GetLastError();
if (!ClearCommError(g_hComm, &dwErrorFlags, &ComStat ) )
{ LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error Clear ComX err1", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf ); }
break;
}
} // while
} else {
dwLength = 0 ;
{ LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf ); }
if (!ClearCommError(g_hComm, &dwErrorFlags, &ComStat ) )
{ LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error Clear ComX err2", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf ); }
} // if error is not pending
} // if ne sme izcheli ot 1wi put
if ( dwLength > 0 ) {
str += cRSChar;
dwLength = 0;
ctimeout = 0;
}
if(cRSChar == 0x0d)
break;
if (++ctimeout > 10) {
// write_err("#");
str = "time-out";
break;
}
} //while(Connected)
// if (!CloseHandle(os.hEvent))
// { LPVOID lpMsgBuf;FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );LocalFree( lpMsgBuf ); }
return str;
}
Re: Comport
Ех тия ком портове ..
Виж SetCommTimeouts и COMMTIMEOUTS.
Там е обяснено какво поведение имат ReadFile & WriteFile при работа с ком порт.
Ето ти и още нещо полезно, да гледаш какво става с порта докато го мъчиш.
[линк]
Виж SetCommTimeouts и COMMTIMEOUTS.
Там е обяснено какво поведение имат ReadFile & WriteFile при работа с ком порт.
Ето ти и още нещо полезно, да гледаш какво става с порта докато го мъчиш.
[линк]
Re: Comport
Не знам как си приел и един символ с тази функция ;-)) Ако преди това си отворил порта, добре, но иначе:
1. Принципно не ти препоръчвам асинхронно четене на порта (OVERLAPPED метода). За синхронно четене направи така:
2. Порта трябва да се отвори с ::CreateFile(), като дадеш "СОМ1" в името на файла (или друг порт номер).
3. Настрой таймаута на порта с ::SetCommTimeouts()
4. Задай настройките на порта (бауд, стоп и т.н) с ::SetCommState()
5. Дай му за всеки случай един ::PurgeComm()
6. Чети и пиши на воля в порта с ::ReadFile() и ::WriteFile()
7. Затвори порта с ::CloseHandle()
1. Принципно не ти препоръчвам асинхронно четене на порта (OVERLAPPED метода). За синхронно четене направи така:
2. Порта трябва да се отвори с ::CreateFile(), като дадеш "СОМ1" в името на файла (или друг порт номер).
3. Настрой таймаута на порта с ::SetCommTimeouts()
4. Задай настройките на порта (бауд, стоп и т.н) с ::SetCommState()
5. Дай му за всеки случай един ::PurgeComm()
6. Чети и пиши на воля в порта с ::ReadFile() и ::WriteFile()
7. Затвори порта с ::CloseHandle()