0

我正在为 gps 跟踪器进行 nmea 处理,我正在以这种方式将其作为值列表进行处理

"""
information package exmaple
41719.285,A,1623.5136,S,07132.9184,W,017.8,203.5,040613,,,A*6B|1.6|2375|1010|0000,0000|02CC000A138E96D6|11|0029560C
"""
gprmc, hdop, altitude, state, ad, baseid, csq, journey = information.split('|')
ptime, gpsindicator, lttd, ns, lgtd, ew, speed, course, pdate, dd, checksum = gprmc.split(',')

然后,有时数据包更大,但是格式很好,这是因为一些客户重新配置设备的数据超出了他们的需要,导致我的程序崩溃,所以我正在寻找一种方法,我的代码不会在这些中崩溃案例。

4

5 回答 5

1

你的解析器很简单。如果有一个“ ”,则在最后一个预期的属性之后,正好读取“ ”之后的 2 个字符,即校验和。更正它以在“*”之后准确读取 2 个字符。

通常 NMEA 是唯一的规范,但没有很好地指定。每个 GPS 制造商都以自己的方式对其进行解释。编写一个通用的 NMEA 解析器非常困难,您可以查看 GPSBable 源代码,看看他们考虑的特殊接收者的特殊情况有多少。

此外,您给出的示例无效。一个有效的 NMEA 句子以“$”作为第一个字符开始。例如 $GPRMC

于 2013-06-13T15:27:24.857 回答
1

快速修复:

"""
information package exmaple
41719.285,A,1623.5136,S,07132.9184,W,017.8,203.5,040613,,,A*6B|1.6|2375|1010|0000,0000|02CC000A138E96D6|11|0029560C
"""
# Unpack only the eight first values to the eight variables
gprmc, hdop, altitude, state, ad, baseid, csq, journey = information.split('|')[:8]
# Unpack only the eleven first values to the eleven variables
ptime, gpsindicator, lttd, ns, lgtd, ew, speed, course, pdate, dd, checksum = gprmc.split(',')[:11] 

当然,更好的方法是事先检查信息的有效性及其数量。

于 2013-06-13T15:27:55.907 回答
1

使用切片

gprmc, hdop, altitude, state, ad, baseid, csq, journey = information.split('|')[:8]
data = gprmc.split(',')
ptime, gpsindicator, lttd, ns, lgtd, ew, speed, course, pdate, dd = data[:10] 
checksum = data[-1] 

在 python 3.x 中可以使用通配符

gprmc, hdop, altitude, state, ad, baseid, csq, journey, *_ = information.split('|')
(ptime, gpsindicator, lttd, ns, lgtd, 
 ew, speed, course, pdate, dd, *_, checksum) = gprmc.split(',')
于 2013-06-13T15:30:39.450 回答
1

有点侧面的答案,因为我有点不习惯给...

如果您对使用 Python 解析有效的 GPS 数据(尤其是 NMEA 0183)感兴趣,您可能对 twisted.positioning 感兴趣:我试图进入的一个分支,它可以处理您需要做的所有严重粗糙的事情GPS 设备中的有用数据。

或者,您可能对 gpsd 感兴趣,以担任相同的角色。最终,twisted.positioning 将获得一个 gpsd 提供程序,这样您就可以编写相同的代码,但让它通过 gpsd 提供数据。或者,如果您愿意,您可以从其他地方获取定位数据——界面非常通用。

于 2013-06-13T19:03:55.470 回答
0

您可以以固定方式引用字段,例如:

inputStr = "a,b,c";
mylist = inputStr.split(',');
print mylist[0];

一种

print mylist[len(mylist) - 1];

C

“len(mylist) - 1”可以从最后一个字段中提取校验和。

于 2013-06-13T15:36:11.280 回答