Разбор байт VISA

Простейшие вопросы в области инженерной разработки
AndryG
assistant
assistant
Сообщения: 111
Зарегистрирован: 24 апр 2017, 22:27
Версия LabVIEW: 2016
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Разбор байт VISA

Сообщение AndryG »

Доброго времени суток! Прошу помощи у форумчан.
Задача банальная: нужно считывать с ком-порта данные и обрабатывать по количеству байт.
Например :непрерывная передача A0 C5 23 1D 0F ................ без признаков конца пакета ,нужно обрабатывать пакеты по пять байт A0 C5 23 1D 0F - обработка и т. д .... Массив данных обрабатываю без проблем ,а вот сразу сортировать по пакетам ничего не выходит. Может кто сталкивался подобной задачей или знает как ее решить ,буду очень признателен за помощь).
Юрий
leader
leader
Сообщения: 526
Зарегистрирован: 28 фев 2010, 18:04
Версия LabVIEW: LV2018
Благодарил (а): 10 раз
Поблагодарили: 18 раз
Контактная информация:

Re: Разбор байт VISA

Сообщение Юрий »

Как правило, стараюсь использовать такую схему. Всё, что приходит складываю в буфер. И, при каждом приходе, его анализирую по выдвинутым условиям, у вас это пять байт. Когда условия выполняться, то эту часть удаляю из буфера и отправляю на обработку.
AndryG
assistant
assistant
Сообщения: 111
Зарегистрирован: 24 апр 2017, 22:27
Версия LabVIEW: 2016
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Разбор байт VISA

Сообщение AndryG »

Юрий писал(а): 16 дек 2020, 12:36 Как правило, стараюсь использовать такую схему. Всё, что приходит складываю в буфер. И, при каждом приходе, его анализирую по выдвинутым условиям, у вас это пять байт. Когда условия выполняться, то эту часть удаляю из буфера и отправляю на обработку.
Я это понимаю ,на контроллере я так и делаю ,но в вопросе с Visa я не совсем понимаю как это делать ,все, что я вижу это большой буфер приема , непрерывная передача данных. Может быть есть возможность по-байтово принимать сигнал или как это делать? Не понимаю как устроен буфер приема VISA/
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5467
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 88 раз

Re: Разбор байт VISA

Сообщение IvanLis »

AndryG писал(а): 16 дек 2020, 13:52 Я это понимаю ,на контроллере я так и делаю ,но в вопросе с Visa я не совсем понимаю как это делать ,все, что я вижу это большой буфер приема , непрерывная передача данных. Может быть есть возможность по-байтово принимать сигнал или как это делать? Не понимаю как устроен буфер приема VISA/
Вы можете вычитывать данные из буфера VISA как угодно, по количеству, таймингу (более рационально в Вашем случае на мой взгляд), и складывать их потом в свой программный буфер. В котором уже реализована своя пост обработка.
AndryG
assistant
assistant
Сообщения: 111
Зарегистрирован: 24 апр 2017, 22:27
Версия LabVIEW: 2016
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Разбор байт VISA

Сообщение AndryG »

Юрий писал(а): 16 дек 2020, 12:36 Как правило, стараюсь использовать такую схему. Всё, что приходит складываю в буфер. И, при каждом приходе, его анализирую по выдвинутым условиям, у вас это пять байт. Когда условия выполняться, то эту часть удаляю из буфера и отправляю на обработку.
Делаю вот так или может цикл приема нужно организовать?
Вложения
Pic.png
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Разбор байт VISA

Сообщение Borjomy_1 »

НЕ НАДО использовать Bytes As Port. Нужно принять 5 байт, указывайте! Функция чтения выдаст вам 5 принятых байт (т.е. будет ждать), либо вернёт ошибку по тайм-ауту, если устройство выключено. В любом случае, вы никоим образом не защищены от запуска программы в момент передачи посылки. Для защиты надо либо делать тайм-аут меньше интервала между посылками и делать холостой цикл при выходе по таймауту, либо искать головной байт в принятой посылке и при нахождении его не на первом месте вычитывать отдельно недостающее
AndryG
assistant
assistant
Сообщения: 111
Зарегистрирован: 24 апр 2017, 22:27
Версия LabVIEW: 2016
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Разбор байт VISA

Сообщение AndryG »

Borjomy_1 писал(а): 16 дек 2020, 23:31 НЕ НАДО использовать Bytes As Port. Нужно принять 5 байт, указывайте! Функция чтения выдаст вам 5 принятых байт (т.е. будет ждать), либо вернёт ошибку по тайм-ауту, если устройство выключено. В любом случае, вы никоим образом не защищены от запуска программы в момент передачи посылки. Для защиты надо либо делать тайм-аут меньше интервала между посылками и делать холостой цикл при выходе по таймауту, либо искать головной байт в принятой посылке и при нахождении его не на первом месте вычитывать отдельно недостающее
Да в том то и дело, что никаких признаков конца посылки нет ,ни таймаута ,ничего,я уже и так и эдак ,спасибо за подсказки,Bytes As Port я использую сейчас для определения наличия байт ,чтобы не срабатывал таймаут при попытке принять байты ,если их нет. Китайцы постарались сделать протокол ,ни контрольных сумм тебе ,ни признаков конца пакета .Указывать кол-во байт получается ,но на каком-то моменте происходит рассинхронизация. Думаю может попробовать по-байтово и проверять в одном байте бит, вроде бы по протоколу он должен быть установлен в 1 при целостности пакета? Может у кого еще мысли есть?
Вложения
Pic.png
AndryG
assistant
assistant
Сообщения: 111
Зарегистрирован: 24 апр 2017, 22:27
Версия LabVIEW: 2016
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Разбор байт VISA

Сообщение AndryG »

Вот так выглядит пакет ,
S Начальный бит флага нового сканирования
Когда S установлен в 1, текущие
входящие пакеты есть новое сканирование.
𝑺 ̅ Инвертированный бит флага запуска, всегда 𝑆 =! 𝑆
Может использоваться как бит проверки данных.
C Контрольный бит, постоянно установлен на 1 Может использоваться как контрольный бит данных.
Вложения
Pic.png
ujin1
adviser
adviser
Сообщения: 231
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 18 раз
Поблагодарили: 37 раз
Контактная информация:

Re: Разбор байт VISA

Сообщение ujin1 »

AndryG писал(а): 17 дек 2020, 10:53 Вот так выглядит пакет ,
S Начальный бит флага нового сканирования
Когда S установлен в 1, текущие
входящие пакеты есть новое сканирование.
𝑺 ̅ Инвертированный бит флага запуска, всегда 𝑆 =! 𝑆
Может использоваться как бит проверки данных.
C Контрольный бит, постоянно установлен на 1 Может использоваться как контрольный бит данных.
1. Информация содержится во всей посылке т. е. 5 байт. То есть нужна вся посылка, но одна.
2. 3 бита в посылке всегда имеют определенное значение.
Принимаете побайтно. Пока не накопится 5 байт ( одна посылка).
После приема очередного байта проверяете S, !S, C что они в первых (или последних по описанию не понятно) двух байтах. В общем на своих местах.
Синхронизация предварительно определена. Принимаете еще 4 (3-10) посылок по 5 байт. Все необходимые биты на своих местах.
Включаете флаг carrier - несущая или connect.
Ну и так далее. Первым делом при приеме посылки из 5 байт определяете, что контрольные биты на своих местах.
Далее зависит от требуемой надежности. Можно при единичном сбое сбрасывать connect. Можно критерий правдоподобия какой-нибудь установить. Например в 8 посылках из 10 подряд нужные биты на своих местах.
Изображение
AndryG
assistant
assistant
Сообщения: 111
Зарегистрирован: 24 апр 2017, 22:27
Версия LabVIEW: 2016
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Разбор байт VISA

Сообщение AndryG »

ujin1 писал(а): 17 дек 2020, 12:53 1. Информация содержится во всей посылке т. е. 5 байт. То есть нужна вся посылка, но одна.
2. 3 бита в посылке всегда имеют определенное значение.
Принимаете побайтно. Пока не накопится 5 байт ( одна посылка).
После приема очередного байта проверяете S, !S, C что они в первых (или последних по описанию не понятно) двух байтах. В общем на своих местах.
Синхронизация предварительно определена. Принимаете еще 4 (3-10) посылок по 5 байт. Все необходимые биты на своих местах.
Включаете флаг carrier - несущая или connect.
Ну и так далее. Первым делом при приеме посылки из 5 байт определяете, что контрольные биты на своих местах.
Далее зависит от требуемой надежности. Можно при единичном сбое сбрасывать connect. Можно критерий правдоподобия какой-нибудь установить. Например в 8 посылках из 10 подряд нужные биты на своих местах.
Спасибо большое за ответ, я тоже уже ,плавно ,к этому способу склоняюсь ,в тупую ,к сожалению, не получается ,происходит рассинхронизация, UART пропускает порядок байт и требуется синхронизация.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Разбор байт VISA

Сообщение Borjomy_1 »

Ничего неправильного в том, чтобы выходить по таймауту, нет. Как раз наоборот, выход по таймауту дает возможность на следующем цикле точно попасть на начало посылки.
AndryG
assistant
assistant
Сообщения: 111
Зарегистрирован: 24 апр 2017, 22:27
Версия LabVIEW: 2016
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Разбор байт VISA

Сообщение AndryG »

Borjomy_1 писал(а): 17 дек 2020, 16:37 Ничего неправильного в том, чтобы выходить по таймауту, нет. Как раз наоборот, выход по таймауту дает возможность на следующем цикле точно попасть на начало посылки.
Каким образом запускать время, когда обнаружится пропуск бита проверки? И какое выбирать время этого таймаута ?
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2211
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 27 раз

Re: Разбор байт VISA

Сообщение Borjomy_1 »

AndryG писал(а): 17 дек 2020, 22:26 Каким образом запускать время, когда обнаружится пропуск бита проверки? И какое выбирать время этого таймаута ?
Время таймаута выбирать как время меньше интервала между посылками (учитывая время передачи данных). Тогда будет автоматически, за исключением первой принятой посылки, производиться выравнивание по первому байту. На каждую посылку будет приходится две итерации цикла - одна рабочая, когда будет принята посылка и вторая - холостая, когда выход будет произведен по таймауту.
Также рекомендую в настройках драйвера последовательного порта (панель управления->система->диспетчер устройств) установить размер входного FIFO буфера, равный 1, это ускорит прием данных (интервал времени между приемом данных микросхемой и выдачи события приема необходимого объема данных) Это особенно актуально, если размер посылки не совпадает с размером FIFO буфера.
ujin1
adviser
adviser
Сообщения: 231
Зарегистрирован: 06 ноя 2020, 15:37
Версия LabVIEW: 19
Благодарил (а): 18 раз
Поблагодарили: 37 раз
Контактная информация:

Re: Разбор байт VISA

Сообщение ujin1 »

Borjomy_1 писал(а): 18 дек 2020, 00:42 Время таймаута выбирать как время меньше интервала между посылками (учитывая время передачи данных).
Здесь таймаут между посылками предполагается больше чем таймаут между символами в посылке. По аналогии с MODBUS таймаут между посылками больше 3,5 символа.
Тогда можно по большому таймауту определить начало следующей посылки.
Есть или нет большой таймаут - например осциллографом посмотреть обмен на шине.
Изображение
AndryG
assistant
assistant
Сообщения: 111
Зарегистрирован: 24 апр 2017, 22:27
Версия LabVIEW: 2016
Благодарил (а): 1 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Разбор байт VISA

Сообщение AndryG »

ujin1 писал(а): 18 дек 2020, 06:56
Borjomy_1 писал(а): 18 дек 2020, 00:42 Время таймаута выбирать как время меньше интервала между посылками (учитывая время передачи данных).
Здесь таймаут между посылками предполагается больше чем таймаут между символами в посылке. По аналогии с MODBUS таймаут между посылками больше 3,5 символа.
Тогда можно по большому таймауту определить начало следующей посылки.
Есть или нет большой таймаут - например осциллографом посмотреть обмен на шине.
Таймаут отсутствует ,вот в чем дело, я об этом неоднократно уже писал, что никаких признаков конца пакета ,таймаут один из них. Модуль передает непрерывно и как я понимаю не дело в разрыве пакетов , а проблема с буфером VISA, я уже пытался ограничивать его ,но ничего не помогает, на скорости 115200 либо VISA не справляется ,либо не успевает Windows обрабатывать ,хотя до определенного момента все хорошо, после 20-30 сек . приема начинаются пропуски. Если непрерывно скачивать в программный буфер то пропусков нет,как только пытаюсь обрабатывать через время появляются .Свой буфер я сбрасываю периодически.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»