Использование 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(невалидные данные), а также таймауты чтения.