我想在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()
總是返回不正確。
不幸的是,我有這種不良行爲的幾個可能的來源。
- 的過短句子(不太可能)
- 的通過串口讀取數據不正確的方法。
- 我只提交一行。
- 別的東西。
我不是那種既沒有NMEA經驗,也沒有串行數據通信經驗的人,而且我對Arduino/C只有很少的經驗。你能指出我如何解決這個(這些)問題的方向嗎?
我認爲#1是由[此錯誤](https://github.com/arduino/Arduino/issues/1223)引起的。我的預感是,這將在個人電腦上變得更加流暢。你爲什麼不把串口加密狗插入電腦,在那裏做最初的開發,然後再解決arduino的具體問題? –
你的接收和解析循環對我來說看起來不正確,但是如果沒有[MCVE]很難說(http://stackoverflow.com/help/mcve) –
我不明白你的意思是串口加密狗。 GPS設備將在稍後階段添加。現在我只有幾句話,我通過PC發送給Arduino。我不認爲這是由於回車造成的,因爲它只是在某個位置切斷按摩,而不是在線末端。但我會看看,並提供一個MCVE – Markus