2012-05-30 82 views
0

我通過串口將計量器連接到計算機。我在循環中檢查值SerialPort.BytesToRead何時達到0。但即使BytesToRead不等於0,循環仍然存在。由於我是新用戶,因此無法發佈屏幕截圖,但通過調試我可以看到BytesToRead實際上不是0.SerialPort.BytesToRead總是評估爲0,即使它不是

這會導致我的數據沒有被完全讀取。我嘗試了不同的表達方式,如_port.BytesToRead > 0,但結果是一樣的。即使將BytesToRead的值分配給變量也會給出0.如果沒有循環,則ReadExisting不會返回從標度發送的所有數據,因此我沒有選擇。 ReadLine也不起作用。那麼爲什麼BytesToRead總是0?

private void PortDataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     { 
      var input = string.Empty; 
      // Reads the data one by one until it reaches the end 
      do 
      { 
       input += _port.ReadExisting(); 
      } while (_port.BytesToRead != 0); 

      _scaleConfig = GenerateConfig(input); 

      if (ObjectReceived != null) 
       ObjectReceived(this, _scaleConfig); 
     } 
    } 
+0

這是正常的,一個調試工件。你的代碼不能工作,你不能確保你得到了響應中的所有字節。如果NewLine屬性與比例發送的內容相匹配,通常ReadLine()將起作用。 –

+0

事情是秤一次發送多行數據,所以我仍然必須保持它在一個循環內部以獲取所有行。我如何確保我已經達到了數據的最後?我正在試圖概括這一點,以便可以在不更改此代碼的情況下更改比例。 – NTHQ

回答

2

我的老闆弄明白了。這是代碼。

private void PortDataReceived2(object sender, SerialDataReceivedEventArgs e) 
    { 
     var bytesToRead = _port.BytesToRead; 
     _portDataReceived.Append(_port.ReadExisting()); 

     // Buffer wasn't full. We are at the end of the transmission. 
     if (bytesToRead < _port.DataBits) 
     { 
      //Console.WriteLine(string.Format("Final Data received: {0}", _portDataReceived)); 
      IScalePropertiesBuilder scaleReading = null; 

      scaleReading = GenerateConfig(_portDataReceived.ToString()); 
      _portDataReceived.Clear(); 


      if (ObjectReceived != null) 
      { 
       ObjectReceived(this, scaleReading); 
      } 
     } 
    } 
1

也許當你正在運行,有實際上要讀取的字節,它會足夠慢的調試器,但是當你沒有調試器中運行它,因此不存在斷點發生,它結束了之前退出循環串口上的設備有時間發送數據。 ReadExisting很可能會讀取端口上的所有數據,然後立即退出,因爲端口上沒有新數據。也許爲了緩解這個問題,您可以在讀取數據和檢查BytesToRead的值來檢查是否有更多的數據之間進行一些等待(也許使用Thread.Sleep())。儘管您應該查看您正在閱讀的數據,以確定何時您實際上已經讀取了您嘗試接收的所有必要數據。

+0

在讀取數據之前放置一個Thread.Sleep()確實有效,但我試圖在沒有它的情況下提高效率。對於我現在正在使用的規模,我可以很容易地找出我正在接收的數據的末尾,但我希望儘可能抽象,以便我不必更改此代碼,如果我需要更改比例。 – NTHQ

2

你原來的代碼很奇怪,因爲我看不到反正代碼知道,如果緩衝區是空的,因爲你的代碼已經清空了,或者是因爲設備沒有又發了。 (這似乎是你設計中的一個基本問題:你想讀取,直到你得到所有的字節,但只有在你讀完所有的字節後,你才能知道應該有多少字節)。

你以後的代碼更奇怪,因爲DataBits是每個字節位數(5和8之間)的串行配置 - 只有在RS232中,一個字節可以少於8位。

這就是說,我一直在BytesToRead周圍看到很奇怪的行爲。在我看來,它幾乎完全不可靠,必須在它有用之後才能更新。 MSDN上有一個關於它不一致的說明,但它不包括它被莫名其妙地0的情況,我也已經看到這種情況。

相關問題