打开串口时,我尝试访问的设备可能没有设置9600的波特率,所以我必须通过每个波特率,直到设备正确打开。
在执行Port.Open后,我应该查找什么错误,ArgumentOutOfRangeException或IOException或其他一些?或者我是否使用PortOpen语句执行此检查?
很抱歉要问所有这些简单的问题,但我不确定如何获取这些信息?
有什么方法可以告诉我如何正确使用PortOpen程序,包括错误处理,这样我就不必再问每个人了吗?
谢谢,乔治。
答案 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;
}
}
}