我有一个使用 SerialPort 类与之通信的设备(数字指示器)。设备文档指出我需要在写入之间有 250 毫秒的延迟。有没有办法在不给系统带来额外延迟的情况下强制执行此操作?我知道这可能听起来像是我对非常小的事情太担心了,但是其中有三个指标,它经常阅读它们,但不是一直都在阅读它们。基本上,有没有一种好方法可以强制您在不到 250 毫秒内再次发送,但如果已经 5 秒并且我尝试发送,我不想无缘无故地再延迟 250 毫秒。
想法?
我有一个使用 SerialPort 类与之通信的设备(数字指示器)。设备文档指出我需要在写入之间有 250 毫秒的延迟。有没有办法在不给系统带来额外延迟的情况下强制执行此操作?我知道这可能听起来像是我对非常小的事情太担心了,但是其中有三个指标,它经常阅读它们,但不是一直都在阅读它们。基本上,有没有一种好方法可以强制您在不到 250 毫秒内再次发送,但如果已经 5 秒并且我尝试发送,我不想无缘无故地再延迟 250 毫秒。
想法?
您应该有某种类来写入串行端口,也许是单点写入(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;
}
暂停线程应该适合你:
System.Threading.Thread.Sleep(250);
但是,这可能有点不准确,因为您无法保证下次线程将被安排。如果您需要精确的计时,最好使用自旋等待。
在每次传输之前获取时间戳。睡眠 250 毫秒(现在 - 那时)(显然,固定为零)。这似乎是你所要求的。
相反,如果您担心操作系统调度问题会导致平均时间不是 250 毫秒,或者与 250 毫秒相比稍有偏差,那么您面临一个更难的问题,您需要阅读硬实时技术(也许购买一些额外的硬件)。