iT邦幫忙

1

C# SerialPort問題 推薦的library

  • 分享至 

  • xImage

各位前輩們好~

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

wubelin iT邦新手 5 級 ‧ 2020-03-13 10:36:03 檢舉
你這問題還沒解啊
我記得Win10重新NEW就會釋放掉了
SerialPort sp = new SerialPort();
Win 7的話…應該這樣能解
SafeDisconnect(sp, sp.BaseStream);
public static void SafeDisconnect(SerialPort port, Stream internalSerialStream)
{
GC.SuppressFinalize(port);
GC.SuppressFinalize(internalSerialStream);

ShutdownEventLoopHandler(internalSerialStream);

try
{

internalSerialStream.Close();
}
catch (Exception ex)
{

}

try
{
port.Close();
}
catch (Exception ex)
{

}
}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

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邦新手 5 級 ‧ 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();
}

我要發表回答

立即登入回答