代码之家  ›  专栏  ›  技术社区  ›  Max Schmeling

如何在串行端口上强制执行写入之间的250毫秒延迟?

  •  1
  • Max Schmeling  · 技术社区  · 15 年前

    我有一个使用serialport类与之通信的设备(数字指示器)。设备文档说明在两次写入之间需要有250毫秒的延迟。有没有一种方法可以在不给系统增加额外延迟的情况下执行此操作?我知道这听起来好像我太担心一些非常小的事情了,但是有三个指标,它经常读,但不是一直读。基本上,有没有一个很好的方法可以强制您在250毫秒内不再发送,但是如果它是5秒,并且我尝试发送,我不想无缘无故地再延迟250毫秒。

    思想?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Erich    15 年前

    为了写入串行端口,您应该有一些类,可能只有一个写入点(一个writetoport函数或其他东西)。

    在这一点上,您可以在每次写入时节省当前时间,然后使用延迟逻辑来实现这一点。所以:

    DateTime lastWritten;
    TimeSpan timeBetweenWrites = new Timespan(0,0,0,0,250);
    void WriteToDevice(string data)
    {
        TimeSpan sinceLastWrite=DateTime.Now-lastWritten;
        if(sinceLastWrite<timeBetweenWrites)
            Thread.Sleep(timeBetweenWrites-sinceLastWrite);
        SerialPort.Write(data);
        lastWritten=DateTime.Now;
    }
    
        2
  •  1
  •   Mehrdad Afshari    15 年前

    暂停线程应该对您有用:

    System.Threading.Thread.Sleep(250);
    

    但是,这可能有点不准确,因为您不能保证下次线程将被调度。如果你需要精确的时间安排,你最好使用旋转等待。

        3
  •  0
  •   Andy Ross    15 年前

    在每次传输之前获取一个时间戳。睡眠250(现在-然后)毫秒(显然夹在零)。这似乎是你想要的。

    相反,如果您担心操作系统调度问题,使时间平均不超过250毫秒,或者与250毫秒相差一点点多,那么您在我们手上有一个更困难的问题,您将需要阅读硬实时技术(可能还需要购买一些额外的硬件)。