从序列中解析NMEA句子
Parsing NMEA sentences from serial
我想在Arduino上使用TinyGPS++来解析NMEA数据并在OLED显示器上显示信息。但是,NMEA数据将通过USB接收,而不是使用软件串行和TX/RX引脚。
我遵循了TinyGPS++的例子,但是我遇到了两个问题:
1) 当我在串行监视器(Windows, Arduino 1.6.9)上发送一个NMEA句子时,只有前64个字符被Arduino接收。我该如何克服这个限制?我通过删除几个小数点来帮助自己,但这不是首选的方法。
2) 在TinyGPS++ basic示例中,在只读内存中定义了一个示例NMEA字符串:
// A sample NMEA stream.
const char *gpsStream =
"$GPRMC,045103.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*7Crn"
"$GPGGA,045104.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*62rn"
"$GPRMC,045200.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*77rn"
"$GPGGA,045201.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*6Crn"
"$GPRMC,045251.0,A,3014.0,N,09748.0,W,36.88,65.02,030913,,,A*7Drn"
"$GPGGA,045252.0,3014.0,N,09749.0,W,1,09,1.2,211.6,M,-22.5,M,,*6Frn";
并由
解析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] = ' ';
}
}
}
,并尝试通过:
来解析它index = 0;
while (index < 80) {
gps.encode(inData[index]);
Serial.print(inData[index]);
index++;
}
但是这并没有像期望的那样工作。检查位置isValid()
是否总是返回不为真。
不幸的是,我有几个可能的原因导致这个不希望的行为。
- 句子过短(不太可能)
- 通过串行读取数据的方式不正确。 我只提交了一行。
- 。
我既没有NMEA经验,也没有串行数据通信经验,我对Arduino/C只有很少的经验。你能给我指点一下如何解决这些问题吗?
基本上,您不需要累积NMEA字符。当你收到它们时,把它们输入GPS库。您不提供整个循环,但是这里也很容易出现问题。
在与几个GPS库及其示例进行了斗争之后,我最终编写了NeoGPS。它比所有其他库更快、更小,它验证校验和,并且示例结构正确。与其他库不同,NeoGPS不将GPS值存储为浮点值,因此它能够保留GPS设备的全部精度。
如果您想尝试一下,请务必遵循安装说明。n mea。没有一个示例将为您发送的每批GPS句子发出一行信息(CSV格式),以默认的RMC句子结束。确保将其修改为使用Serial
对象而不是gps_port
,或者简单地这样定义它:
#define gps_port Serial
它还将显示已解析的字符数,已接收的好句子的数量,以及有校验和错误的句子的数量。如果没有正确生成校验和,这有助于进行调试。这个网站也很有用。
这些CSV行将通过USB端口(到PC)发送回来,但您可以轻松地更改它以发送特定字段到OLED(见NMEAloc.ino)。
虽然可以在PC上开发一些东西,然后将其移植到像Arduino这样的嵌入式环境中,但您必须小心(1)线性程序结构和(2)忽略资源限制(程序大小,MCU速度和RAM)。Arduino环境中有许多怪癖,通常使将"草图"移植到PC上感到沮丧。,,: P
- 如何删除peer if else分支中的冗长句子
- 在输入句子时终止 std::out_of_range
- 使用 C++ 验证 NMEA 句子
- 分析包含 NMEA 句子的日志文件C++
- Vscode/C++ - cout 无法输出完整的句子,也无法与整数连接
- 如何理解句子的生命周期始于对e的评估
- 该程序将.csv文件中的一系列单词放入数组中,然后随机生成句子.但它不起作用
- C++从句子中删除给定字符的程序不起作用
- 如何让正则表达式匹配句子中间?
- 如何获取句子中单词的第一个字母*没有*指针,引用等
- 为什么函数的返回类型与实际句子不一致?
- 如何将时间和日期转换为 C 或 C++ 的句子格式?
- 引用 using 声明引入的功能的句子是什么意思?
- C++ 如何从句子中读取和存储值
- 句子转换器在存在新行的情况下不起作用
- 如何输入每个单词在字符串数组中的句子,直到用户按Enter键
- 句子与字符串向量中的每个句子的相似程度
- Flex Lexer 模式匹配句子分隔符/标点符号作为 URL 路径部分
- 开源 c++ 程序,接收 GPS (NMEA) 句子或 x,y 协调并在地图上播放位置
- 从序列中解析NMEA句子