ВНИМАНИЕ! На форуме началось голосование в конкурсе - астрофотография месяца - АПРЕЛЬ!
0 Пользователей и 1 Гость просматривают эту тему.
1PPS умеет? Какая точность? Зачем такой тяжеловесный .NET? Заодно укажите, в каких операционках он идёт по умолчанию, какие поддерживаются.
С 1PPS я даже не знаком, точнее вот только прочитал что это, но тестировать негде.
Я описал измерения на нашем сайте: "Глава 4: О времени". Устраивайтесь поудобнее и приятного чтения, там много -- и про 1PPS, и про NMEA, и про РВМ, и про NTP... Если бы можно было реализовать уточнение NMEA-времени по 1PPS-сигналам для синхронизации компа -- это было бы вообще классно. Особенно учитывая, что программист сам ЛА и русскоязычный. Только следует сразу оговориться, что учёт 1PPS-сигнала -- это для ПК (с СОМ-портом реальным или виртуальным через COM<-->USB переходник). Для мобильных устройств, конечно, такое реализовать сложнее (хотя я могу ошибаться). Может нужно просто предусмотреть опцию "использовать 1PPS" в окне программы?
Сейчас вроде бы тяжело встретить .NET ниже 3.5, на самом деле эта версия устанавливается по умолчанию при создании проекта в среде разработки и смысла менять на более старую я не увидел, 3.5 поддерживается "из коробки" в Windows XP SP3/Vista SP1/7/2008 R2/8/2012.
(я так полагаю портируемость на Mono не планируется?)
В XP SP3 идёт только 2.0, в XP SP2 - 1.1. Версия 3.5 идёт начиная с семёрки/2008 R2 и более поздних. Просто интересно, какой функционал в .NET 3.5, которого нет в 2.0, мог в принципе понадобиться в такой мелкой проге?Кстати, если хотите работать с миллисекундными точностями, неплохо было бы настроить планировщик на дискрет времени в 1 мс (mmtimer). Вы промеряли, что сборщик мусора не приводит к скачкообразному увеличению времени отклика на NMEA-посылку? Вообще, .NET-приложения - не самый оптимальный вариант для использования в приложениях, претендующих на реальное время.Если хотите использовать преимущества этой платформы в части быстрой разработки, но хотите сохранить реактивность приложения, сделайте критический ко времени код на C++/WinAPI (я так полагаю портируемость на Mono не планируется?) в виде DLL-ки, откуда стартуете фоновый поток, а дальше управляйте потоком через примитивы синхронизации, такие как Event (AutoResetEvent, ManualResetEvent в .NET) через p/Invoke.
Кстати добавлю, в приемниках Ublox и MTK периодичность выдачи координат можно настраивать от 1 до 10Гц, для UBlox есть неплохая программа конфигурации U-Center, либо можно посылать строку инициализации gps прямо из программы (для UBlox строки выглядят примерно так "$PUBX,41,1,0003,0001,115200,0*2D\r\n").
Я подозреваю, что системным часам нельзя передать время с дробным значением секунд -- тогда всё упрощается. Системное время устанавливаем только тогда, когда сначала приходит NMEA-метка, а потом соответствующая ей 1PPS-метка. Тогда никакого таймера не нужно. Коррекция часов раз в 5-10 с вполне достаточна -- за это время хотя бы один раз NMEA-метка придёт раньше 1PPS.
а вот просто интересно, не может тут самым узким местом оказаться драйвер COM-порта?
DWORD WINAPI SyncThread(void*); // не экспортируем его__declspec(dllexport) bool StartSync(const char* port, bool usePPS); // запуск потока синхронизации__declspec(dllexport) bool StopSync(); // останов потока синхронизации
internal static class SyncImports{ private const String DllName = "SyncLibrary"; // тут в случае чего меняем [DllImport(DllName)] public static extern bool StartSync(String comPort, bool usePPS); [DllImport(DllName)] public static extern bool StopSync();}
if (!new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)) { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.Verb = "runas"; startInfo.FileName = Application.ExecutablePath; try { Process.Start(startInfo); } catch (Win32Exception ex) { } Application.Exit();
А ещё неплохо было бы при неудачной попытке поднять привилегии программы до администраторских сообщать об этом.Код: [Выделить] if (!new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)) { ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.Verb = "runas"; startInfo.FileName = Application.ExecutablePath; try { Process.Start(startInfo); } catch (Win32Exception ex) { } Application.Exit();