2010-01-11 83 views
1

我有一个使用SerialPort类进行通信的设备(数字指示灯)。设备文档声明我需要在写入之间有250毫秒的延迟。有没有办法强制执行此操作,而不会在系统中增加额外的延迟?我知道这可能听起来像我太担心那些非常小的东西,但有三个指标,它经常阅读,但不是所有的时间。基本上,有没有一种好的方法可以强制你在250毫秒内不再发送,但如果它已经过了5秒,并且我尝试发送,我不想再无延迟地再延迟250毫秒。如何在串行端口写入之间执行250毫秒的延迟?

想法?

回答

2

为了写入串行端口,可能需要一些类(WriteToPort函数或其他)。在这种情况下,您可以在每次写入时保存当前时间,然后在延迟上使用逻辑。 SO:

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; 
} 
+0

这就是我打算做的。我希望有一些更优雅的做法,但我想可能没有。谢谢 – 2010-01-11 19:41:01

+0

或者,如果您愿意让您的写入不一定是“串行”并且愿意异步提交它们,您可以创建一个线程来执行提交,这些提交将在每次发送之间休眠250毫秒,然后等待一个锁定发送以便发送。 我没有写这个,因为它更复杂一些,而且大多数串行端口的使用要求数据以同步的方式处理。 – Erich 2010-01-11 19:44:42

+0

是的,不幸的是它需要以同步的方式完成 – 2010-01-11 20:09:27

1

挂起线程应该为你工作:

System.Threading.Thread.Sleep(250); 

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

+0

这并不回答这个问题。无论如何,这会导致它等待250毫秒。 – 2010-01-11 19:41:49

+0

@Max:您可以使用“秒表”计算自上次写入端口以来已经过去的时间,并适当调整延迟时间。 – 2010-01-11 19:44:02

0

在每次传输前取一个时间戳。睡250秒(现在 - 然后)毫秒(显然,固定在零)。这似乎是你要求的。

相反,如果您担心操作系统调度问题的时间平均不会超过250毫秒,或者与250毫秒相差甚至超过一点点,那么您的问题就会变得更加棘手,您会需要阅读硬实时技术(也许购买一些额外的硬件)。