[操作疑難] 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。

正常拔走serial port的話, 就咁插翻已經用到, 唔需要close或再open
但係如果你係usb to serial converter, 拔走個USB就

TOP

回覆 2# KinChungE

Oh no~~~~~部電腦本身無 Serial port,只能靠 USB to serial converter。

真係死症?其實都有 Google 過,但找不到可行的辦法,我以為係我用錯 Keywords 去搵所以搵不到。

如果不用 VB 本身的 Serial port,有無其它 3rd party 的 Serial port library 可以解決到?

TOP

回覆  KinChungE

Oh no~~~~~部電腦本身無 Serial port,只能靠 USB to serial converter。

真 ...
C_Law 發表於 2016-5-5 16:45


http://stackoverflow.com/questio ... t-insertion-removal
好長, 唔知有冇用

TOP

回覆 4# KinChungE

Thanks~~~~
都真係幾長,要花點時間去消化。

TOP

本帖最後由 kckcp 於 2016-5-5 17:59 編輯

用myPort之前, 用 if myPort is nothing , check 下有無野先, 有就試下清左先用, 沒有就是正常可用



TRY CATCH

TRY 到 就用, 不能者就去了Exception , 在Exception內試下CLEAR去, 用 myPort = NOTHING

TOP

try ... catch 是正解
throw Exception之後個系統便會 close 這個 port.
hardware serial port 跟 USB serial port 都一樣.

TOP

本帖最後由 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

TOP

本帖最後由 C_Law 於 2016-5-7 18:16 編輯

回覆 6# kckcp

回覆 7# Charcoal99

用 Try...Catch 解決了。
  1.     Private Sub OpenCom()
  2.         If myPort.IsOpen Then
  3.             MsgBox("myPort is already opened.")
  4.         Else
  5.             Try
  6.                 myPort.Open()
  7.             Catch ex As IO.IOException
  8.                 CloseCom()
  9.             End Try
  10.         End If
  11.     End Sub

  12.     Private Sub WriteCom()
  13.         If myPort.IsOpen Then
  14.             Try
  15.                 myPort.WriteLine(tbWrite.Text)   ' tbWrite is a textbox
  16.             Catch ex As IO.IOException
  17.                 CloseCom()
  18.             End Try
  19.         Else
  20.             MsgBox("myPort is already closed.")
  21.         End If
  22.     End Sub

  23.     Private Sub CloseCom()
  24.         If myPort.IsOpen Then
  25.             Try
  26.                 myPort.Close()
  27.             Catch ex As IO.IOException
  28.                 MsgBox(ex.Message & vbCrLf & _
  29.                        "Disconnect then reconnect the device," & vbCrLf & _
  30.                        "and open the port again.")
  31.             End Try
  32.         Else
  33.             MsgBox("myPort is already closed.")
  34.         End If
  35.     End Sub
複製代碼
多謝各位師兄幫忙!

TOP