海兰大家!
我写了简单的C ++小的GPS应用程序,什么切换protocoll,发送命令到GPS芯片...等。 到GPS端口写入工作良好。 但是,当我尝试读取端口(用于检查接受命令),我收到了很多愚蠢的字符。 正常情况下,NMEA输出的消息是这样的:
$GPGLL,4916.45,N,12311.12,W,225444,A
我收到了类似的:
1C0CFC14
我不知道什么是错......我的这部分代码是下一个:
LPCVOID buffer[100];
ReadFile(hSerial, buffer, 100, 0, 0);
或其他日志的一些数据:
LPCVOID buffer[100];
ReadFile(hSerial, buffer, 100, 0, 0);
ofstream log ("log.txt");
log << buffer;
log.close();
当然,Hserial之前宣布,其工作好写。 当林宣布HANDLE我打开hSerial文件读写了。 目标平台是Windows Mobile 5.0和6.0。 怎么了? 非常感谢您的帮助!
从GPS端口,或从一个端口的任何其他数据读取数据,不完全是一件简单的事情。
你需要确保有一些数据的等待以及COM端口是明确的任何先前的错误,试图读取之前。 然后,如果读取成功,那么你需要确保数据正确终止,包括完整的NMEA语句。 有时候,你可以骑上下一个NMEA句子的开头,甚至几回一个读背,所以你必须面对这一切。
让我们留一个的另一天,并专注于读本身。
ReadFile的的第四个参数应该是一个指针,将存储的字节数实际读取到的DWORD。 你应该使用这个,以确保你有一些真实的数据。 您也应该检查错误的返回值。
下面是我如何做到这一点,检查到有实际一些数据等待被读取之后。
/**
Read data from port
@param[in] buffer pointer to location to store data
@param[in] limit maximum number of bytes to read
@return 0 if error
*/
int cSerial::ReadData( void *buffer, int limit )
{
if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
BOOL bReadStatus;
DWORD dwBytesRead, dwErrorFlags;
COMSTAT ComStat;
ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
if( !ComStat.cbInQue ) return( 0 );
dwBytesRead = (DWORD) ComStat.cbInQue;
if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;
bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
if( !bReadStatus ){
if( ::GetLastError() == ERROR_IO_PENDING ){
WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
return( (int) dwBytesRead );
}
return( 0 );
}
return( (int) dwBytesRead );
}
似乎一切都非常复杂,但一切都在上面的代码被证明有必要。 没有它,你的应用程序可以运行一段时间,但在某些时候就会挂起或给你garbles。 你可以留下一些这些检查出来,但随后你将不得不花很多时间试图调试出了什么问题与您的应用程序 - 就像我开发这个代码时一样。