C# 串行端口-打开错误
打开串行端口时,我尝试访问的设备可能没有设置9600的波特率,因此我必须检查每个波特率,直到设备正确打开 在执行Port.Open之后,我应该查找什么错误,ArgumentOutOfRangeException或IOException或其他错误?还是使用PortOpen语句执行此检查 很抱歉,我要问所有这些简单的问题,但我不知道如何才能获得这些信息 有没有什么方法可以告诉我如何正确使用PortOpen过程,包括错误处理,这样我就不必一直问每个人了 谢谢你,乔治。 无效操作例外 是发生错误时您应该收到的信息 这里有一个很好的C#示例:C# 串行端口-打开错误,c#,error-handling,C#,Error Handling,打开串行端口时,我尝试访问的设备可能没有设置9600的波特率,因此我必须检查每个波特率,直到设备正确打开 在执行Port.Open之后,我应该查找什么错误,ArgumentOutOfRangeException或IOException或其他错误?还是使用PortOpen语句执行此检查 很抱歉,我要问所有这些简单的问题,但我不知道如何才能获得这些信息 有没有什么方法可以告诉我如何正确使用PortOpen过程,包括错误处理,这样我就不必一直问每个人了 谢谢你,乔治。 无效操作例外 是发生错误时您应该
您可以在下面找到所有异常的解释。有关更一般的建议,请查看哪个示例更完整。就我个人而言,我会调整他们的设置,以设置您的通用端口设置,然后在调试模式下尝试几种不同的波特率(一些坏的,一个已知的好的)。您将很快看到一个糟糕的配置与一个好的配置相比会带来什么。我假设你有权在这里测试设备 值得注意的是,打开端口的调用不会出现任何问题(打开它只会测试您是否设置了端口支持的一些参数)。当您尝试对设备进行读/写操作时,您将开始看到问题,您需要在那里检查有效波特率的错误 [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;
}
}
}