作者: C_Law 時間: 2016-5-5 16:11 標題: VB Express 2007 用 Serial port 問題
我要寫個程式去讀寫 Serial port。我在張 Form 加個 Serial port(eg. 叫做 myPort),用 myPort.Open 後可以用 myPort.ReadLine/WriteLine 去讀寫,以及用 myPort.Close 開閉個 port。
不過,如果在 myPort.Close 之前錯手 Physically 拔走件 Serial port 硬件,myPort.IsOpen 就 Lock 死在 True 的狀態,想話 myPort.Close 又 Close 不到,Dispose....etc 通通都做不到。就算重新駁返這件硬件(裝置管理員已經見到這硬件再次出現,狀態也是正常,用其它 S/W 去讀寫這硬件都正常),想話再 myPort.Open 又話 myPort.IsOpen 已經係 True 所以不可以再 Open,myPort.ReadLine、myPort.WriteLine……等等都做不到。唯有關閉個程式再重開才能回復正常。
請問有無方法在不關閉程式之下再次用得返 myPort。
作者: KinChungE 時間: 2016-5-5 16:20
正常拔走serial port的話, 就咁插翻已經用到, 唔需要close或再open
但係如果你係usb to serial converter, 拔走個USB就
作者: C_Law 時間: 2016-5-5 16:45
回覆 2# KinChungE
Oh no~~~~~部電腦本身無 Serial port,只能靠 USB to serial converter。
真係死症?其實都有 Google 過,但找不到可行的辦法,我以為係我用錯 Keywords 去搵所以搵不到。
如果不用 VB 本身的 Serial port,有無其它 3rd party 的 Serial port library 可以解決到?
作者: KinChungE 時間: 2016-5-5 16:55
回覆 KinChungE
Oh no~~~~~部電腦本身無 Serial port,只能靠 USB to serial converter。
真 ...
C_Law 發表於 2016-5-5 16:45
http://stackoverflow.com/questio ... t-insertion-removal
好長, 唔知有冇用
作者: C_Law 時間: 2016-5-5 17:37
回覆 4# KinChungE
Thanks~~~~
都真係幾長,要花點時間去消化。
作者: kckcp 時間: 2016-5-5 17:55
本帖最後由 kckcp 於 2016-5-5 17:59 編輯
用myPort之前, 用 if myPort is nothing , check 下有無野先, 有就試下清左先用, 沒有就是正常可用
或
TRY CATCH
TRY 到 就用, 不能者就去了Exception , 在Exception內試下CLEAR去, 用 myPort = NOTHING
作者: Charcoal99 時間: 2016-5-5 21:47
try ... catch 是正解
throw Exception之後個系統便會 close 這個 port.
hardware serial port 跟 USB serial port 都一樣.
作者: dsscss 時間: 2016-5-7 02:02
本帖最後由 dsscss 於 2016-5-7 02:41 編輯
個陣寫SUPERVISORY PROGRAM,
都遇過呢個問題⋯⋯
個PROGRAM 係用C++ MFC 寫,
用CSerialMFC Library,
不過原理應該都係差唔多⋯⋯
修改CSerialMFC Library,
係READ唔到DATA個陣CLOSE番個PORT,
再嘗試OPEN就得⋯⋯
都一樣適用於USB TO SERIAL CONVERTER⋯⋯
---------------------
VB既話佢話ReadLine同WriteLine係BLOCKING,
可以SET到THROW TIMEOUT EXCEPTION,
再係TimeoutException同InvalidOperationException入面CLOSE番個PORT,再嘗試OPEN應該可以卦⋯
https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readline(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
作者: C_Law 時間: 2016-5-7 18:14
本帖最後由 C_Law 於 2016-5-7 18:16 編輯
回覆 6# kckcp
回覆 7# Charcoal99
用 Try...Catch 解決了。
- Private Sub OpenCom()
- If myPort.IsOpen Then
- MsgBox("myPort is already opened.")
- Else
- Try
- myPort.Open()
- Catch ex As IO.IOException
- CloseCom()
- End Try
- End If
- End Sub
- Private Sub WriteCom()
- If myPort.IsOpen Then
- Try
- myPort.WriteLine(tbWrite.Text) ' tbWrite is a textbox
- Catch ex As IO.IOException
- CloseCom()
- End Try
- Else
- MsgBox("myPort is already closed.")
- End If
- End Sub
- Private Sub CloseCom()
- If myPort.IsOpen Then
- Try
- myPort.Close()
- Catch ex As IO.IOException
- MsgBox(ex.Message & vbCrLf & _
- "Disconnect then reconnect the device," & vbCrLf & _
- "and open the port again.")
- End Try
- Else
- MsgBox("myPort is already closed.")
- End If
- End Sub

