我需要测量串行端口上字符事件之间的时间,最好是在 Windows 7 下。
我在各个地方都读过诸如“ Windows 不会提供大于 10 毫秒的分辨率”之类的声明,但我无法找出那是什么真正的意思。
问题是操作系统无法更准确地传递事件,还是计时功能(用于测量)曾经那么“差”?(我在想GetTickCount)
如果是后者,那么我想我应该能够使用 QueryPerformanceCounter 之类的东西进行足够好的测量,但是如果事件没有以类似的准确度传递,那显然无济于事。
我需要测量串行端口上字符事件之间的时间,最好是在 Windows 7 下。
我在各个地方都读过诸如“ Windows 不会提供大于 10 毫秒的分辨率”之类的声明,但我无法找出那是什么真正的意思。
问题是操作系统无法更准确地传递事件,还是计时功能(用于测量)曾经那么“差”?(我在想GetTickCount)
如果是后者,那么我想我应该能够使用 QueryPerformanceCounter 之类的东西进行足够好的测量,但是如果事件没有以类似的准确度传递,那显然无济于事。
我认为10毫秒的时间是由于任务切换。即使您的计时应用程序是唯一正在运行的用户任务,仍然有一堆系统任务可能会被打开。
最重要的是,我猜测在端口上接收字符和接收DataReceived
事件(或您想要的任何软件通知)之间的时间是高度可变的。UART 芯片可能不会中断 CPU,直到感觉像它(通常当它的 FIFO 已满或某些超时到期时),然后内核可能会决定在将中断信息发送到您的应用程序之前需要一些时间。因此,即使您可以在软件中使用高分辨率计时器,您也可能会受到硬件/内核级别可变性的摆布。
您可以使用秒表来获得更高的计时分辨率。这是在 System.Diagnostics 中,其 Elapsed 字段(时间跨度)的分辨率为 100 纳秒(我希望这足够准确!)。我使用 C++ Builder 并且经常输入这样的代码:
#include <Diagnostics.hpp>
TStopwatch SW;
TTimeSpan TS;
SW = TStopwatch::StartNew();
// Do something we need timed here ...
SW.Stop();
TS = SW.Elapsed;
Caption="That took "+String(TS.Minutes)+" Minutes, "+String(TS.Seconds)+" Seconds."+String(TS.Milliseconds)+" mS.";
欲了解更多信息,这里是 MSDN 页面的链接:
https://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch(VS.110).aspx