我正在從串行儀器獲取數據以繪製圖表。數據流爲230 kbps,串行流水線少於50%,數據到達大約100 kbps,實際上並沒有真正變化,速率或數量。使用我的串行接收方法發生數據錯誤
在同一臺計算機上使用了像Teraterm這樣的串行終端程序;我可以捕獲數據並證明數據的來源以及測試接收方法都很好,並且我看不到捕獲數據的錯誤。
我正在開發的Windows窗體應用程序丟失數據。我已經從接收,捕獲(並行),解析和繪圖,直到接收和捕獲。並且發現我仍然看到捕獲中丟失的數據。
我不是一個經驗豐富的Windows人員,因此可能不知道有更好的方法來完成相同的功能。以下是我正在執行的接收操作:
我正在使用System.IO.Ports.SerialPort類。 我通過修改.DataReceived事件:
+= new SerialDataReceivedEventHandler(comPort_DataReceive);
然後我調用open()方法。
注意:我可能在這裏做了一些不正確的事情,我從來沒有在任何時候用 - =清除.DataReceived事件,而是每次打開時都會再次添加事件。儘管如此,即使我只與港口談過一次,也會出現這些問題。
這是我的數據接收函數的代碼。 RxString是一個字符串。
private void comPort_DataReceive(object sender, SerialDataReceivedEventArgs e)
{
RxString = comPort.ReadExisting();
this.Invoke(new EventHandler(ParseData));
}
private void ParseData(object sender, EventArgs e)
{
// Save to capture file, if capture is enabled
if ((WriteToFileEnabled == true) && (WriteToFileName != null))
{
writeFileHandle.Write(RxString);
}
return;
// Previously would parse and plot data
}
那麼,在這種情況下,人們如何執行接收而不會丟失它?
請按照下列問題進行操作:串行接收的緩衝區有多大,或者如果我有一個相當敏感的應用程序,我需要擔心這個問題嗎?流量控制無關緊要,遠程設備無論發送什麼內容都將發送數據,因此取決於我的計算機採取這些數據並對其進行處理或忽略。但是,如何知道我是否丟失了數據或經驗豐富的錯誤和內容? (我問最後一個沒有在SerialPort類結構上搜索太多,對不起。)
您如何確定數據正在丟失?數據丟失是否存在任何模式? – 2014-11-03 20:05:33
230kbps對串行端口來說非常快速...如果您處於電子噪聲環境中或正在使用粘連電纜,您可能很容易遇到數據損壞。如果發送設備允許,嘗試減小到9600baud,並確保一切工作在加速之前。奇偶校驗錯誤會引發異常。如果您在協議中沒有使用奇偶校驗,並且您沒有使用握手協議,那麼確實無法保證您獲得了所有數據或正確獲取了數據。 – 2014-11-03 20:40:00
Invoke()調用非常麻煩,UI線程需要一段時間才能響應。特別是如果你「解析並繪製」,那肯定會是一個嚴重的消防軟管問題。當你調用Close()時,也很容易死鎖你的程序。通過實現SerialPort.ErrorReceived事件來檢測溢出錯誤。在調用BeginInvoke()之前收集數據,確保您的UI線程能夠跟上。 – 2014-11-04 13:15:04