Visual Basic - 关闭序列时的应用程序挂起

时间:2014-01-14 15:20:59

标签: vb.net serial-port arduino microcontroller

我的应用程序与微控制器进行串行通信。

以下是活动:

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))

断开连接不会再导致挂起,但由于异步通信,通信会在随机点停止 - 这绝对是异步通信的副作用或问题,因为应用程序正在广泛接收和传输数据。 ..

还有其他方法可以为此问题创建变通方法或解决方案吗?

0 个答案:

没有答案