У меня есть приложение VB.NET 4, которое получает 10 байтов данных ASCII от микроконтроллера PIC24 по UART. Это моя функция приема:Неполный последовательный RX в VB
Private Sub mySerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
'Handles serial port data received events
UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf UpdateDisplay)
Dim n As Integer = mySerialPort.BytesToRead 'find number of bytes in buf
comBuffer = New Byte(n - 1) {} 're dimension storage buffer
mySerialPort.Read(comBuffer, 0, n) 'read data from the buffer
Me.Invoke(UpdateFormDelegate1) 'call the delegate
End Sub
Here is where I got this block of code
я анализирую и присвоить полученные данные, где он должен пойти с этим кодом:
Private Sub UpdateDisplay()
Dim i As Integer
Dim RX_String(15) As String
Dim RX_String_Hex(15) As String
Dim Message As String
For i = 0 To comBuffer.Length - 1
RX_String(i) = Chr(comBuffer(i))
Next
Message = String.Join("", RX_String)
TextBox1.Text = Message
End Sub
Когда я запускаю мое приложение, я открываю последовательный порт. Затем я указываю микроконтроллеру на отправку данных, т. Е. 1234567890
, в моем приложении VB будут отображаться такие вещи, как 12
, 4567890
и т. Д., Пока в конце концов он не отобразит полную строку данных после случайного числа передач от микроконтроллера. Я никогда не делал сериала в VB, поэтому я должен пропустить очевидное. Я пропускаю то, что мешает мне получать все 10 байт каждый раз?
В дисплее обновления вы могли бы сделать уровень класса сообщений, то сообщение + = string.join («», RX_String). Используйте условие, чтобы подождать, пока оно не достигнет нужной длины, а затем отобразит строку. – tinstaafl
Вы делаете классическую ошибку, игнорируя возвращаемое значение метода Read(). Это будет ** не ** быть «n», как правило, всего несколько байтов. Что бы ни случилось в буфере приема, не так много, поскольку последовательные порты работают медленно. Не вызывайте BeginInvoke, пока не получите их всех. –
Вам следует подумать о том, чтобы сделать процедуру «UpdateDisplay» взятием буфера в качестве параметра, чтобы избежать условий гонки, если другое серийное событие получено до того, как основной поток обработает предыдущий. Кроме того, 'System.Text.Encoding.ASCII.GetString' хорош для преобразования байт-массивов в строки. –