2010-05-17 41 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

相关问题