2012-04-04 163 views
3

Hy everyone!从COM端口接收NMEA0183数据C++

我用简单的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之前就已经宣布过了,而且它的工作性还不错。 当Im声明HANDLE时,我也打开了hSerial文件来读写。 目标平台是Windows Mobile 5.0和6.0。 什么错了? 非常感谢您的帮助!

+0

这些角色总是在0-9和A-F范围内吗?如果是这样,他们是十六进制数字,你使用十六进制查看器?你说它的写作效果很好,你有什么线索可以这么说?只是试图隔离问题,,, – 2012-05-05 07:38:34

回答

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

} 

这似乎都非常复杂,但是上述代码中的所有内容都是必要的。没有它,你的应用程序可能会运行一段时间,但在某个时候它会挂起或给你无用的东西。您可以将这些检查中的一部分退出,但您必须花费数小时才能调试您的应用出了什么问题 - 就像我在开发此代码时所做的那样。

+0

感谢您的快速答案!我试着去理解你的代码,但是它对我的爱好开发者来说太难了。你知道更简单的方法吗? – Luther 2012-04-04 23:15:50

+0

我试过你的解决方案,但它不工作。问题是一样的。我只收到愚蠢的角色​​... – Luther 2012-04-22 16:23:11