2010-02-09 55 views
1

我可能只是有你今天聽到的最奇怪的錯誤。串口通信中的錯誤

我有一個(很長)的方法在一個線程內,它發送格式化數據到RS232 LED顯示。

它應該顯示像這樣

TITLE 
SUBTITLE 1 
ELEMENT 1 
ELEMENT 2 
SUBTITLE 2 
ELEMENT 1 
ELEMENT 2 
ELEMENT 3 

很好,每一個在它自己的消息。

我在每條消息之後調用Thread.Sleep(N)(因此每條消息都顯示N次)。

  • N爲秒數

好,一切都很好直到現在。問題是,如果(10 <= N <= 20)我得到以下輸出:

TITLE 
TITLE 
TITLE 
TITLE 
TITLE 
TITLE 
TITLE 
TITLE 

我能聽到嗶我發送消息。我甚至安裝了串口監視器,以檢查我發送的信息是否相同。

所以纔來概括:

寫作上的串行端口工作沉睡線程對於n = < 9或N> = 20任何東西之間會產生錯誤的輸出,後一樣,如果輸出被緩存或東西

這是什麼?

更新

  • 好吧,我知道System.Threading.Sleep採用毫秒作爲參數。只需將數字乘以1000即可。
  • 每當led顯示屏收到格式良好的新消息時,都會發出嘟嘟聲。我應該澄清一點。

這裏是一個片段(這發出了第一個冠軍)

  using (var ld = new LedScreen(COM)) 
      {      
       ld.AddEffect(LedScreen.Effects.Snow); 
       ld.AddText(LedScreen.Colors.Red, titulos[ThreadControl.Fase]); 
       ld.AddEffect(LedScreen.Effects.DSnow); 
       ld.Write(); 
      } 

      //Console.WriteLine(titulos[ThreadControl.Fase]); 
      //esperamos N tiempo (titulo) 
      Thread.Sleep(TiempoTitulo); 

我寫的LedScreen類。 write方法是這樣的一個:

public void Write() 
    { 
     //caracteres de terminacion 
     buffer.AddRange(new byte[] { 0xBF, 0xB1 }); 
     try 
     { 
      if (!sp.IsOpen) sp.Open(); 
      sp.Write(buffer.ToArray(), 0, buffer.Count); 
     } 
     finally 
     { 
      sp.Close(); 
     } 
    } 

更新2

我終於得到它的工作

每個之前寫串口,我送(醜陋的修復,但MEH)。一個沒有延遲的「空白」信息。這會在發送實際消息之前清除屏幕。萬歲!它適用於任何數量的秒我睡覺線程

+0

你能發佈一個圍繞睡眠和發送串行消息的代碼片段嗎? – 2010-02-09 20:43:00

+0

從.NET 2.0開始,串行通信組件有一個已知的問題......它希望它可以在.NET 3.5中解決,但是不會...... – t0mm13b 2010-02-09 20:43:49

+2

在你的問題中沒有任何東西可以讓任何人診斷出什麼問題可能。找出「嘟嘟」的含義。 SerialPort不會發出嗶聲。 – 2010-02-09 20:44:59

回答

1

首先,你能請澄清線程的睡眠時間? System.Threading.Thread.Sleep()需要一個毫秒的參數,而不是'秒'參數。

接下來,你知道串口write()成功嗎?(10-20毫秒硬代碼延遲不一定總是足夠長的時間。)

爲了防止超速,我做這樣的事情:

public bool Send(byte[] bytes) 
    { 
     try 
     { 
      serialPort.Write(bytes, 0, bytes.Length); 
      return true; 
     } 
     catch (Exception ex) 
     { 
      // log or note the error: can be TimeoutException or InvalidOperationException, etc 
      return false; 
     } 
    } 
1

有幾件事情,可能會影響你的情況,而不是其中至少有一部分是已經提到的「你說話秒,但睡眠()需要毫秒的論點,而不是幾秒」的問題。

您還需要查看發送的字符之間的時間長度。流量控制。串口參數(波特率等)。而且你需要知道你的設備的容差是多少。串行傳輸中丟失的數據通常意味着您在另一端過載了設備。

1

您是否知道設備用於檢測消息結束(EOM)的算法?這可能是設備使用字符內超時。這可以解釋爲什麼它在N> 20的情況下工作,如果在那段時間沒有新的字符出現在緩衝區中,那麼設備可能會認爲消息已終止並顯示緩衝區。如果在報文末尾加上ASCII碼10,則可能會判定該報文的其餘部分在單行顯示的末尾滾動而不顯示。儘管如此,這並不能解釋N < 9的工作原理。也許如果數據到達沒有任何延遲的設備解釋爲一個腳本串行顯示?這種情況的表示是,如果消息顯示的速度在N = 0到9之間不會變化,但是對於所有N> 20而言變化不同。如果N以毫秒爲單位,您可能無法確認這一點。