2016-10-23 56 views
0

我想在Arduino上使用TinyGPS++來解析NMEA數據並在OLED顯示屏上顯示信息。但是,不使用軟件串行和TX/RX引腳,NMEA數據將被USB接收。從串行解析NMEA句子

我跟着從TinyGPS ++的例子,但我遇到了兩個問題:

1) 只有前64個字符由Arduino的好評,當我發送一個NMEA句子通過串行監視器(Windows, Arduino 1.6.9)。我怎樣才能克服這個限制?我通過刪除幾位小數來幫助自己,但這不是首選的方法。

2) 在TinyGPS ++ BasicExample樣品NMEA字符串在只讀存儲器中定義:

// A sample NMEA stream. 
const char *gpsStream = 
    "$GPRMC,045103.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*7C\r\n" 
    "$GPGGA,045104.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*62\r\n" 
    "$GPRMC,045200.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*77\r\n" 
    "$GPGGA,045201.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*6C\r\n" 
    "$GPRMC,045251.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*7D\r\n" 
    "$GPGGA,045252.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*6F\r\n"; 

和解析由

while (*gpsStream) { 
    Serial.print(*gpsStream); 
    gps.encode(*gpsStream++); 
} 

收到我的NMEA(不幸的是僅一條線):

if (Serial.available()) { 
    while (Serial.available() > 0) { 
    if(index < 80) 
    { 
     inChar = Serial.read(); 
     inData[index] = inChar; 
     index++; 
     inData[index] = '\0'; 
    } 
    } 
} 

並嘗試通過以下方式解析它:

index = 0; 
while (index < 80) { 
    gps.encode(inData[index]); 
    Serial.print(inData[index]); 
    index++; 
} 

但是,這並不按照要求工作。檢查位置isValid()總是返回不正確。

不幸的是,我有這種不良行爲的幾個可能的來源。

  1. 的過短句子(不太可能)
  2. 的通過串口讀取數據不正確的方法。
  3. 我只提交一行。
  4. 別的東西。

我不是那種既沒有NMEA經驗,也沒有串行數據通信經驗的人,而且我對Arduino/C只有很少的經驗。你能指出我如何解決這個(這些)問題的方向嗎?

+0

我認爲#1是由[此錯誤](https://github.com/arduino/Arduino/issues/1223)引起的。我的預感是,這將在個人電腦上變得更加流暢。你爲什麼不把串口加密狗插入電腦,在那裏做最初的開發,然後再解決arduino的具體問題? –

+0

你的接收和解析循環對我來說看起來不正確,但是如果沒有[MCVE]很難說(http://stackoverflow.com/help/mcve) –

+0

我不明白你的意思是串口加密狗。 GPS設備將在稍後階段添加。現在我只有幾句話,我通過PC發送給Arduino。我不認爲這是由於回車造成的,因爲它只是在某個位置切斷按摩,而不是在線末端。但我會看看,並提供一個MCVE – Markus

回答

0

基本上,你不需要積累NMEA字符。只要將它們送入GPS庫即可。你不提供整個循環,但是在那裏也有一個問題是很常見的。我最終寫了NeoGPS。它比所有其他庫更快更小,它驗證校驗和,並且示例結構正確。與其他庫不同,NeoGPS不將GPS值存儲爲浮點值,因此它能夠保留GPS設備的完整精度。

如果您想嘗試它,請務必遵循安裝說明。 NMEA.ino示例將爲您發送的每批GPS句子發出一行信息(CSV格式),並以默認RMC句子結束。一定要修改它使用Serial對象,而不是gps_port,或者簡單地將其這樣:

#define gps_port Serial 

它也將顯示已解析的,有多少好的句子已接收的字符數,和有多少句子有校驗和錯誤。如果您沒有正確生成校驗和,這可能有助於調試。 This site也很有用。

這些CSV行將通過USB端口發回(到PC),但您可以輕鬆更改它以將特定字段發送到OLED(請參閱NMEAloc.ino)。

雖然可能開發PC上的東西,然後將其移植到像Arduino的嵌入式環境中,你必須要小心(1)線性規劃結構和(2)忽略資源限制(計劃規模,MCU速度和RAM)。 Arduino環境中存在許多怪癖,通常會讓人感到沮喪,因此無法將「草圖」移植到PC上。        :P

+0

嘿,謝謝!我會仔細研究一下它,但可能需要一些時間。我保持更新。 – Markus