我有一個使用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