如何使用Visual Basic通过串行通信逐字节读取数据?

时间:2019-06-30 14:35:11

标签: vb.net visual-studio-2013 serial-port microcontroller serial-communication

我正在尝试从STM32板上读取一些串行数据到GUI,而且在关闭串行通信端口时遇到困难。

我正在使用2013 Visual Studio,并选择Visual Basic作为编程语言。我想从微控制器发送的是一些逐字节发送的串行数据。因此,例如,我将使用"<abcde>""<"作为我的开始和结束位从微控制器发送">";并希望我的视觉基本GUI可以读取并显示它。

我已经尝试使用serialport.readexisting()在Visual Basic上显示它,没有问题,但是然后我需要单独分隔每个字节。最后,我希望程序读取和处理每个字节,这些字节将是一些传感器值,并可以在VB程序中显示。

我尝试同时使用serialport.read()和serialport.readbyte(),但我不知道为什么,它没有显示正确的输出。我的意思是不正确的是,在我从微控制器发送的内容上,ASCII代码或字符不代表。

这是我使用readbyte()的时间。

'Visual Basic --> for serialport.readbyte()
Dim buff_rx As Byte
Private Sub SerialPort1_DataReceived_1(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    SerialPort1.ReadTimeout = 20
    Do While SerialPort1.BytesToRead > 0
        Try
            buff_rx = SerialPort1.ReadByte
            Me.Invoke(New EventHandler(AddressOf update_dat))

        Catch ex As Exception

        End Try
    Loop
End Sub

Public Sub update_dat(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim i As Integer = buff_rx
    Dim s As String = ""
    s = i.ToString("X2") 'if wanted to be in hex, use "X2"
    Rx_text.Text = Rx_text.Text & " " & i
End Sub

这是我尝试使用read()部分时的部分。

'Visual Basic --> for serialport1.read()

Private Sub SerialPort1_DataReceived_1(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    Dim bytestoread As Int16
    bytestoread = SerialPort1.BytesToRead
    Dim buff(bytestoread) As Byte
    ReceivedText(SerialPort1.Read(buff, 0, bytestoread - 1))
End Sub

Private Sub ReceivedText(ByVal [text] As String)
    If Me.Rx_text.InvokeRequired Then 'form 1 is Me'
        Dim k As New SetTextCallback(AddressOf ReceivedText)
        Me.Invoke(k, New Object() {(text)})
    Else
        Me.Rx_text.Text &= [text]
    End If
End Sub

下面这部分是我从微控制器发送数据的时候

//Microcontroller side, data sending
tx3_buff[0] = '<'; //ascii code: 60
tx3_buff[1] = 'b'; //ascii code: 98
tx3_buff[2] = 'c'; //ascii code: 99
tx3_buff[3] = 'd'; //ascii code: 100
tx3_buff[4] = 'e'; //ascii code: 101
tx3_buff[5] = 'f'; //ascii code: 102
tx3_buff[6] = 'g'; //ascii code: 103
tx3_buff[7] = 'h'; //ascii code: 104
tx3_buff[8] = 'i'; //ascii code: 105
tx3_buff[9] = '>'; //ascii code: 62

我打算从microcrontroller发送的数据也显示在代码上。如前所述,当我使用serialport.readexisting()时,我可以正确读取“”。但是当我使用serialport.readbyte()和serialport.read()时,它显示为:

160  16 161 33 198 18 52 68 84 200 232 16 40 200

等等等等,这绝对是不正确的,而且毫无意义。

关于close()问题,我将serialport.close()放在了按钮函数中。我已经在一些论坛上尝试过,说我们应该使用begininvoke而不是仅使用invoke(例如:https://blogs.msdn.microsoft.com/bclteam/2006/10/10/top-5-serialport-tips-kim-hamilton/

但是它仍然行不通。 这是“关闭”按钮部分:

'Visual Basic --> for disconnect button
Private Sub Button5_Click_1(sender As Object, e As EventArgs) Handles Button5.Click
    SerialPort1.Close()
End Sub

每次按下此按钮后,它总是会卡住并挂起。我需要重新启动程序,以便解决此问题。这部分有什么想法吗?

为便于总结,这是我的问题:

  1. 我真的不知道如何使用serialport.readbyte()和serialport.read()。我真的很需要这样做,因为我想逐字节分离数据,以便可以轻松处理它。

  2. serialport.close()按钮始终挂起,我不知道为什么。

我希望有人可以帮助我解决这些问题。预先感谢您的所有帮助,如果我的话题混乱,我们将深表歉意!

再次感谢您!

1 个答案:

答案 0 :(得分:1)

Buff_Rx是一个字节数组,不能分配给整数:

Dim i As Integer = buff_rx