none
Serialport 開啟後拔掉usb接頭再插回無法重新建立port口 RRS feed

  • 問題

  • 各位大大你們好,小弟有先爬過文發現這個問題有很多討論但都沒有一個結果,但抱著那些都是舊文章的心態上來求解,希望過這麼久這個問題能有解了。

    首先

    當程式將Serialport 進行open()後usb被拔除而無正常進行close(),造成即便usb被重新插回也會遇到port口無法再從新被建立(被占用?

    我經爬文後有試過幾個方法但都沒有用,如下

    1.再一次執行close()的動作,但這個方法在重新建立port口時則會出現System.IO.IOException: '通訊埠 'COM10' 不存在。'的現象

    2. 使用serialPort.Dispose()和GC.Collect()將Serialport 進行試放,但經嘗試後依舊是出現 '通訊埠 'COM10' 不存在。'的現象。

    而目前解決的方法只能將程式關閉並且將usb重新拔插後再開啟程式,但目前遇到的需求是需要不重開、不拔插線材....

    不知道是否有高手有解??

    2018年12月19日 上午 09:12

所有回覆

  • 試試看  WndProc方法跟DriveInfo

    之前w7時這方法是可行(很久沒碰 不確定w10是否能正常)

    不過之前w7使用偶而會遇到 重複觸發或是windows偶而不觸發這方法的狀況 

    透過事件觸發 重新去偵測COM是否存在

    參考看看

       #region WndHook
    
            protected override void OnSourceInitialized(EventArgs e)
            {
                base.OnSourceInitialized(e);
                HwndSource hwndSource = PresentationSource.FromVisual(this) as HwndSource;
                if (hwndSource != null)
                {
                    hwndSource.AddHook(new HwndSourceHook(this.WndProc));
                }
            }
    
            IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
                try
                {
                    // 電腦硬體裝置改變
                    if (msg == WM_DEVICECHANGE)
                    {
                        switch ((int)wParam)
                        {
                            //  裝置插入可以使用時
                            case DBT_DEVICEARRIVAL:
                                break;
                            // 裝置卸載或移除時
                            case DBT_DEVICEREMOVECOMPLETE:
                                break;
                            //裝置狀態改變
                            case DBT_DEVNODES_CHANGED:
                                break;
                            default:
                                break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("系統訊息:WndProc " + ex.Message);
                }
                return IntPtr.Zero;
            }
            #endregion

    至於抽拔後無法關port的問題

    建議您將COM的部分用 singleton patter模式去做

    這樣可以解決你的問題





    • 已提議為解答 dodolon 2018年12月22日 上午 08:14
    • 已取消提議為解答 dodolon 2018年12月22日 上午 08:15
    • 已編輯 dodolon 2018年12月22日 上午 08:22
    2018年12月22日 上午 08:13