Перейти к основному содержимому

Использование GPS для получения скорости и координат

Для администратора: проверка работы GNSS-приемника

Модуль: GNSS N10HD, последовательный порт /dev/ttyS2, скорость 115200 бод, 8 бит, без четности (115200n8).

Антенна: требуется активная антенна с питанием 3.3 В. При отсутствии антенны или ее обрыве возвращается статус ANT_OPEN.

1. Проверка наличия данных

# Предоставить права на чтение порта (при необходимости)
chmod 666 /dev/ttyS2

# Запустить прием NMEA-предложений
cu -l /dev/ttyS2 -s 115200

После запуска в терминале появятся строки, начинающиеся с $GNGGA, $GNGSA, $GNRMC, $GNTXT и др.

Пример вывода:

$GNGGA,,,,,,0,00,,,M,,M,,*78
$GNRMC,,V,,,,,,,,0.0,E,N,V*5C
$GNTXT,01,01,02,ANT_OPEN,B2,*33
  • $GNRMC с флагом A содержит достоверные координаты точки и навигационные данные (скорость, курс, время).
  • $GNTXT возвращает в том числе статус подключения антенны. Для активной исправной антенны отображается строка ANT_OK. Если антенна отсутствует или неисправна – ANT_OPEN (или ANT_SHORT).
  • Пока отсутствует фиксация (нет A), все поля координат и скорости будут пустыми или нулевыми.

2. Что проверять администратору

  • Убедиться, что антенна подключена и находится под открытым небом.
  • Проверить, что порт не занят другим процессом: lsof /dev/ttyS2.
  • При необходимости добавить пользователя в группу dialout для доступа к порту.

Для программиста: получение и парсинг GPS-данных

1. Открытие и чтение порта в приложении

Порт /dev/ttyS2 настраивается на скорость 115200, 8N1. Данные читаются построчно (\r\n – конец строки NMEA).

Пример на C:

int fd = open("/dev/ttyS2", O_RDWR | O_NOCTTY);
struct termios tty;
tcgetattr(fd, &tty);
cfsetispeed(&tty, B115200);
cfsetospeed(&tty, B115200);
tty.c_cflag |= CS8 | CLOCAL | CREAD;
tcsetattr(fd, TCSANOW, &tty);
// чтение строки
char buf[256];
read(fd, buf, sizeof(buf));

Пример на Python (с использованием pynmea2):

import serial
import pynmea2

ser = serial.Serial('/dev/ttyS2', 115200, timeout=1)
while True:
line = ser.readline().decode('ascii', errors='replace').strip()
if line.startswith('$GNRMC'):
msg = pynmea2.parse(line)
if msg.status == 'A': # данные достоверны
speed_knots = msg.spd_over_grnd
speed_kmh = speed_knots * 1.852
lat = msg.latitude
lon = msg.longitude
print(f"Координаты: {lat}, {lon} | Скорость: {speed_kmh:.1f} км/ч")
elif line.startswith('$GNTXT'):
# Пример: $GNTXT,01,01,02,ANT_OPEN,B2,*33
if 'ANT_OK' in line:
print("Антенна подключена")
elif 'ANT_OPEN' in line:
print("Антенна отсутствует или обрыв")

2. Проверка приема данных (для программиста)

  • Запустите простое чтение порта без парсинга и убедитесь, что строки приходят с интервалом ~1 с.
  • Убедитесь, что после появления $GNRMC с флагом A координаты и скорость имеют ненулевые значения.
  • При отсутствии A антенна не получает сигнал со спутников или неисправна (проверьте $GNTXT).

3. Рекомендации по использованию в промышленном коде

  • Используйте готовые библиотеки парсинга NMEA (например, libnmea для C, pynmea2 для Python, gpsd клиент для различных языков).
  • Не полагайтесь на cu или gpsmon в финальном решении – они предназначены только для отладки.
  • Обрабатывайте случаи с флагом V (невалидные данные), а также таймауты чтения.