我有一个应用程序可以检测用于发送短信的USB 3G加密狗。我的应用程序通过AT命令查询Dongle以确定它是否是RIGHT加密狗,这意味着某个加密狗只能在我的应用程序中使用(即使加密狗具有相同的模型)。发送和接收都很好,没有问题或任何问题。如果从USB端口移除3G Dongle,系统会检测到并执行正确的程序。
这是我的问题。当重新插入3G Dongle时,例如在同一端口(COM5)上,我的应用程序检测到这一点并执行一些AT命令以确定重新插入的加密狗是RIGHT加密狗。但是出现错误说明:
资源正在使用
必须终止或关闭应用程序才能使用相同的端口(例如COM5)。然后我遇到了一个应用程序,几乎具有相同的功能,但是在重新插入时能够使用加密狗。
BTW,我的加密狗是中兴MF190,我看到的应用程序来自华为。我正在使用C#。这有什么工作吗?或者更好,这有更好的逻辑吗?说使用服务等。编辑: 对Dongle进行的每个查询都是在一个单独的线程中完成的,以便能够在发送和接收时使用我的应用程序..
谢谢!
答案 0 :(得分:0)
我的Windows串口组件也有类似的问题。 C#代码中似乎存在错误。
长话短说,我设法通过在后台线程中关闭端口来解决这个问题。
这是我的代码,请注意您可能需要修改以适合您的应用程序:
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");
}
}
请注意,如果您在结束时尝试发送/接收,请在尝试发送之前检查_Closing
类变量。
希望这有助于任何人。