Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 串行端口-打开错误_C#_Error Handling - Fatal编程技术网

C# 串行端口-打开错误

C# 串行端口-打开错误,c#,error-handling,C#,Error Handling,打开串行端口时,我尝试访问的设备可能没有设置9600的波特率,因此我必须检查每个波特率,直到设备正确打开 在执行Port.Open之后,我应该查找什么错误,ArgumentOutOfRangeException或IOException或其他错误?还是使用PortOpen语句执行此检查 很抱歉,我要问所有这些简单的问题,但我不知道如何才能获得这些信息 有没有什么方法可以告诉我如何正确使用PortOpen过程,包括错误处理,这样我就不必一直问每个人了 谢谢你,乔治。 无效操作例外 是发生错误时您应该

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

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

很抱歉,我要问所有这些简单的问题,但我不知道如何才能获得这些信息

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

谢谢你,乔治。

无效操作例外

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

这里有一个很好的C#示例:


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

有关更一般的建议,请查看哪个示例更完整。就我个人而言,我会调整他们的设置,以设置您的通用端口设置,然后在调试模式下尝试几种不同的波特率(一些坏的,一个已知的好的)。您将很快看到一个糟糕的配置与一个好的配置相比会带来什么。我假设你有权在这里测试设备

值得注意的是,打开端口的调用不会出现任何问题(打开它只会测试您是否设置了端口支持的一些参数)。当您尝试对设备进行读/写操作时,您将开始看到问题,您需要在那里检查有效波特率的错误

[EDIT]尝试以下方法(注意:我没有用任何硬件测试过,但至少可以编译):

使用系统;
使用System.Collections.Generic;
使用系统集合;
使用System.Linq;
使用系统文本;
使用系统线程;
使用System.IO.Ports;
命名空间SerialPortExperiments
{
班级计划
{
公共静态void Main()
{
//使用默认设置创建新的SerialPort对象。
SerialPort _SerialPort=新的SerialPort();
//设置一些常规设置
SetBasicSettings(参考串行端口);
//试着找一些有效的东西
int波特率=FindValidBaud(参考串行端口);
如果(波特率>0)
{
WriteLine(String.Format(“找到的波特率:{0}”,波特率));
}
其他的
{
Console.WriteLine(“错误:无法识别波特率”);
}
}
公共静态无效设置(参考SerialPort端口)
{
port.PortName=“COM1”;
端口奇偶性=奇偶性。无;
port.DataBits=8;
port.StopBits=0;
port.Handshake=Handshake.None;
port.ReadTimeout=500;
port.WriteTimeout=500;
}
公共静态int-FindValidBaud(ref-SerialPort端口)
{
bool buadrateIdentified=false;
//选择一些波特率进行尝试
列表波特率=新列表();
波特率(9600);
波特率(19200年);
//尝试以每个波特率依次打开端口,尝试一次写入/读取以验证成功
对于(int i=0;i
嗨,乔恩,谢谢你。是的,我可以访问该单元进行测试。我会让你知道结果的。谢谢,乔治。
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;
        }
    }
}