安卓对一堆数据进行NMEA数组校验后进行解析
时间: 2024-02-05 14:02:52 浏览: 90
NMEA(National Marine Electronics Association)是一种标准的串口通信协议,主要用于GPS设备和其他导航设备之间的通信。在安卓中,我们可以通过串口通信接收到NMEA数据流,然后进行校验和解析。
NMEA数据流的每个语句都以"$"开头,以回车和换行符"\r\n"结尾。校验和位于语句末尾,格式为"*HH",其中HH是两个十六进制数字,表示校验和的值。
要对NMEA语句进行校验,需要将"$"后面的所有字符(不包括"*"和校验和)进行异或运算,计算出一个校验和值。然后将校验和值转换为两个十六进制数字,并与语句中的校验和进行比较,如果相等则表示校验通过,否则校验失败。
例如,对于一个NMEA语句"$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47\r\n",我们需要对"GPFGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,"进行异或运算,得到一个校验和值,然后将该值转换为十六进制,得到"47"。最后将"47"与语句中的校验和"*47"进行比较,如果相等则表示校验通过。
解析NMEA语句需要根据语句类型和语句中的字段进行解析。不同类型的语句包含的字段不同,可以参考NMEA协议文档进行解析。常见的NMEA语句类型包括$GPGGA(GPS定位信息)、$GPGSA(GPS DOP和活动卫星信息)、$GPGSV(可视卫星信息)等。
相关问题
安卓对一堆数据进行NMEA数组校验
NMEA校验是一种简单的校验方式,用于验证数据的完整性和准确性。下面是安卓对一堆数据进行NMEA数组校验的示例代码:
```java
public static boolean checkNmea(String nmeaString) {
int starIndex = nmeaString.indexOf('$');
int endIndex = nmeaString.indexOf("*");
if (starIndex != -1 && endIndex != -1 && starIndex < endIndex) {
String payload = nmeaString.substring(starIndex + 1, endIndex);
int checksum = 0;
for (int i = 0; i < payload.length(); i++) {
checksum ^= payload.charAt(i);
}
String checksumString = nmeaString.substring(endIndex + 1);
try {
int expectedChecksum = Integer.parseInt(checksumString, 16);
return checksum == expectedChecksum;
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
return false;
}
```
在这个方法中,我们首先找到NMEA字符串中的“$”和“*”符号的位置,然后提取出有效负载(即两个符号之间的内容)。接下来,我们通过异或运算计算出有效负载的校验和。最后,我们将校验和与NMEA字符串中的校验和进行比较,以确定数据是否有效。
请注意,NMEA校验和是以十六进制形式表示的,因此我们需要使用Integer.parseInt()方法将其转换为整数以进行比较。如果校验和无效或无法解析,该方法将返回false。
安卓NMEA数组校验
NMEA 0183 协议是一种标准的串行通信协议,主要用于GPS接收器与其他设备之间的数据通信。在NMEA 0183协议中,每个数据包都由一个开始字符“$”、数据字段和一个校验和组成。
校验和是通过对数据字段中每个字节的异或操作得到的。校验和的计算范围是从开始字符“$”到校验和前面的最后一个逗号“,”为止的所有字节。校验和的值是一个十六进制数,它的范围是0x00到0xFF。
下面是一个计算NMEA校验和的示例代码:
```java
public static byte calculateChecksum(byte[] bytes) {
byte checksum = 0;
for (int i = 0; i < bytes.length; i++) {
if (bytes[i] == (byte) '$') {
continue;
}
if (bytes[i] == (byte) '*') {
break;
}
checksum ^= bytes[i];
}
return checksum;
}
```
该方法接受一个字节数组作为参数,该数组包含了从开始字符“$”到校验和前面的最后一个逗号“,”为止的所有字节。该方法遍历数组中的每个字节,如果遇到开始字符“$”,则跳过该字节;如果遇到结束字符“*”,则停止遍历。对于其他字节,该方法将它们全部进行异或操作,最后返回校验和的值。
示例:
```java
String nmea = "$GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68";
byte[] bytes = nmea.getBytes();
byte checksum = calculateChecksum(bytes);
System.out.println(String.format("%02X", checksum));
```
输出:
```
68
```
这就是该NMEA数据包的校验和。
阅读全文