2016-01-21 2 views
3

Я использую GPS-мышь/приемник, подключенный через USB (создает виртуальный COM-порт) для определения временного дрейфа компьютера. GPS-мышь отправляет событие PPS в виде сообщения NMEA. Я хотел бы получить точную метку каждого полученного сообщения, чтобы я мог рассчитать разницу между временем GPS и временем компьютера.C# серийный порт точная метка времени

Каков наилучший способ получить отметку времени, как только будет получено сообщение. Я попробовал как с опросом последовательного порта, так и с полученным событием. Сейчас мой код выглядит следующим образом:

 while (serialPort.IsOpen()) 
     { 

       if (serialPort.BytesToRead != 0) 
       { GetSystemTimePreciseAsFileTime(out filetime); 
        DateTime collected = DateTime.Now; 


        time.Add(collected.Ticks.ToString()); 
        time2.Add(filetime.ToString()); 

        serialPort.DiscardOutBuffer(); 
        serialPort.DiscardInBuffer() 
       } 
       else { 

       } 
     }` 

Я попытался с DateTime.Now.Ticks с секундомером, но Шум разницы Arround 20мс. Я видел бумаги, где была достигнута точность/точность 1 мс. Кто-нибудь есть идея, что я делаю неправильно?

+0

Почему вы используете GetSystemTimePreciseAsFileTime() AND DateTime.Now? Почему бы просто не использовать GetSystemTimePreciseAsFileTime()? –

+0

Я пытался использовать все возможные таймеры, доступные на C#, и сравнивал их, чтобы убедиться, что это проблема. Это было просто для сравнения. – gojcic

ответ

0

DateTime будет иметь джиттера, что документируется:

Разрешение этого свойства зависит от системного таймера, который около 15 миллисекунд на системах Windows,

MSDN

StopWatch на самом деле является оберткой вокруг мультимедийных таймеров, наиболее точных таймеров, доступных на платформе Windows, но они не предлагают абсолютного времени , Они дают тики на определенной частоте, зная, что вы можете конвертировать это ко времени. Дело в том, что тики - это тики от запуска и не имеют никакого отношения к системному времени.

На стороне: это зависит от того, насколько точно вы хотите идти. Не забывайте, что есть определенная задержка в аппаратном обеспечении, получающем сообщение, и чтении байтов в последовательном классе .NET. Задержка может быть существенной по сравнению с «жестким реальным временем», для которой .NET не подходит.

+0

Было бы лучше сделать это на C++? Или это не изменит ситуацию. – gojcic

+0

Ну, все зависит от того, каковы цели? Для этого типа сценария существуют передовые методы, методы прогнозирования, когда появится следующее сообщение о временной отметке и исправление этого ожидания, фильтрация Калмана, ... Помните, что вы используете настольную операционную систему, а не операционную систему реального времени. –

Смежные вопросы