Как использовать Visual Basic для чтения данных побайтно через последовательную связь? - PullRequest
1 голос
/ 30 июня 2019

Я пытаюсь считывать некоторые последовательные данные с моей платы STM32 в графический интерфейс, а также у меня проблемы с закрытием порта последовательной связи.

Я использую Visual Studio 2013 и выбрал Visual Basic в качестве языка программирования. То, что я хотел послать с микроконтроллера, это некоторые последовательные данные, которые я отправлял побайтово. Так, например, я буду отправлять "<abcde>" с моего микроконтроллера с "<" и ">" в качестве моего начального и конечного битов; и, надеюсь, мой графический интерфейс Visual Basic будет читать и отображать его.

Я попытался отобразить его на Visual Basic, используя serialport.readexisting () без проблем, но затем мне нужно разделить каждый байт отдельно. В конце я хотел, чтобы моя программа считывала и обрабатывала каждый байт, который будет представлять собой некоторые значения датчика и отображать их в программе 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

Каждый раз, когда я нажимаю эту кнопку, она всегда будет зависать и зависать. Мне нужно перезапустить программу, чтобы эта проблема была решена. Есть идеи для этой части?

Чтобы подвести итог, вот мои проблемы:

  1. Я буквально не знаю, как использовать serialport.readbyte () и serialport.read (). Мне это действительно нужно, так как я хотел разделить данные побайтно, чтобы я мог легко их обработать.

  2. Кнопка serialport.close () всегда зависает, и я не знаю почему.

Я надеюсь, что кто-то может помочь мне с этими проблемами. Заранее благодарю за помощь и извиняюсь, если моя ветка грязная!

Еще раз спасибо!

1 Ответ

1 голос
/ 02 июля 2019

Buff_Rx является байтовым массивом и не может быть назначен целому числу:

Dim i As Integer = buff_rx
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...