2009-09-07 290 views
1

打开串行端口时,我试图访问的设备可能没有设置9600的波特率,所以我将不得不通过每个波特率直到设备正确打开。串行端口 - 打开错误

在执行Port.Open之后,我应该查找什么错误,ArgumentOutOfRangeException或IOException或其他,是否应该寻找?还是使用PortOpen语句执行此检查?

对不起,要问所有这些简单的问题,但我不确定如何获得信息?

有没有什么办法可以告诉我如何正确使用PortOpen程序,包括错误处理呢,这样我就不必再问大家了?

谢谢乔治。

回答

0

如需更多一般性建议,请查看the System.IO.Ports namespace,该示例有更完整的示例。就我个人而言,我会调整他们在那里设置您的通用端口设置,然后在调试模式下尝试几种不同的波特率(一些不好的,一个已知的好)。你会很快看到一个糟糕的配置给出了一个好的配置。我假设你有权在这里测试设备?

值得注意的是,你不会看到打开端口的调用有任何问题(只是打开它只会测试你已经设置了端口支持的一些参数)。当您尝试读取/写入设备时,您会看到问题,并且您需要对有效的波特率进行错误检查。

[编辑]尝试沿着这些路线的东西(注:我没有与任何硬件测试这一点,但它至少编译):

using System; 
using System.Collections.Generic; 
using System.Collections; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.IO.Ports; 

namespace SerialPortExperiments 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      // Create a new SerialPort object with default settings. 
      SerialPort _serialPort = new SerialPort(); 
      // Set some generic settings 
      SetBasicSettings(ref _serialPort); 
      // Try and find something valid 
      int baudRate = FindValidBaud(ref _serialPort); 
      if (baudRate > 0) 
      { 
       Console.WriteLine(String.Format("Found baudrate: {0}", baudRate)); 
      } 
      else 
      { 
       Console.WriteLine("ERROR: Failed to identify baudrate"); 
      } 
     } 


     public static void SetBasicSettings(ref SerialPort port) 
     { 
      port.PortName = "COM1"; 
      port.Parity = Parity.None; 
      port.DataBits = 8; 
      port.StopBits = 0; 
      port.Handshake = Handshake.None; 
      port.ReadTimeout = 500; 
      port.WriteTimeout = 500; 
     } 

     public static int FindValidBaud(ref SerialPort port) 
     { 
      bool buadrateIdentified = false; 

      // Pick some baudrates to try 
      List<int> baudrates = new List<int>(); 
      baudrates.Add(9600); 
      baudrates.Add(19200); 

      // Try and open the port at each baud rate in turn, trying one write/read to verify success 
      for (int i = 0; i < baudrates.Count; i++) 
      { 
       // Pick a baud rate 
       port.BaudRate = baudrates[i]; 

       // Try opening a connection and exchanging some data 
       port.Open(); 
       buadrateIdentified = AttemptValidExchange(ref port); 
       port.Close(); 

       if (buadrateIdentified) 
       { 
        return port.BaudRate; 
       } 
      } 

      return -1; 
     } 

     public static bool AttemptValidExchange(ref SerialPort port) 
     { 
      try 
      { 
       // Send a test command 
       port.Write("SOME_TEST_COMMAND"); 

       // Check to see what the device responded with 
       const int expectedReturnLength = 1024; 
       byte[] buffer = new byte[expectedReturnLength]; 
       port.Read(buffer, 0, expectedReturnLength); 
       if (buffer.ToString().Equals("EXPECTED_RETURN_VALUE")) 
       { 
        return true; 
       } 
      } 
      catch (TimeoutException) // NOTE: You'll probably need to catch other exceptions like parity errors here 
      { 
      } 

      return false; 
     } 
    } 
} 
+0

嗨乔恩, 感谢您的。 是的,我有权访问要测试的单元。 我会让你知道结果。 谢谢,乔治。 – George 2009-09-07 13:50:35