Разбор байт VISA
-
- assistant
- Сообщения: 111
- Зарегистрирован: 24 апр 2017, 22:27
- Версия LabVIEW: 2016
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
- Контактная информация:
Разбор байт VISA
Доброго времени суток! Прошу помощи у форумчан.
Задача банальная: нужно считывать с ком-порта данные и обрабатывать по количеству байт.
Например :непрерывная передача A0 C5 23 1D 0F ................ без признаков конца пакета ,нужно обрабатывать пакеты по пять байт A0 C5 23 1D 0F - обработка и т. д .... Массив данных обрабатываю без проблем ,а вот сразу сортировать по пакетам ничего не выходит. Может кто сталкивался подобной задачей или знает как ее решить ,буду очень признателен за помощь).
Задача банальная: нужно считывать с ком-порта данные и обрабатывать по количеству байт.
Например :непрерывная передача A0 C5 23 1D 0F ................ без признаков конца пакета ,нужно обрабатывать пакеты по пять байт A0 C5 23 1D 0F - обработка и т. д .... Массив данных обрабатываю без проблем ,а вот сразу сортировать по пакетам ничего не выходит. Может кто сталкивался подобной задачей или знает как ее решить ,буду очень признателен за помощь).
-
- leader
- Сообщения: 526
- Зарегистрирован: 28 фев 2010, 18:04
- Версия LabVIEW: LV2018
- Благодарил (а): 10 раз
- Поблагодарили: 18 раз
- Контактная информация:
Re: Разбор байт VISA
Как правило, стараюсь использовать такую схему. Всё, что приходит складываю в буфер. И, при каждом приходе, его анализирую по выдвинутым условиям, у вас это пять байт. Когда условия выполняться, то эту часть удаляю из буфера и отправляю на обработку.
-
- assistant
- Сообщения: 111
- Зарегистрирован: 24 апр 2017, 22:27
- Версия LabVIEW: 2016
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
- Контактная информация:
Re: Разбор байт VISA
Я это понимаю ,на контроллере я так и делаю ,но в вопросе с Visa я не совсем понимаю как это делать ,все, что я вижу это большой буфер приема , непрерывная передача данных. Может быть есть возможность по-байтово принимать сигнал или как это делать? Не понимаю как устроен буфер приема VISA/
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Разбор байт VISA
Вы можете вычитывать данные из буфера VISA как угодно, по количеству, таймингу (более рационально в Вашем случае на мой взгляд), и складывать их потом в свой программный буфер. В котором уже реализована своя пост обработка.AndryG писал(а): ↑16 дек 2020, 13:52 Я это понимаю ,на контроллере я так и делаю ,но в вопросе с Visa я не совсем понимаю как это делать ,все, что я вижу это большой буфер приема , непрерывная передача данных. Может быть есть возможность по-байтово принимать сигнал или как это делать? Не понимаю как устроен буфер приема VISA/
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- assistant
- Сообщения: 111
- Зарегистрирован: 24 апр 2017, 22:27
- Версия LabVIEW: 2016
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
- Контактная информация:
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Разбор байт VISA
НЕ НАДО использовать Bytes As Port. Нужно принять 5 байт, указывайте! Функция чтения выдаст вам 5 принятых байт (т.е. будет ждать), либо вернёт ошибку по тайм-ауту, если устройство выключено. В любом случае, вы никоим образом не защищены от запуска программы в момент передачи посылки. Для защиты надо либо делать тайм-аут меньше интервала между посылками и делать холостой цикл при выходе по таймауту, либо искать головной байт в принятой посылке и при нахождении его не на первом месте вычитывать отдельно недостающее
-
- assistant
- Сообщения: 111
- Зарегистрирован: 24 апр 2017, 22:27
- Версия LabVIEW: 2016
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
- Контактная информация:
Re: Разбор байт VISA
Да в том то и дело, что никаких признаков конца посылки нет ,ни таймаута ,ничего,я уже и так и эдак ,спасибо за подсказки,Bytes As Port я использую сейчас для определения наличия байт ,чтобы не срабатывал таймаут при попытке принять байты ,если их нет. Китайцы постарались сделать протокол ,ни контрольных сумм тебе ,ни признаков конца пакета .Указывать кол-во байт получается ,но на каком-то моменте происходит рассинхронизация. Думаю может попробовать по-байтово и проверять в одном байте бит, вроде бы по протоколу он должен быть установлен в 1 при целостности пакета? Может у кого еще мысли есть?Borjomy_1 писал(а): ↑16 дек 2020, 23:31 НЕ НАДО использовать Bytes As Port. Нужно принять 5 байт, указывайте! Функция чтения выдаст вам 5 принятых байт (т.е. будет ждать), либо вернёт ошибку по тайм-ауту, если устройство выключено. В любом случае, вы никоим образом не защищены от запуска программы в момент передачи посылки. Для защиты надо либо делать тайм-аут меньше интервала между посылками и делать холостой цикл при выходе по таймауту, либо искать головной байт в принятой посылке и при нахождении его не на первом месте вычитывать отдельно недостающее
-
- assistant
- Сообщения: 111
- Зарегистрирован: 24 апр 2017, 22:27
- Версия LabVIEW: 2016
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
- Контактная информация:
Re: Разбор байт VISA
Вот так выглядит пакет ,
S Начальный бит флага нового сканирования
Когда S установлен в 1, текущие
входящие пакеты есть новое сканирование.
𝑺 ̅ Инвертированный бит флага запуска, всегда 𝑆 =! 𝑆
Может использоваться как бит проверки данных.
C Контрольный бит, постоянно установлен на 1 Может использоваться как контрольный бит данных.
S Начальный бит флага нового сканирования
Когда S установлен в 1, текущие
входящие пакеты есть новое сканирование.
𝑺 ̅ Инвертированный бит флага запуска, всегда 𝑆 =! 𝑆
Может использоваться как бит проверки данных.
C Контрольный бит, постоянно установлен на 1 Может использоваться как контрольный бит данных.
-
- adviser
- Сообщения: 231
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 18 раз
- Поблагодарили: 37 раз
- Контактная информация:
Re: Разбор байт VISA
1. Информация содержится во всей посылке т. е. 5 байт. То есть нужна вся посылка, но одна.AndryG писал(а): ↑17 дек 2020, 10:53 Вот так выглядит пакет ,
S Начальный бит флага нового сканирования
Когда S установлен в 1, текущие
входящие пакеты есть новое сканирование.
𝑺 ̅ Инвертированный бит флага запуска, всегда 𝑆 =! 𝑆
Может использоваться как бит проверки данных.
C Контрольный бит, постоянно установлен на 1 Может использоваться как контрольный бит данных.
2. 3 бита в посылке всегда имеют определенное значение.
Принимаете побайтно. Пока не накопится 5 байт ( одна посылка).
После приема очередного байта проверяете S, !S, C что они в первых (или последних по описанию не понятно) двух байтах. В общем на своих местах.
Синхронизация предварительно определена. Принимаете еще 4 (3-10) посылок по 5 байт. Все необходимые биты на своих местах.
Включаете флаг carrier - несущая или connect.
Ну и так далее. Первым делом при приеме посылки из 5 байт определяете, что контрольные биты на своих местах.
Далее зависит от требуемой надежности. Можно при единичном сбое сбрасывать connect. Можно критерий правдоподобия какой-нибудь установить. Например в 8 посылках из 10 подряд нужные биты на своих местах.
-
- assistant
- Сообщения: 111
- Зарегистрирован: 24 апр 2017, 22:27
- Версия LabVIEW: 2016
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
- Контактная информация:
Re: Разбор байт VISA
Спасибо большое за ответ, я тоже уже ,плавно ,к этому способу склоняюсь ,в тупую ,к сожалению, не получается ,происходит рассинхронизация, UART пропускает порядок байт и требуется синхронизация.ujin1 писал(а): ↑17 дек 2020, 12:53 1. Информация содержится во всей посылке т. е. 5 байт. То есть нужна вся посылка, но одна.
2. 3 бита в посылке всегда имеют определенное значение.
Принимаете побайтно. Пока не накопится 5 байт ( одна посылка).
После приема очередного байта проверяете S, !S, C что они в первых (или последних по описанию не понятно) двух байтах. В общем на своих местах.
Синхронизация предварительно определена. Принимаете еще 4 (3-10) посылок по 5 байт. Все необходимые биты на своих местах.
Включаете флаг carrier - несущая или connect.
Ну и так далее. Первым делом при приеме посылки из 5 байт определяете, что контрольные биты на своих местах.
Далее зависит от требуемой надежности. Можно при единичном сбое сбрасывать connect. Можно критерий правдоподобия какой-нибудь установить. Например в 8 посылках из 10 подряд нужные биты на своих местах.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Разбор байт VISA
Ничего неправильного в том, чтобы выходить по таймауту, нет. Как раз наоборот, выход по таймауту дает возможность на следующем цикле точно попасть на начало посылки.
-
- assistant
- Сообщения: 111
- Зарегистрирован: 24 апр 2017, 22:27
- Версия LabVIEW: 2016
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
- Контактная информация:
Re: Разбор байт VISA
Каким образом запускать время, когда обнаружится пропуск бита проверки? И какое выбирать время этого таймаута ?
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Разбор байт VISA
Время таймаута выбирать как время меньше интервала между посылками (учитывая время передачи данных). Тогда будет автоматически, за исключением первой принятой посылки, производиться выравнивание по первому байту. На каждую посылку будет приходится две итерации цикла - одна рабочая, когда будет принята посылка и вторая - холостая, когда выход будет произведен по таймауту.
Также рекомендую в настройках драйвера последовательного порта (панель управления->система->диспетчер устройств) установить размер входного FIFO буфера, равный 1, это ускорит прием данных (интервал времени между приемом данных микросхемой и выдачи события приема необходимого объема данных) Это особенно актуально, если размер посылки не совпадает с размером FIFO буфера.
-
- adviser
- Сообщения: 231
- Зарегистрирован: 06 ноя 2020, 15:37
- Версия LabVIEW: 19
- Благодарил (а): 18 раз
- Поблагодарили: 37 раз
- Контактная информация:
Re: Разбор байт VISA
Здесь таймаут между посылками предполагается больше чем таймаут между символами в посылке. По аналогии с MODBUS таймаут между посылками больше 3,5 символа.
Тогда можно по большому таймауту определить начало следующей посылки.
Есть или нет большой таймаут - например осциллографом посмотреть обмен на шине.
-
- assistant
- Сообщения: 111
- Зарегистрирован: 24 апр 2017, 22:27
- Версия LabVIEW: 2016
- Благодарил (а): 1 раз
- Поблагодарили: 1 раз
- Контактная информация:
Re: Разбор байт VISA
Таймаут отсутствует ,вот в чем дело, я об этом неоднократно уже писал, что никаких признаков конца пакета ,таймаут один из них. Модуль передает непрерывно и как я понимаю не дело в разрыве пакетов , а проблема с буфером VISA, я уже пытался ограничивать его ,но ничего не помогает, на скорости 115200 либо VISA не справляется ,либо не успевает Windows обрабатывать ,хотя до определенного момента все хорошо, после 20-30 сек . приема начинаются пропуски. Если непрерывно скачивать в программный буфер то пропусков нет,как только пытаюсь обрабатывать через время появляются .Свой буфер я сбрасываю периодически.ujin1 писал(а): ↑18 дек 2020, 06:56Здесь таймаут между посылками предполагается больше чем таймаут между символами в посылке. По аналогии с MODBUS таймаут между посылками больше 3,5 символа.
Тогда можно по большому таймауту определить начало следующей посылки.
Есть или нет большой таймаут - например осциллографом посмотреть обмен на шине.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 2 Ответы
- 662 Просмотры
-
Последнее сообщение Borjomy_1
-
- 4 Ответы
- 242 Просмотры
-
Последнее сообщение Embedder74