2010-01-11 53 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毫秒相差甚至超過一點點,那麼您的問題就會變得更加棘手,您會需要閱讀硬實時技術(也許購買一些額外的硬件)。