我正在使用通过 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
秒表实际上是多媒体计时器的包装,多媒体计时器是 Windows 平台上可用的最准确的计时器,但它们不提供绝对时间。他们以一定的频率给出滴答声,知道你可以将其转换为时间。问题是滴答声是启动时的滴答声,与系统时间无关。
旁注:这取决于您想要达到的精确程度。不要忘记硬件接收消息和读取 .NET 串行类中的字节有一定的延迟。与 .NET 不适合的“硬实时”相比,延迟可能会很大。
关于C#串口精准时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34920198/