串行端口 - 打开错误

时间:2009-09-07 11:25:51

标签: c# error-handling

打开串口时,我尝试访问的设备可能没有设置9600的波特率,所以我必须通过每个波特率,直到设备正确打开。

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

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

有什么方法可以告诉我如何正确使用PortOpen程序,包括错误处理,这样我就不必再问每个人了吗?

谢谢,乔治。

2 个答案:

答案 0 :(得分:2)

IOException的 出现InvalidOperationException

是出现错误时应该收到的内容。

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

你可以在那里找到所有例外说明。

答案 1 :(得分: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;
        }
    }
}