2010-05-17 49 views
2

我有一個C#應用程序,其中串行(COM1)數據似乎有時不會傳輸。以下是我的代碼的簡化段(至textBox中寫入電話已被刪除):串行數據未在C#應用程序中傳輸

InitializeComponent() 
    { 
     // 
     // serialPort1 
     // 
     this.serialPort1.BaudRate = 115200; 
     this.serialPort1.DiscardNull = true; 
     this.serialPort1.ReadTimeout = 500; 
     this.serialPort1.ReceivedBytesThreshold = 2; 
     this.serialPort1.WriteTimeout = 500; 
     this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived); 
    } 

     if (radioButtonUart9600.Checked) 
     { 
      serialPort1.BaudRate = 9600; 

      try 
      { 
       serialPort1.Open(); 
      } 
      catch (SystemException ex) 
      { 
       /* ... */ 
      } 
     } 

     try 
     { 
      serialPort1.Write("D"); 
      serialPort1.Write(msg, 0, 512); 
      serialPort1.Write("d"); 
      serialPort1.Write(pCsum, 0, 2); 
     } 
     catch (SystemException ex) 
     { 
      /* ... */ 
     } 

奇怪的是,當端口配置爲115.2Kbps的相同的代碼工作得很好。但是,當以9600bps運行時,應該由此代碼傳輸的數據似乎無法傳輸。我通過監視遠程設備上的接收標誌來驗證這一點。 try語句中不會引發異常。是否還有其他的事情(Flush等),我應該這樣做以確保數據傳輸?任何想法或建議,你可能會感激。我正在使用Microsoft Visual C#2008 Express Edition。謝謝。

回答

4

刪除這些try/catch塊。這應該讓你有機會看到你得到的TimeoutException,因爲你將WriteTimeout值設置得太低了。以9600波特發送516字節需要538毫秒。

您的其他設置也是麻煩的食譜。擺脫ReceivedBytesThreshold和DiscardNull。

+0

+1,比我的回答好得多 – 2010-05-18 11:37:18

+0

謝謝,漢斯。增加WriteTimeout的確有竅門。爲此特定應用程序設置ReceivedBytesThreshold和DiscardNull是故意的。遠程設備應該總是發送兩個字節的響應,有時它可能會發送空值,無論如何都應該放棄。 – 2010-05-18 13:29:48

相關問題