2

我一直在研究一个在 SerialPort 上进行通信的程序并且遇到了问题。它的通信率低于 50% 或更少。如果没有,它大部分时间都会超时。

通过对这个问题的研究,我发现默认情况下全局或系统计时器分辨率至少为 10 毫秒或更大。

串行通信 (RTS) 和 Windows 7

因此,如果您在通信中使用 Thread.Sleep 暂停 X 毫秒,它可以做的最好的事情是 10 毫秒或更长的无操作或暂停。

就我而言,这对于我的程序与外部设备通信来说太长了。设备收到我的程序的请求后会在 10 毫秒内回复。如果我的程序还没有准备好接收回复,那么我的程序将超时。

解决此问题的唯一方法是调整或更改系统计时器分辨率。为此,我被告知使用来自 winmm.dll 的 Windows 方法 timeBeginPeriod 和 timeEndPeriod。虽然我能够为我的程序的 Windows .NET 版本导入这些方法,但我想知道在 .NET 框架中是否有这些方法的替代品。

4

1 回答 1

2

如果您的目标是避免调用特定于平台的 DLL 函数并仅使用 .Net 框架,那么对于短暂的超时,使用 System.Diagnostics.Stopwatch 循环可能是您最好的选择。

秒表会在出现时自动使用高分辨率计时器。

public static void Pause(long ms) 
{
    Stopwatch t = new Stopwatch();
    t.Start();
    while(t.ElapsedMilliseconds < ms) { }
    t.Stop();
}

这将在暂停循环中阻塞您的调用线程并占用 CPU,以减轻其中一些问题(如果您使用的是多核系统,您可以设置您的进程或线程与另一个核心的亲和性。如何设置处理器亲和性。网?

于 2012-11-05T15:17:27.670 回答