各位前輩們好~
我用SerialPort連接一個Embedded裝置做溝通
但是發現當SerialPort還開著的時候,強行拔除USB實體線,
會讓程式無法釋放掉該Comport問題
程式碼如下
try
{
using (SerialPort sp = new SerialPort("COM4", 115200, Parity.None, 8, StopBits.One))
{
sp.Open();
for (int i = 0; i < 1000; i++)
{
sp.WriteLine(i.ToString());
System.Threading.Thread.Sleep(1000);
}
}
}
catch (Exception exex)
{
Console.WriteLine(exex);
}
我在For迴圈執行階段拔除USB線,會跳出IOException: 裝置沒有連線
之後就不能連上COM4了,也無法釋放掉這個已經斷開的Comport
在網路上有找到一些同樣的問題
Releasing a unplugged virtual Serial Port
Using SerialPort with USB and removing USB cable while port is open
不知道各位前輩有沒有什麼解決方式
或是有沒有推薦的C# Serial Port Library
我碰過這個洞,也是沒有解決。
之後訂了一個原則:"不要在read/write的時候拔線!"
倘若有這種插拔插拔需求,應該就不要用SerialPort了。
先取得Serial Port的Handle
再把Handle Close就釋放了
using Microsoft.Win32.SafeHandles;
using System.Reflection;
private void ComClose()
{
ComPort.Close();
object stream = typeof(SerialPort).GetField("internalSerialStream", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ComPort);
SafeFileHandle handle_Com1 = (SafeFileHandle)stream.GetType().GetField("_handle", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(stream);
handle_Com1.Close();
}