Serial port 重新打开关闭的串行端口
我有一个应用程序,检测一个USB 3G加密狗,将用于发送短信。我的应用程序通过AT命令查询加密狗以确定它是否是正确的加密狗,这意味着某些加密狗只能在我的应用程序中使用(即使加密狗是同一型号)。发送和接收都很好,没有任何问题。如果从USB端口卸下3G加密狗,系统会检测到这一点并执行正确的程序 这是我的问题。当3G加密狗重新插入时,比如在同一端口(COM5),我的应用程序会检测到这一点,并执行一些AT命令来确定重新插入的加密狗是正确的加密狗。但出现了一个错误,说明: 资源正在使用中 必须终止或关闭应用程序才能使用同一端口(例如COM5)。然后我遇到了一个应用程序,几乎具有相同的功能,但在重新插入时可以使用加密狗 顺便说一句,我的加密狗是中兴MF190,我看到的应用程序来自华为。我用的是C#。这方面有什么工作吗?或者更好,有没有更好的逻辑?比如说使用服务等等 编辑: 对加密狗的每个查询都在一个单独的线程中完成,以便在发送和接收时能够使用我的应用程序Serial port 重新打开关闭的串行端口,serial-port,at-command,Serial Port,At Command,我有一个应用程序,检测一个USB 3G加密狗,将用于发送短信。我的应用程序通过AT命令查询加密狗以确定它是否是正确的加密狗,这意味着某些加密狗只能在我的应用程序中使用(即使加密狗是同一型号)。发送和接收都很好,没有任何问题。如果从USB端口卸下3G加密狗,系统会检测到这一点并执行正确的程序 这是我的问题。当3G加密狗重新插入时,比如在同一端口(COM5),我的应用程序会检测到这一点,并执行一些AT命令来确定重新插入的加密狗是正确的加密狗。但出现了一个错误,说明: 资源正在使用中 必须终止或关闭应
谢谢 我也有类似的windows串行端口组件问题。C代码中似乎有bug 长话短说,我通过在后台线程中关闭端口来解决这个问题 这是我的代码,请注意,您可能需要修改以适合您的应用程序:
private bool ClosePort()
{
_Closing = true;
_SerialPort.DiscardInBuffer();
_SerialPort.DiscardOutBuffer();
if (!_SerialPort.IsOpen) return true;
//We run this in a new thread to avoid issue when opening and closing
//The .NET serial port sucks apparently - and has issues such as hanging and random exceptions
System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(DoClosePort));
t.Start();
//here we wait until is **SHOULD*** be closed - note the better way is to fire an internal event when its finished
//We may need to tinker with this wait time
System.Threading.Thread.Sleep(500);
return _SerialPort.IsOpen;
}
private void DoClosePort()
{
try
{
//System.Threading.Thread.Sleep(500);
_SerialPort.Close();
}
catch (Exception ex)
{
MessageBox.Show("Error closing " + _SerialPort.PortName + ". Error Message: " + ex.Message + "\r\n");
}
}
请注意,如果在关闭时尝试发送/接收,请在尝试发送之前检查\u closing
类变量
希望这对任何人都有帮助。可能重复感谢您的解决方案,但它对我不起作用。即使我尝试将所有内容设置为null或dispose,错误也是一样的。问题是,用户总是可以随时从USB端口拉出加密狗,无论是在应用程序发送、接收等过程中。您可能需要在尝试发送/接收时捕获异常,如果是,则提示用户。上面的代码使我能够正确关闭端口,并使您能够重用我已经做过的相同端口号。随函附上与串行端口有关的所有信息。。无论我何时检查“_closing”类,我都无法控制它,因为用户可能会删除加密狗(可能是为了好玩)。添加了一些关于我问题的信息