Парсинг GPS-приемника производится через regex в Python

Вы можете обратиться к этому и получить некоторое представление

Когда использовать коллекцию в канале вместо отдельного канала

blockquote>

12
задан crashsystems 26 January 2009 в 09:06
поделиться

4 ответа

разделение должно добиться цели. Вот хороший способ извлечь данные, также:

>>> line = "$GPRMC,199304.973,3248.7780,N,11355.7832,W,1,06,02.2,25722.5,M,,,*00"
>>> line = line.split(",")
>>> neededData = (float(line[2]), line[3], float(line[4]), line[5], float(line[9]))
>>> print neededData
(3248.7779999999998, 'N', 11355.7832, 'W', 25722.5)
15
ответ дан 2 December 2019 в 03:54
поделиться

Более просто использовать разделение, чем regex.

>>> line="$GPRMC,092204.999,4250.5589,S,14718.5084,E,1,12,24.4,89.6,M,,,0000*1F "
>>> line.split(',')
['$GPRMC', '092204.999', '4250.5589', 'S', '14718.5084', 'E', '1', '12', '24.4', '89.6', 'M', '', '', '0000*1F ']
>>> 
8
ответ дан 2 December 2019 в 03:54
поделиться

Это - разделенные значения запятой, так пользование csv библиотекой является самым легким решением.

Я бросил те демонстрационные данные, которые Вы имеете в/var/tmp/sampledata, затем я сделал это:

>>> import csv
>>> for line in csv.reader(open('/var/tmp/sampledata')):
...   print line
['$GPRMC', '092204.999', '**4250.5589', 'S', '14718.5084', 'E**', '1', '12', '24.4', '**89.6**', 'M', '', '', '0000\\*1F']
['$GPRMC', '093345.679', '**4234.7899', 'N', '11344.2567', 'W**', '3', '02', '24.5', '**1000.23**', 'M', '', '', '0000\\*1F']
['$GPRMC', '044584.936', '**1276.5539', 'N', '88734.1543', 'E**', '2', '04', '33.5', '**600.323**', 'M', '', '', '\\*00']
['$GPRMC', '199304.973', '**3248.7780', 'N', '11355.7832', 'W**', '1', '06', '02.2', '**25722.5**', 'M', '', '', '\\*00']
['$GPRMC', '066487.954', '**4572.0089', 'S', '45572.3345', 'W**', '3', '09', '15.0', '**35000.00**', 'M', '', '', '\\*1F']

Можно затем обработать данные однако, Вы желаете. Это выглядит немного нечетным с '**' в запуске и конце некоторых значений, Вы могли бы хотеть снять изоляцию с того материала, можно сделать:

>> eastwest = 'E**'
>> eastwest = eastwest.strip('*')
>> print eastwest
E

Необходимо будет снять некоторые значения в качестве плаваний. Так, например, 3-е значение на первой строке демонстрационных данных:

>> data = '**4250.5589'
>> print float(data.strip('*'))
4250.5589
5
ответ дан 2 December 2019 в 03:54
поделиться

Необходимо также сначала проверить контрольную сумму данных. Это вычисляется XORing символы между $ и * (не включая их) и сравнение его к шестнадцатеричному значению в конце.

Ваш pastebin похож на него, имеет некоторые поврежденные строки в нем. Вот простая проверка, она предполагает, что строка запускается с $ и не имеет никакого CR/LF в конце. Для создания более устойчивого синтаксического анализатора, необходимо искать '$' и работу через строку до удара '*'.

def check_nmea0183(s):
    """
    Check a string to see if it is a valid NMEA 0183 sentence
    """
    if s[0] != '$':
        return False
    if s[-3] != '*':
        return False

    checksum = 0
    for c in s[1:-3]:
        checksum ^= ord(c)

    if int(s[-2:],16) != checksum:
        return False

    return True
4
ответ дан 2 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: