如何在串口上写入之间实施250毫秒的延迟?

时间:2010-01-11 19:26:59

标签: .net-3.5 serial-communication

我有一个使用SerialPort类与之通信的设备(数字指示器)。设备文档指出我需要在写入之间有250毫秒的延迟。有没有办法在不给系统带来额外延迟的情况下强制执行此操作?我知道这可能听起来像是我太担心一些非常小的东西,但这些指标中有三个很常见,但并非总是如此。基本上,有一种很好的方法可以强制你不要在不到250毫秒的时间内再次发送,但如果它是5秒并且我尝试发送,我不想无缘无故地延迟250毫秒。 / p>

思想?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

暂停线程应该适合你:

System.Threading.Thread.Sleep(250);

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

答案 2 :(得分:0)

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

相反,如果您担心操作系统调度问题导致平均时间不是250毫秒,或者确切地说距离精确度超过250毫秒,那么您手上就会遇到更难的问题而且您需要阅读硬实时技术(也许购买一些额外的硬件)。