我有一个使用SerialPort类进行通信的设备(数字指示灯)。设备文档声明我需要在写入之间有250毫秒的延迟。有没有办法强制执行此操作,而不会在系统中增加额外的延迟?我知道这可能听起来像我太担心那些非常小的东西,但有三个指标,它经常阅读,但不是所有的时间。基本上,有没有一种好的方法可以强制你在250毫秒内不再发送,但如果它已经过了5秒,并且我尝试发送,我不想再无延迟地再延迟250毫秒。如何在串行端口写入之间执行250毫秒的延迟?
想法?
我有一个使用SerialPort类进行通信的设备(数字指示灯)。设备文档声明我需要在写入之间有250毫秒的延迟。有没有办法强制执行此操作,而不会在系统中增加额外的延迟?我知道这可能听起来像我太担心那些非常小的东西,但有三个指标,它经常阅读,但不是所有的时间。基本上,有没有一种好的方法可以强制你在250毫秒内不再发送,但如果它已经过了5秒,并且我尝试发送,我不想再无延迟地再延迟250毫秒。如何在串行端口写入之间执行250毫秒的延迟?
想法?
为了写入串行端口,可能需要一些类(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;
}
挂起线程应该为你工作:
System.Threading.Thread.Sleep(250);
然而,这可有点不准确的,因为你不能你的线程将被安排在下一次保证。如果你需要精确的时间,你最好使用旋转等待。
这并不回答这个问题。无论如何,这会导致它等待250毫秒。 – 2010-01-11 19:41:49
@Max:您可以使用“秒表”计算自上次写入端口以来已经过去的时间,并适当调整延迟时间。 – 2010-01-11 19:44:02
在每次传输前取一个时间戳。睡250秒(现在 - 然后)毫秒(显然,固定在零)。这似乎是你要求的。
相反,如果您担心操作系统调度问题的时间平均不会超过250毫秒,或者与250毫秒相差甚至超过一点点,那么您的问题就会变得更加棘手,您会需要阅读硬实时技术(也许购买一些额外的硬件)。
这就是我打算做的。我希望有一些更优雅的做法,但我想可能没有。谢谢 – 2010-01-11 19:41:01
或者,如果您愿意让您的写入不一定是“串行”并且愿意异步提交它们,您可以创建一个线程来执行提交,这些提交将在每次发送之间休眠250毫秒,然后等待一个锁定发送以便发送。 我没有写这个,因为它更复杂一些,而且大多数串行端口的使用要求数据以同步的方式处理。 – Erich 2010-01-11 19:44:42
是的,不幸的是它需要以同步的方式完成 – 2010-01-11 20:09:27