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