我的应用程序与微控制器进行串行通信。
以下是活动:
Public Event DataReceived As IO.Ports.SerialDataReceivedEventHandler
处理事件:
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
MyReceivedSerialData = SerialPort1.ReadExisting
Me.Invoke(New EventHandler(AddressOf SerialThreadHandler))
End Sub
SerialThreadHandler()处理收到的数据......
但是,用户还可以选择断开与串行接口的连接。 在这种情况下,执行此过程:
Public Sub MyDisconnectAndClose()
If frmUploadData.SerialPort1.IsOpen = True Then
Try
frmUploadData.SerialPort1.Close()
frmUploadData.Close()
frmUploadData.Dispose()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End If
End Sub
如果在断开连接期间传输或接收数据,则整个应用程序将挂起。
这是一个众所周知的问题,我不是第一个遇到这个问题的人......
作为一种可能的解决方案,有建议使用BeginInvoke而不是Invoke。
Invoke = synchronus BeginInvoke = asynchronus
当我使用BeginInvoke
时Me.BeginInvoke(New EventHandler(AddressOf SerialThreadHandler))
断开连接不会再导致挂起,但由于异步通信,通信会在随机点停止 - 这绝对是异步通信的副作用或问题,因为应用程序正在广泛接收和传输数据。 ..
还有其他方法可以为此问题创建变通方法或解决方案吗?