Организовать приём байтов из буфера последовательного порта SerialPort - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Всем здравствуйте. Подскажите, пожалуйста, кто работал с последовательным портом, как правильно организовать приём байтов из буфера последовательного порта. Настраиваю порт согласно протокола фирмы-изготовителя прибора, открываю порт. Тут 100% без ошибок. Посылаю набор байтов запроса, опять же всё по протоколу. Мой запрос прибором принимается, то есть контрольную сумму я считаю правильно и запрос формирую правильно. Ответ приходит, но явно с ошибками. Первые байты ещё совпадают с ожидаемыми величинами, а дальше - белиберда. Я не говорю уже про два последних байта контрольной суммы (размер принимаемого массива 37 байт). Я грешу на процедуру обработки события SerialPort1_DataReceived:
Листинг программы
  1. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
  2. 'Автоматически вызывается каждый раз, когда данные поступают в последовательный порт
  3. 'Я предполагаю что если в буфере порта остались непрочитанные байты метод вызывается повторно и т.д.
  4. 'nReadByte = SerialPort1.Read(bReceived, 0, 37) 'не работает! в начале массива нули, не все байты считываются
  5. nReadByte = SerialPort1.Read(bReceived, nReadByte, SerialPort1.BytesToRead) 'работает, но правильно принимаются несколько первых байт
  6. Me.Invoke(Sub() Timer1.Start())
  7. End Sub
bReceived - Массив типа Byte на 37 элементов. В процедуре Timer1_Tick вывожу результаты (отображаю считанный массив байт, проверяю контрольную сумму...) Что же я делаю не так? Может внутри этой процедуры следует организовать какой-то цикл? Если у кого есть готовые коды, примеры, поделитесь пожалуйста. Хорошо бы пример на API но для VB.NET.
посадил на отдельную кнопку
Листинг программы
  1. nReadByte = SerialPort1.Read(bReceived, 0, 37)
процедуру SerialPort1_DataReceived вообще игнорировал И вдруг получил то что хотел! Даже контрольные суммы совпадают! Но для чего-то она (процедура SerialPort1_DataReceived) нужна и наверное код должен быть более практичным.

Решение задачи: «Организовать приём байтов из буфера последовательного порта SerialPort»

textual
Листинг программы
  1. Using token = New CancellationTokenSource()
  2.     token.Token - это токен отмены
  3. End Using

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы