如何使用visual basic通过串口通信逐字节读取数据?
How to use visual basic to read data byte-by-byte via serial communication?
我正在尝试从我的 STM32 板读取一些串行数据到 GUI,而且我无法关闭我的串行通信端口。
我正在使用 2013 Visual Studio 并选择 Visual Basic 作为我的编程语言。我想从微控制器发送的是一些我逐字节发送的串行数据。因此,例如,我将从我的微控制器发送 "<abcde>"
,并将 "<"
和 ">"
作为我的开始位和停止位;希望我的 visual basic 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
我打算从微控制器发送的数据也显示在代码中。正如我之前提到的,当我使用 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
每次按这个按钮后,总是卡死。我需要重新启动程序才能解决这个问题。这部分有什么想法吗?
简单总结一下,这是我的问题:
我完全不知道如何使用 serialport.readbyte() 和 serialport.read()。我真的需要这个,因为我想逐字节分离数据,这样我就可以轻松处理它。
serialport.close()按钮总是挂起,不知道为什么。
希望有人能帮我解决这些问题。在此先感谢您的所有帮助,如果我的线程混乱,我们深表歉意!
再次感谢!
Buff_Rx是字节数组,不能赋值给整数:
Dim i As Integer = buff_rx
我正在尝试从我的 STM32 板读取一些串行数据到 GUI,而且我无法关闭我的串行通信端口。
我正在使用 2013 Visual Studio 并选择 Visual Basic 作为我的编程语言。我想从微控制器发送的是一些我逐字节发送的串行数据。因此,例如,我将从我的微控制器发送 "<abcde>"
,并将 "<"
和 ">"
作为我的开始位和停止位;希望我的 visual basic 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
我打算从微控制器发送的数据也显示在代码中。正如我之前提到的,当我使用 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
每次按这个按钮后,总是卡死。我需要重新启动程序才能解决这个问题。这部分有什么想法吗?
简单总结一下,这是我的问题:
我完全不知道如何使用 serialport.readbyte() 和 serialport.read()。我真的需要这个,因为我想逐字节分离数据,这样我就可以轻松处理它。
serialport.close()按钮总是挂起,不知道为什么。
希望有人能帮我解决这些问题。在此先感谢您的所有帮助,如果我的线程混乱,我们深表歉意!
再次感谢!
Buff_Rx是字节数组,不能赋值给整数:
Dim i As Integer = buff_rx