【问题标题】:Serial Port - Open errors串行端口 - 打开错误
【发布时间】:2009-09-07 11:25:51
【问题描述】:

打开串行端口时,我尝试访问的设备可能没有设置 9600 的波特率,因此我必须检查每个波特率,直到设备正确打开。

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

很抱歉不得不问所有这些简单的问题,但我不确定如何获取这些信息?

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

谢谢,乔治。

【问题讨论】:

    标签: c# error-handling


    【解决方案1】:

    IO异常 无效操作异常

    是发生错误时您应该收到的信息。

    这里你有一个很好的 C# 例子: http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.open.aspx

    你可以在下面找到所有异常的解释。

    【讨论】:

      【解决方案2】:

      有关更一般的建议,请查看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;
              }
          }
      }
      

      【讨论】:

      • 嗨,乔恩,谢谢。是的,我可以访问该单元进行测试。我会让你知道结果。谢谢,乔治。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多