2012-10-01 41 views
1

在我的.Net控制檯應用程序中,我有以下方法將少量字節(約20)寫入串口,然後讀取一個響應(再次不超過20字節)。它用於與外部硬件設備進行通信 - 向它發送數據請求並獲取請求的值。奇怪的串行端口讀/寫行爲

我切出多餘的代碼,端口的初始化,變量的聲明等,但你仍然可以看到它在做什麼: -

var sw = new Stopwatch(); 
sw.Start(); 

// Write the "request" bytes. 
_port.Write(buffer, 0, buffer.Length); 

Console.WriteLine("After write: {0}", sw.ElapsedMilliseconds); 
sw.Restart(); 

// Wait for response, but timeout after 100ms. 
var timeoutCount = 0; 
while (_port.BytesToRead == 0 && timeoutCount < 100) 
{ 
    Thread.Sleep(1); 
    timeoutCount++; 
} 

Console.WriteLine("Waited: {0}, #loops: {1}", sw.ElapsedMilliseconds, timeoutCount); 

if (_port.BytesToRead == 0) 
{ 
    // Timed-out.. 
    return null; 
} 

// Read the response. 
var receivedData = new byte[_port.BytesToRead]; 
_port.Read(receivedData, 0, receivedData.Length); 

return receivedData; 

我的應用程序調用上面的代碼在緊張的(幾乎是連續的)環。你會發現我已經添加了一對夫婦Console.WriteLines輸出一些定時,我看到非常一致的數字是這樣的: -

After write: 0 
Waited: 14, #loops: 1 
After write: 0 
Waited: 14, #loops: 1 
After write: 0 
Waited: 14, #loops: 1 
...and so on... 

顯然,寫入正在發生非常迅速,而且響應也很快到達,因爲該應用只經歷了while循環一次,儘管我爲什麼顯示14ms,但它只執行一個Thread.Sleep(1)而感到困惑。

更奇怪的是,F我做別的事情的PC就像打開另一個窗口上,有Chrome中運行,甚至只是移動鼠標,然後我就看到這樣的數字: -

After write: 0 
Waited: 4, #loops: 5 
After write: 0 
Waited: 2, #loops: 3 
After write: 0 
Waited: 2, #loops: 3 
After write: 0 
Waited: 1, #loops: 2 
After write: 0 
Waited: 3, #loops: 4 

這更像我期望從串口代碼(如我的),而不是我在PC「空閒」時看到的神祕14ms。關於發生了什麼的任何想法?

這是我的問題,因爲我的應用程序每100ms需要執行大約12次讀寫操作。您可以從第二組定時(每個幾ms)中看到這很容易實現,但是當PC處於「空閒」狀態時,每次寫入/讀取需要14ms,導致我的應用程序定期缺少數據(外部更新設備每100ms)。

回答

0

看起來您有實時需求,但您正在開發一個非實時系統(Windows)。 Sleep(1)只是告訴操作系統你的線程至少有1ms不能重新激活,所以它會消失至少1ms,當調度器達到它時會返回。

鼠標移動看起來使其表現更好的原因是因爲它會導致調度程序被所有鼠標移動事件更頻繁地調用。

考慮使用實時操作系統,或者不依賴於Windows進行調度,但如果您的_port.write()阻止系統調用,如WaitForSingleObject或Sleep,那麼可能會很困難。你也可以考慮放棄任何實時需求,並且只要你從串口獲得它就可以得到它。

+0

因此,即使鼠標事件發生在不同的窗口中,它仍然會更頻繁地使調度程序「service」* my *應用程序?有什麼辦法來控制/配置調度程序來獲得類似的結果嗎? (我嘗試將應用程序的進程優先級設置爲「高」,但沒有區別)。 –

+0

就像我上面說的那樣,快速和骯髒的方法是不依賴於窗口進行調度,換句話說:不要調用睡眠(或其他阻塞調用)。是的,你會消耗大量的CPU,是的,操作系統仍然可以從你的CPU中抽出來服務其他的東西(因此你仍然不能保證在100%的時間內滿足你的時間要求),但是你將會遇到它們中的大部分這個時間......就像你可以在沒有實時系統的情況下得到的一樣好...... –