Здравствуйте, vsb, Вы писали:
vsb>Ну мне все эти микросекунды роли не играют, у меня точность 2 секунды, а не микросекунды.
Действительно, непонятно зачем тебе советуют тут решать какие-то уравнения, слушать несколько спутников, вычислять коррекции и поправки, и прочую жесть.
Так как в gps каждая строка данных, переданная со спутника, содержит временную метку в HOW-слове. Для желаемой точности достаточно просто транслировать её наружу с любого из спутников, даже без сравнения с другими.
> Т.е. я бы предпочёл запитать приёмник на 10 мс, поймать первый попавшийся сигнал и потушить его сразу, и пусть там будет точность +- секунда
А вот так не получится.
Хотя временные метки и находятся в каждом subframe, но один subframe занимает 300 бит, а в GPS скорость передачи — 50 бит в секунду. То есть для минимальной порции данных придётся принимать сигнал минимум 6 секунд.
Дальше — хуже. В HOW находится не весь timestamp, а лишь младшая его часть — время с начала gps-недели.
Какая сейчас gps-неделя, конечно, тоже передаётся, но лишь в subframe 1, то есть раз в 30 секунд. И там тоже не все биты, а лишь по модулю 1024 (
https://en.wikipedia.org/wiki/GPS_week_number_rollover).
Но и это ещё не всё. Тебя скорее интересует UTC-время. А в нём есть
високосные секунды. А gps-time течёт непрерывно.
То есть gps-timestamp нужно скорректировать на несколько целочисленных високосных секунд: а они наступают непредсказуемо. Если эту информацию не обновлять, то каждые несколько лет будет добавляться ошибка ровно в одну секунду.
А обновлять эту информацию можно либо из
tzdata, либо из 18-й страницы альманаха (транслируется раз в 12.5 минут, достаточно получать раз в полгода).
Понятно, что если слышно несколько спутников, то можно дождаться первого ответа, кратно уменьшив время ожидания, но даже если тебе откуда-то (например, с предыдущего запуска) уже известна вся нужная информация, то всё равно субсекундного времени приёма не будет достаточно.