C#串口精准时间戳

标签 c# gps serial-port

我正在使用通过 USB(创建虚拟 COM 端口)连接的 GPS 鼠标/接收器来确定计算机时间漂移。 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 与秒表一起使用,但差异的噪音约为 20 毫秒。我看过达到 1 毫秒准确度/精度的论文。有谁知道我做错了什么?

最佳答案

DateTime 会有抖动,记录在案:

The resolution of this property depends on the system timer, which is approximately 15 milliseconds on Windows systems

MSDN

秒表实际上是多媒体计时器的包装,多媒体计时器是 Windows 平台上可用的最准确的计时器,但它们不提供绝对时间。他们以一定的频率给出滴答声,知道你可以将其转换为时间。问题是滴答声是启动时的滴答声,与系统时间无关。

旁注:这取决于您想要达到的精确程度。不要忘记硬件接收消息和读取 .NET 串行类中的字节有一定的延迟。与 .NET 不适合的“硬实时”相比,延迟可能会很大。

关于C#串口精准时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34920198/

相关文章:

c# - 如何从列表中删除在同一列表中有父项的项目

c# - Graphics.DrawImage() - 抛出内存不足异常

linux - Linux 中的以太网 + 串口

python - 无法使用Interceptty或slsnif嗅探通过串口发送的数据

c# - 为什么测试资源管理器看不到我的 ASP.NET Core MVC 的 NUnit 测试?

android - 通过 Titanium 进行地理定位

java - Android GPS获取行驶汽车速度

iphone - 使用 ROOT 权限获取 GPS,无需警报 View (越狱)

c - 从串行端口读取总是返回写入的内容

c# - 如何使用 LINQ 合并两个列表?