Hy大家!
我用简单的C ++编写了一个小gps应用程序,切换协议,发送命令到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。 怎么了? 非常感谢您的帮助!
答案 0 :(得分:2)
从GPS端口读取数据或从端口读取任何其他数据并不是一件简单的事情。
在尝试读取之前,您需要确保有一些数据等待并且COM端口没有任何先前的错误。然后,如果读取成功,则需要确保数据正确终止并包含完整的NMEA句子。有时你可能会在下一个NMEA句子开头,或者甚至连续几次读取,所以你必须处理它。
让我们将这一切留给另一天,并专注于阅读本身。
ReadFile的第4个参数应该是指向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 );
}
看起来一切都非常复杂,但上述代码中的所有内容都证明是必要的。没有它,你的应用程序可能会运行一段时间,但在某个时候它会挂起或给你惹恼。你可以留下一些这些支票,但是你将不得不花费很多时间来调试你的应用程序出了什么问题 - 就像我在开发这个代码时所做的那样。