Serial Port 系列 番外篇--關於IsOpen這檔事

之前在[Serial Port 系列(6) 基本篇 -- 建立一個簡單的純發送程式(一般型範例)] 中有提到關於 IsOpen 的問題,後來我在測試的過程中發現一些狀況,所以寫這篇簡單記錄一下觀察的心得。

       之前在[Serial Port 系列(6) 基本篇 -- 建立一個簡單的純發送程式(一般型範例)] 中有提到關於 IsOpen 的問題,後來我在測試的過程中發現一些狀況,所以寫這篇簡單記錄一下觀察的心得。

 

       SerialPort內部其實有一個繼承自Stream的物件,看起來這個物件就是構成SerialPort類別的最主要元素,當我們使用IsOpen屬性取得狀態時,它會呼叫一個內部的方法取得此Stream物件的狀態;當我們呼叫Open或Close方法的時候,則會改變這個Stream物件的某些狀態。

 

       然而我發現一個奇特的現象,似乎在呼叫Close方法的時候,當整個序列埠還沒完全關閉之前,其實IsOpen屬性已經變成False,這也許有點像Socket關閉一樣,軟體的動作是完成了,但硬體、作業系統或驅動程式內部卻還沒有真的完成關閉,於是會造成這樣的問題。不過這問題沒有Socket.Close方法所產生的現象明顯,除非很瘋狂地快速 SerilaPort.Open、SerialPort.Close,這時就會發生SerialPort.IsOpen屬性值是False,但在呼叫SerialPort.Open時卻發生『拒絕存取通訊埠』的例外;在我的電腦上在呼叫SerialPort.Close()後再等個約 250ms~300ms就會確實關閉,也許要多做測試才知道這是否關聯到硬體規格效能還是驅動程式的問題了。