从 COM 端口 C++ 接收NMEA0183数据
Receive NMEA0183 data from COM PORT C++
大家好!
我用简单的C++写了一个小的gps应用程序,什么切换协议l,向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之前已经声明过,它对写入有好处。当Im声明HANDLE时,我也打开了hSerial文件进行读写。目标平台是 Windows Mobile 5.0 和 6.0。怎么了?非常感谢您的帮助!
从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 );
}
看起来一切都非常复杂,但是上面代码中的所有内容都被证明是必要的。 没有它,您的应用程序可能会运行一段时间,但有时它会挂起或给您带来乱码。 您可以省略其中一些检查,但随后您将不得不花费许多时间来尝试调试应用程序出了什么问题 - 就像我在开发此代码时所做的那样。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 从 COM 端口 C++ 接收NMEA0183数据