iT邦幫忙

0

C# SerialPort問題 推薦的library

各位前輩們好~

我用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

2 個回答

0
lightyen
iT邦新手 5 級 ‧ 2018-03-29 15:27:53

我碰過這個洞,也是沒有解決。
之後訂了一個原則:"不要在read/write的時候拔線!"
倘若有這種插拔插拔需求,應該就不要用SerialPort了。

椅恩啾 iT邦新手 5 級 ‧ 2018-03-29 16:07:50 檢舉

這個洞讓我好痛苦阿~~
請問大大 C# 還有其他可以連接 Comport 的方式嗎

0
wubelin
iT邦見習生 0 級 ‧ 2018-09-28 20:06:54

先取得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();
}

我要發表回答

立即登入回答