ВНИМАНИЕ! На форуме начался конкурс - астрофотография месяца МАРТ-АПРЕЛЬ!
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();
public ListBox NMEAText;
private ListBox NMEAText;public void AddLog(String data);
switch (this.ParityList.Text) { case "None": this.OpenedPort.Parity = Parity.None; break; case "Even": this.OpenedPort.Parity = Parity.Even; break; case "Mark": this.OpenedPort.Parity = Parity.Mark; break; case "Odd": this.OpenedPort.Parity = Parity.Odd; break; case "Space": this.OpenedPort.Parity = Parity.Space; break; default: this.OpenedPort.Parity = Parity.None; break; } // ... switch (this.StopBitsList.Text) { case "1": this.OpenedPort.StopBits = StopBits.One; break; case "1.5": this.OpenedPort.StopBits = StopBits.OnePointFive; break; case "2": this.OpenedPort.StopBits = StopBits.Two; break; default: this.OpenedPort.StopBits = StopBits.One; break; }
internal sealed class DataItem<T>{ public String Title {get; private set; } public T Data {get; private set; } public DataItem(String title, T data) { this.Title = title; this.Data = data; } public DataItem(T data) : this(Convert.ToString(data), data) { } public override String ToString() { return Title; }}
foreach (Parity par in Enum.GetValues(typeof(Parity)){ ParityList.Items.Add(new DataItem<Parity>(par));}StopBitsList.Items.Add(new DataItem<StopBits>("1", StopBits.One));StopBitsList.Items.Add(new DataItem<StopBits>("1.5", StopBits.OnePointFive));StopBitsList.Items.Add(new DataItem<StopBits>("2", StopBits.Two));
this.OpenedPort.StopBits = ((DataItem<StopBits>)this.StopBitsList.SelectedItem).Data;this.OpenedPort.Parity= ((DataItem<Parity>)this.ParityList.SelectedItem).Data;
Данный код уже реализован, права администратора и так запрашиваются, при отказе их предоставить программа просто не будет запускаться.
Я этот код вытащил декомпиляцией сборки. Программа просто молча не будет запускаться, без сообщений, а это плохо.
Далее, бросаются в глаза очень частые косяки с приведениями типов:this.NMEADataForm.NMEAText.Items.Add((object) str3);Application.Run((Form) new MainForm());Вы по всей видимости недостаточно уверенно представляете себе систему типов в .NET-е и C#: приведение вверх по иерархии для ссылочных типов является операцией неявной, то есть не обязательно указывать приведения явно.
Значит декомпилятор наврал, лишнее влепил. Беру свои слова назад и приношу извинения.
Ну и ещё пара замечаний по части производительности.Строки в .NET являются неизменяемыми объектами. Когда порождается новая строка в результате конкатенации или других действий, они создаются заново, регистрируются в специальном кэше строк и только тогда становятся доступными. Операция конкатенации нескольких строк - достаточно дорогая операция по части работы с памятью, особенно если речь идёт о коротких строках, что ведёт к достаточно серьёзной деградации производительности. Интенсивная работа с мелкими строками, где создаётся много промежуточных строк, увеличивает нагрузку на сборщик мусора, который может достаточно долго заниматься сбором мусора и дефрагментацией памяти малых объектов. Весьма рекомендую почитать про класс StringBuilder. Может быть здесь это и не так актуально, но на будущее будет полезным.Далее, если хотите отформатировать одну переменную, не следует это делать в виде String.Format("{0:format}", arg), лучше сделать arg.ToString("format").Второй вопрос касается производительности операции упаковки (boxing). Если Вы используете String.Format с большим количеством аргументов структурных, то стоит подумать о явном форматировании аргументов (если с производительностью действительно не всё хорошо).А ещё могу посоветовать очень хорошую книгу по C#
А ещё могу посоветовать очень хорошую книгу по C#
по программерской части мне ближе более низкоуровневые C/Asm и вообще работа с микроконтроллерами
Сергей, попробовал вашу программку -- чего-то не завелось... Использовал GPS-приёмник "Garmin 35HVS" с COM-портом. Софтина VisualGPS видит приёмник отлично -- см. первую картинку. А ваша -- только системное время показывает и число спутников... Может это связано с тем, что мой GPS передаёт на порт расширенный список параметров (см. третью картинку)? Какие из них отключить (я могу переконфигурировать GPS)?Система: Windows XP En SP3.P.S. Траблы с кнопками, наверно, из-за моей видеокарты.
А файл где? Обновление приложения в первом сообщении?
Провёл тесты с новой версией. Есть следующие проблемы:1). Всё отображает нормально, но даже при нескольких последовательных нажатиях кнопки "Synch" синхронизация системых часов и GPS-приёмника не достигается -- остаётся разность в ~1 с. См. рис.2). Сравнение с синхрогизацией системных часов по NTP-серверам тоже не радужное. При переключении между разными серверами и последующей синхронизации (используя "Dimension 4") системные часы "прыгают" на 20-50 мс. Если сделать синхронизацию вашей программой, а потом сделать синхронизацию с NTP-сервером при помощи "Dimension 4", то появляется сдвиг времени +1/+1,5 с. 3). За корректность синхронизации по NTP-серверу говорят и часы другого GPS-приёмника -- расхождение в 0,5-1 с визуально было бы видно сразу. А её нет.Сергей, попробуйте сравнить синхронизацию своей программой с синхронизацией по NTP-серверу (сначала нажимаем "Synch" в SatTime'е, а потом кнопку "OK" в "Dimension 4" -- она напишет, какую коррекцию провела после синхронизации. Подробнее про настройку "Dimension 4" см. на нашем сайте в известной вам статье).Какие могут быть причины таких багов? Варианты:а). Траблы с GPS-приёмником. Завтра постараюсь сделать длинный COM-кабель для другого GPS -- "Garmin eTrex H" -- и повторить эксперимент с ним (GPS приходится выносить в форточку на двухметровой мачте, чтобы ловил нормально сигнал). Заодно проконтролирую по сигналам РВМ.б). Слабый комп не справляется: тестировал на стареньком AMD Athlon XP 1700+ (1.47 GHz, 768 MB RAM). в). Баги в самой программе.
Сегодня купил кабель и подсоединил GPS-приёмник "Garmin eTrex H". Пункт "а" отпадает -- с другим приёмником те же баги. Причём кажется, что со временем ошибка накапливается -- до +1,5 с за 30 с между синхронизациями по NTP...
1PPS - это сигнал, который передаётся по отдельной линии, в виде импульсов, фронт которого совпадает с высокой точностью с началом новой секунды (1212Lupus точнее скажет, какие погрешности), а длительность его - несколько десятков микросекунд. Не все GPS-приёмники передают эту секундную метку.
PS: А где можно раздобыть сию обновлённую радость?
Т.е. брать его надо непосредственно с ноги микрухи GPS приемника?
P.S. Вопрос с 1PPS так пока и открыт ибо не знаю где и как его получать.
Цитата: CEBEP от 23 Янв. 2013 [15:33:35]Т.е. брать его надо непосредственно с ноги микрухи GPS приемника?Не факт. Его может не быть вообще.
Логические уровни передатчика: "0" – от +5 до +15 Вольт, "1" – от -5 до -15 Вольт.Логические уровни приемника: "0" – выше +3 Вольт, "1" – ниже -3 Вольт.Максимальная нагрузка на передатчик: входное сопротивление приемника не менее 3 кОм.
Наконец-то дошли руки дописать измененную версию. Теперь на C# осталась только графика, все операции по работе с приемником и выставлении времени написаны на чистом WinAPI.Из нового функционала:1. Исправлены ошибки2. Повышена точность времени3. Новый интерфейс4. Возможность просмотра и сохранения лога данных5. Выбор строк NMEA, которые будут использоваться для получения времени6. Автоматическая синхронизация через заданные интервалы7. Возможность коррекции ошибки времени8. Звуковое оповещение наступления новой секунды для ручного выставления времени9. Сворачивание в трейПока тестировалась только на моем единственном приемнике с u-blox 5. Буду очень признателен сообщениям о проблемах с запуском, работе программы и особенностях поведения с Вашим приемником.Новая версия (скачать с Google Диска): https://drive.google.com/folderview?id=0B3or78bCO2OHV0FidGh4T01ZdmM&usp=sharing
Сейчас подумал... Не, приведённая выше схема на NE555 не подходит -- точность мала. Нужна стабилизация часовым кварцем.
Новая версия отваливается после попытки нажатия "Open".WinXP SP3 En, IBM T23, Garmin 35HVS. Проги отображения информации GPS с этим приёмником и компом работают.
Увы, я пока сижу на XP. Да и переходника COM-USB нету, а COMов на ПК с системой Win 7 сейчас уже нету.
Если прога на шарпе, то было бы недурно подписаться у текущего AppDomain-а на событие UnhandledException и писать стектрейс в лог.
Виталий, а можно получить как-нибудь NMEA лог с вашего приемника, чем больше размер, тем лучше.
Цитата: CEBEP от 27 Янв. 2014 [11:55:21]Виталий, а можно получить как-нибудь NMEA лог с вашего приемника, чем больше размер, тем лучше. Вот лог за 20 минут.
ЭЭэээээ..... А что Вы такого из 4 фреймворка используете, что он вдруг понадобился?
А зачем? Для каких целей?
А почему бы не включить режим Debug и не мучаться? И понизить требования к фреймворку до необходимого минимума.Смотрю Reflector-ом внутренности и не вижу ровным счётом ничего из того, что требовало бы что-то выше чем фреймворк 2.0
Цитата: Deimos от 29 Янв. 2014 [15:47:12]А почему бы не включить режим Debug и не мучаться? И понизить требования к фреймворку до необходимого минимума.Смотрю Reflector-ом внутренности и не вижу ровным счётом ничего из того, что требовало бы что-то выше чем фреймворк 2.0 Что вы имеете в виду под режимом Debug? Конфигурацию в которой определяется константа DEBUG и отрубается оптимизация кода?
Да. Оптимизация, к слову, не всегда вырубается.
Есть. С Win7 идёт предустановленный .NET Framework 3.5. 4.0 появляется только с Win8. Так что утверждение совсем не верное.
Уважаемый СЕВЕР, во-первых, спасибо за программу, во-вторых - не планируете дописать сохранение настроек, чтобы можно было полноценно запускать программу при включении компьютера? Очень бы пригодилось...
сохранение еще не доделал, хорошо, что напомнили, надо будет доделать
// определениеclass MyConfiguration : ConfigurationBase{ public Point WindowLocation {get; set;} public Size WindowSize {get;set;} public bool Valid {get; set;} protected override OnLoad(bool valid) { this.Valid = valid; }}// ИнстанцированиеMyConfiguration cfg = MyConfiguration.Load<MyConfiguration>("Common"); // аргумент - имя параметра в реестре// Загрузкаif (cfg.Valid){ mainWindow.Location = cfg.WindowLocation; mainWindow.Size = cfg.WindowSize;}// сохранениеprivate void mainWindow_Resize(Object sender, EventArgs e){ if (mainWindow.WindowState == WindowState.Normal) { using (cfg.Updating()) { cfg.WindowLocation = mainWindow.Location; cfg.WindowSize = mainWindow.Size; } // при выходе из блока using будет произведено неявное сохранение }}// илиprivate void mainWindow_Resize(Object sender, EventArgs e){ if (mainWindow.WindowState == WindowState.Normal) { cfg.WindowLocation = mainWindow.Location; cfg.WindowSize = mainWindow.Size; cfg.Flush(); // явное сохранение }}
Скачал SatTime 1.2 . Установил её на 32 разрядную семёрку с первым сервис паком. Подключил USB GPS модуль u-blox7. Увы, SatTime показывает только системное время. Модуль при этом работает нормально, программа u-center всё что положено показывает - спутники, местоположение, время.
приемник ublox m8030 также не работает в версии 1.2
буду копать дальше
Не покажете кусочек данных секунд 5 длиной, который у Вас получился? Можно даже до выхода не режим.
NMEA, конечно.Пришло в личку по понятным соображениям. Там есть предложения и с $GPxxx (GPS), и $GNxxx (объединённые). Прога ухватилась только за $GPxxx, то есть данные GPS-модуля, но остальные всё равно игнорирует, притом без вмешательства автора навести порядок не выйдет.
раздел TXSLOT - ставим галки на I2C, UART1, USBраздел MSG - выбрать разделы 01-24 NAV-TIMEBDS, 01-25 NAV-TIMEGAL, 01-23 NAV-TIMEGLO, 01-20 NAV-TIMEGPS, 01-21 NAV-TIMEUPS и проверить, тоят ли там эти же галочки.
Таки был не прав. Злоупотребив некоторыми инструментами, которыми обычно запрещают пользоваться, выяснил, что прога обрабатывает предложения GGA, ZDA, RMC, GSV от всех навигационных систем. Вот тут более детальное их описание: http://aprs.gids.nl/nmea/
Получил "шнурок" ноунейм 808 с чипом U-Blox 8030КТ - все в одном - и GPS, и Глонасс, и Бейду, и Галилео. ....Для того чтобы все заработало:раздел TXSLOT - ставим галки на I2C, UART1, USBраздел MSG - выбрать разделы 01-24 NAV-TIMEBDS, 01-25 NAV-TIMEGAL, 01-23 NAV-TIMEGLO, 01-20 NAV-TIMEGPS, 01-21 NAV-TIMEUPS ....
в windows 10 программа не работает в автозапуске
Получил "шнурок" ноунейм 808 с чипом U-Blox 8030КТ - все в одном - и GPS, и Глонасс, и Бейду, и Галилео.
Здравствуйте! Подскажите, GPS-USB модуль U-Blox7 таки работает с программой SatTime? Хочу приобрести для коррекции точного времени на ПК для наблюдений астероидов. Думаю, какой брать. U-Blox7 самый доступный...
Установите программку BktTimeSync, с этим свистком работает без проблем. Вдобавок эта программа синхронизирует время и по NTP, если для астрометрии астероидов, то этого вполне достаточно.