Мое приложение использует последовательные порты 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 выдается ошибка об отказе в доступе. , Обратите внимание, что моя попытка повторить попытку открытия порта 3 раза не очень помогает. Если я оставлю порт в покое примерно на 5–10 секунд и снова попытаюсь вызвать метод установки, он сразу преуспеет.