C#串口精确时间戳

3
我正在使用连接到计算机的GPS鼠标/接收器(创建虚拟COM端口)来确定计算机时间漂移。 GPS鼠标以NMEA消息的形式发送PPS事件,我希望能够获得每个接收到的消息的精确时间戳,以便我可以计算GPS时间和计算机时间之间的差异。
如何在接收到消息时获得时间戳是最佳方式?我尝试过轮询串行端口和数据接收事件。现在我的代码看起来像这样:
     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和Stopwatch,但差异的噪声约为20毫秒。我看过一些文献,其中实现了1毫秒的精度/准确性。有人知道我做错了什么吗?


你为什么要同时使用GetSystemTimePreciseAsFileTime()和DateTime.Now?为什么不只使用GetSystemTimePreciseAsFileTime()呢? - Matthew Watson
我尝试了C#中所有可能的计时器,并进行了比较,以查看是否存在问题。这只是为了比较。 - gojcic
1个回答

0

日期时间将产生抖动,这是有文献记录的:

该属性的分辨率取决于系统计时器,在Windows系统上约为15毫秒

MSDN

实际上,StopWatch在多媒体计时器周围进行包装,这是Windows平台上最准确的计时器,但它们不提供绝对时间。它们以一定的频率提供滴答声,知道了这两个因素,您可以将其转换为时间。问题是这些滴答声来自启动时的滴答声,并且与系统时间无关。

顺便说一下:这取决于您想要多精确。别忘了硬件接收消息并读取.NET串行类中的字节存在一定的延迟。相对于“硬实时”而言,延迟可能很大,而.NET不适用于“硬实时”。


用C++做会不会更好呢?还是说这没什么区别? - gojcic
这完全取决于目标是什么?对于这种类型的场景,存在高级技术,包括预测下一个时间戳消息何时到达并根据该期望进行纠正,卡尔曼滤波等技术。请记住,您正在使用桌面操作系统而不是实时操作系统。 - Jef Patat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接