各位前輩們好~
我用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();
}