【发布时间】:2020-03-05 10:21:36
【问题描述】:
我的应用使用基于 USB 的串行端口连接到物理硬件设备。我可以打开任何有效的 USB 端口并与外部设备通信。但是,当我关闭连接时,USB 端口会在一段时间内处于某种不确定状态,在此期间进一步尝试重新连接会导致“访问端口“COM--”被拒绝”错误。但是,几秒钟后,尝试重新连接成功。如何确定 USB 端口何时再次支持新连接?
代码如下所示:
private void Setup(string Port)
{
bool ValidPort = false;
int CloseSleep = 10;
_PortName = Port;
_PortType = this;
string[] AvailablePorts = SerialPort.GetPortNames();
foreach(string aPort in AvailablePorts)
{
if (aPort == _PortName)
{
// The required port is listed in the list of available ports)
ValidPort = true;
break;
}
}
if (ValidPort)
{
try
{
if (_ThePort != null)
{
_ThePort.Close();
_ThePort.DataReceived -= ReceivedDataEventHandler;
while(CloseSleep-- > 0)
System.Threading.Thread.Sleep(100);
_ThePort.Dispose();
_ThePort = null;
}
}
catch (Exception ex)
{
EMS_Config_Tool.ModalDialog md = new EMS_Config_Tool.ModalDialog("Closing Port: " + ex.Message, "System Exception");
md.ShowDialog();
}
System.IO.Ports.SerialPort TheNewPort = new System.IO.Ports.SerialPort(Port, 38400);
// Setup the event handlers from Tx and Rx
Handler.DataOutEvent += CommsSender;
TheNewPort.DataReceived += ReceivedDataEventHandler;
TheNewPort.DataBits = 8;
TheNewPort.Parity = Parity.None;
TheNewPort.Handshake = System.IO.Ports.Handshake.None;
TheNewPort.StopBits = System.IO.Ports.StopBits.One;
// We will try 3 times to open the port, and report an error if we fail to open the port
try
{
TheNewPort.Open();
}
catch (Exception)
{
System.Threading.Thread.Sleep(1000);
try
{
TheNewPort.Open();
}
catch (Exception)
{
System.Threading.Thread.Sleep(1000);
try
{
TheNewPort.Open();
}
catch (Exception ex)
{
EMS_Config_Tool.ModalDialog md = new EMS_Config_Tool.ModalDialog("Opening Port: " + ex.Message, "System Exception");
return;
}
}
}
最后的 catch 语句是发出有关 Access 被拒绝的错误的地方。请注意,我尝试重试打开端口 3 次并没有真正帮助。如果我将端口单独放置大约 5 到 10 秒,然后重试调用 Setup 方法,它会立即成功。
【问题讨论】:
-
串行端口驱动程序(尤其是 USB 串行端口)是出了名的糟糕。除非它很昂贵,否则它可能基于(损坏的)FTTI(?)驱动程序源,它有很多问题。如果您可以让它工作的唯一方法是在两次使用之间等待 5 或 10 秒,那么您可能已经得到了最好的答案。
-
这是 FTDI,天哪。为什么要在调用
_ThePort.Dispose()之前添加延迟?无论如何,代码都需要进行一些清理。重试可以在一个循环中,而不是嵌套在另一个中。 -
我同意“清理”......在我最初的帖子之后,我将它改造成更容易接受的东西......(也许)
-
我们的一位硬件工程师告诉我,我们的 USB 不是基于 FTDI,而是嵌入在 RX 处理器中,并作为软件任务处理.....我应该快乐的?不,仍然不能很好地工作......但也许(作为一项软件任务)可以再次查看并“清理”以使其更好地工作......