【问题标题】:Receive data from serialport in realtime VB.net从串口实时接收数据 VB.net
【发布时间】:2018-04-17 15:19:22
【问题描述】:

我创建了这段代码来从串口(com)接收数据

 Private port As New SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)

Function ReceiveSerialData() As String

    Dim returnStr As String = ""

    Dim com1 As IO.Ports.SerialPort = Nothing
    Try

        port.Open()

        port.ReadTimeout = 1000

        Dim Incoming As String

            Incoming = port.ReadLine()

        returnStr = Incoming

    Catch erreur As IOException
        returnStr = "Check Port"
    Catch ex As TimeoutException
        returnStr = "Error: Serial Port read timed out."
    Finally
        If port IsNot Nothing Then port.Close()
    End Try

    Return returnStr
End Function



Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded

    Label2.Content = ReceiveSerialData()

End Sub

我想创建一个事件以在数据实时更改时重新执行此代码。

我的表格是这样的:

有什么建议吗?

【问题讨论】:

  • 您可以为SerialPort.DataReceived 事件添加处理程序
  • 如果你把读取的代码放在一个while循环中,它会按照你的要求做。
  • @Jaxi 我试图放 while 循环,但它不起作用
  • @soohoonigan 如何使用它(谢谢)
  • 这取决于您的设备的通信设置方式。如果它不断地发回数据,那么只需向我链接的那个事件添加一个处理程序。如果设备需要在发回数据之前进行查询,则使用计时器并不断向其请求数据

标签: wpf vb.net synchronization real-time


【解决方案1】:

好吧,您总是可以使用 cmets 中提到的某种形式的 Do While True。不理想但是...

这是您的代码的修改版本,将阅读部分包含在不同的线程中。当它读取某些内容时,它会引发一个您可以订阅的事件(或者您可以在阅读后直接将文本放入您的控件中)。端口始终保持打开状态,因此在此示例中,当表单关闭时,端口也将关闭。

试试看它是否适合你。

Private port As New SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)
Private rdthread As System.Threading.Thread
Event PortData(ByVal Message as String)

Private Sub readPort()
    Do While True
        Try
            Dim message As String = port.ReadLine()
            RaiseEvent PortData(message)
            System.Threading.Thread.Sleep(0)
            My.Application.DoEvents()
        Catch ex As Exception
            Exit Do
        End Try
    Loop
End Sub    

Private Sub HandleData(ByVal message as string) Handles Me.PortData
    Label2.Content = message
End Sub

Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    InitPort()
End Sub

Private Sub Window_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    Try
        If port.IsOpen Then port.Close()
    Finally
        port.Dispose()
    End Try
End Sub 

Sub InitPort() 
    Dim com1 As IO.Ports.SerialPort = Nothing
    Try
        port.Open()
        port.ReadTimeout = 1000

        rdthread = New System.Threading.Thread(AddressOf readPort)
        rdthread.Start()

    Catch erreur As IOException
        returnStr = "Check Port"
    Catch ex As TimeoutException
        returnStr = "Error: Serial Port read timed out."
    Catch ex as Exception

    End Try
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多