我一直在为机器编写一些代码。 它必须与RS485通信,我可以使用正常的串行通信,如.net
提供的那样然而,由于硬件可能会失败,我必须构建测试例程。 所以我编写了重新检测可用组件的例程。 这填补了一个列表&all.93Ports'使用其字符串名称,然后使用nummeric updown根据可用组件的列表索引选择com端口。 (是的,这听起来有点复杂,但出于其他原因,我使用了数字更新来进行选择)。
问题是这个功能只是第一次出现。 如果我再次调用该函数,则会因接缝已打开而拒绝访问。尝试了RS485Port.Close()在不同的地方,但问题是它如果没有打开喷射(鸡蛋问题)就崩溃了。
我打开一个comport的代码是这样的
private void RS485Activate()
{
lblNoRS485Communication.Visible = false;
if (cmbRS485Port.Value != 0) // if 0 then there are no serial ports
{
//rs485Port is a global declared as > System.IO.Ports.SerialPort RS485Port;
RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]);
if (!RS485Port.IsOpen)
{
// RS485Port.Close();
// RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]);
RS485Port.BaudRate = 9600;
RS485Port.Parity = System.IO.Ports.Parity.None;
RS485Port.StopBits = System.IO.Ports.StopBits.One;
RS485Port.DataBits = 8;
RS485Port.Handshake = System.IO.Ports.Handshake.None;
RS485Port.RtsEnable = true;
RS485Port.Open(); <== it crashes here with access denied
}
}
else
{
MessageBox.Show("There is no COM port detected, the program will work but it cannot control any machinery", "WARNING", MessageBoxButtons.OK, MessageBoxIcon.Warning);
lblNoRS485Communication.Visible = true; // another warning
}
}
答案 0 :(得分:0)
我不喜欢这个的外观,所以我希望有更好的方法。 但作为一个解决方案,使用try catch构造它现在首先尝试关闭,(如果尚未初始化try-catch确实防止close()错误。我不喜欢这种解决方法,所以更好的解决方案欢迎,我不认为代码应该预测并基于错误。(或者这些天使用.net可以吗?)
//...
try
{ RS485Port.Close(); }
catch
{ }
RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]);
if (!RS485Port.IsOpen)
{
// RS485Port.Close();
// RS485Port = new System.IO.Ports.SerialPort(allComPorts[(int)cmbRS485Port.Value - 1]);
RS485Port.BaudRate = 9600;
RS485Port.Parity = System.IO.Ports.Parity.None;
RS485Port.StopBits = System.IO.Ports.StopBits.One;
RS485Port.DataBits = 8;
RS485Port.Handshake = System.IO.Ports.Handshake.None;
RS485Port.RtsEnable = true;
RS485Port.Open();
}