【问题标题】:Receive NMEA0183 data from COM PORT C++从 COM PORT C++ 接收 NMEA0183 数据
【发布时间】:2012-04-18 16:36:19
【问题描述】:

大家好!

我用简单的 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-9 和 A-F 范围内吗?如果是这样,它们是十六进制数字,您使用的是十六进制查看器吗?你说它对写作有好处,你说这句话的线索是什么?只是试图隔离问题,,,

标签: c++ gps nmea


【解决方案1】:

从 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 );

}

这一切看起来都很复杂,但是上面代码中的所有内容都被证明是必要的。没有它,您的应用程序可能会运行一段时间,但有时它会挂起或出现乱码。您可以保留其中一些检查,但随后您将不得不花费大量时间来调试您的应用程序出了什么问题——就像我在开发这段代码时所做的那样。

【讨论】:

  • 感谢您的快速答复!我试图理解你的代码,但对我的业余开发者来说太难了。你知道更简单的方法吗?
  • 我尝试了您的解决方案,但它不起作用。问题是一样的。我只收到愚蠢的字符...
猜你喜欢
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 2018-06-17
相关资源
最近更新 更多