2012-04-04 201 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