在我的.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)。
因此,即使鼠標事件發生在不同的窗口中,它仍然會更頻繁地使調度程序「service」* my *應用程序?有什麼辦法來控制/配置調度程序來獲得類似的結果嗎? (我嘗試將應用程序的進程優先級設置爲「高」,但沒有區別)。 –
就像我上面說的那樣,快速和骯髒的方法是不依賴於窗口進行調度,換句話說:不要調用睡眠(或其他阻塞調用)。是的,你會消耗大量的CPU,是的,操作系統仍然可以從你的CPU中抽出來服務其他的東西(因此你仍然不能保證在100%的時間內滿足你的時間要求),但是你將會遇到它們中的大部分這個時間......就像你可以在沒有實時系統的情況下得到的一樣好...... –