Arduino UNO单片机解析接收机发出的GPRMC格式报文的经度、纬度和前进速度的程序.
时间: 2023-06-27 08:05:00 浏览: 221
以下是一个基于Arduino UNO单片机的解析GPRMC格式报文的程序示例:
```c++
#include <SoftwareSerial.h>
SoftwareSerial gpsSerial(4, 3); // 使用软件串口连接GPS模块,D4为接收端,D3为发送端
void setup() {
Serial.begin(9600); // 开启硬件串口
gpsSerial.begin(4800); // 开启软件串口,设置波特率为4800
}
void loop() {
// 读取GPS模块发出的数据
while (gpsSerial.available()) {
char c = gpsSerial.read();
if (c == '$') { // 找到了一条NMEA语句的起始符
String sentence = gpsSerial.readStringUntil('\n'); // 读取整条语句
if (sentence.startsWith("$GPRMC")) { // 判断是否为GPRMC语句
// 解析语句
int comma1 = sentence.indexOf(',');
int comma2 = sentence.indexOf(',', comma1 + 1);
int comma3 = sentence.indexOf(',', comma2 + 1);
int comma4 = sentence.indexOf(',', comma3 + 1);
int comma5 = sentence.indexOf(',', comma4 + 1);
int comma6 = sentence.indexOf(',', comma5 + 1);
int comma7 = sentence.indexOf(',', comma6 + 1);
int comma8 = sentence.indexOf(',', comma7 + 1);
String validity = sentence.substring(comma2 + 1, comma3); // 取得有效性
if (validity == "A") { // 如果定位有效
// 取得纬度和经度
String latitudeStr = sentence.substring(comma3 + 1, comma4);
String longitudeStr = sentence.substring(comma5 + 1, comma6);
// 将纬度和经度转换为浮点数
float latitude = latitudeStr.substring(0, 2).toFloat() + latitudeStr.substring(2).toFloat() / 60;
float longitude = longitudeStr.substring(0, 3).toFloat() + longitudeStr.substring(3).toFloat() / 60;
// 取得前进速度
String speedStr = sentence.substring(comma7 + 1, comma8);
float speed = speedStr.toFloat() * 1.852; // 将速度转换为千米每小时
// 输出结果
Serial.print("Latitude: ");
Serial.println(latitude, 6);
Serial.print("Longitude: ");
Serial.println(longitude, 6);
Serial.print("Speed: ");
Serial.print(speed);
Serial.println(" km/h");
}
}
}
}
}
```
在这个程序中,我们使用了一个软件串口(SoftwareSerial)来连接GPS模块,因为Arduino UNO只有一个硬件串口,难以同时连接其他设备。我们使用了$GPRMC语句来解析报文,首先找到语句的起始符$,然后通过逗号分隔符找到各个字段的位置,最后将字段转换为相应的数据类型,输出到串口上。需要注意的是,由于GPS模块每秒钟只发送1~5条语句,因此程序需要不断循环读取串口,直到读取到完整的语句为止。
阅读全文