Разбор по блокам телеграммы с COM-порта

Темы связанные с инженерными разработками, но не подходящие в другие ветки форума
Ответить
Darkcrown
interested
interested
Сообщения: 8
Зарегистрирован: 26 июл 2018, 08:03
Версия LabVIEW: 2015
Контактная информация:

Разбор по блокам телеграммы с COM-порта

Сообщение Darkcrown »

Всем привет! Есть девайс, постоянно отправляющий телеграммы по ком-порту. Получаю через конвертер RS-422->RS-232. Данные прилетают корректные в HEX, но приходят кусками, т.е. прилетает часть телеграммы, потом еще кусок, может прилететь конец предпоследней телеграммы с добавкой новой(незаконченной). Телеграммы всегда разные по размеру. Я ищу начало по стартовым битам, а именно 0000 0000 и определяю начало или конец и склеиваю. Есть проблема, что в одном сообщении может быть сразу две телеграммы со стартовыми битами и тогда Search and Replace String видит только первую телеграмму. По сути, телеграмма состоит из стартовых битов , заголовка, даты и CRC(для проверки, формируется из заголовка + даты) и мне нужно проверять валидность CRC и раскидать по блокам данные из даты.. Как я понимаю, что-то делаю не корректно.., есть ли нормальные методы обработки данной информации? Просьба хотя бы ткнуть, куда копать(две недели мучений..))
Вложения
hex.zip
Архив vi
(177.58 КБ) 156 скачиваний
Скрин vi
Скрин vi
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: Разбор по блокам телеграммы с COM-порта

Сообщение Vitekkz88 »

1. У Вас есть протокол обмена? Пакетам с данными присваивается какой-то идетификатор? Пример: пакет №1 содержит 20 байт, тип пакета указан в 4-ом байте сообщения?
2. В текущей реализации Вы используете Byte at Port, остерегайтесь Borjomy_1 :crazy:
3. Если у вас данные просто валят в порт бесконечно, а размер посылки в пакете не определен(что является корнем зла), то вычитывайте
N-байт в секунду(например) и парсите.
4. Операцию чтения данных и обработку данных разнесите по разным потокам. Пока вы будете обрабатывать принятые данные - буфер COM-порта может затираться(?) и вы получите пропуски данных.
5. Поиск пакета в куче организуйте следующим образом:
а) находим "0х000000"(первое вхождение), находим "0х000000" - второе вхождение.
б) сдвигаемся к байтам CRC, считаем, сравниваем. Совпало? Пакет найден. Не совпало? Откидываем всё до второго вхождения "0х000000" и начинаем поиск вновь. Так вы выделите пакет.
Может возникнуть ситуация, когда у вас будет единственное вхождение "0х000000"(т.е. это часть пакета). В этом случае Вам нужно сохранить этот кусок и поставить его во главу следующей пачки с данными.
Всё это будет крутиться в отдельном цикле. Операцию по обработке строк замените на операции по работе с байтами.
По сути, телеграмма состоит из стартовых битов , заголовка, даты и CRC(для проверки, формируется из заголовка + даты)
Что в заголовке содержится? Если там есть размер посылки, то Вам нужно по старту чтения синхронизироваться один раз(по входным данным) и всё, далее вычитывать в 2 захода: кусок с размером данных, затем всё остальное.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Darkcrown
interested
interested
Сообщения: 8
Зарегистрирован: 26 июл 2018, 08:03
Версия LabVIEW: 2015
Контактная информация:

Re: Разбор по блокам телеграммы с COM-порта

Сообщение Darkcrown »

Вот пример структуры полной телеграммы
Вложения
1.png
Darkcrown
interested
interested
Сообщения: 8
Зарегистрирован: 26 июл 2018, 08:03
Версия LabVIEW: 2015
Контактная информация:

Re: Разбор по блокам телеграммы с COM-порта

Сообщение Darkcrown »

Описание протокола обмена я добавил в vi ранее, вот скрин
Вложения
2.png
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Разбор по блокам телеграммы с COM-порта

Сообщение dadreamer »

Не вижу в описании протокола инфы о терминаторе. Раз он не используется, надо его отключить в настройках VISA Configure Serial Port. А дальше, я бы вообще по-простому сделал. VISA Bytes At Port на самом деле лишнее тут. Просто читайте через VISA Read макс. число байтов в буфере порта - 4096. Если таймаут по кластеру ошибки - игнор и работаем дальше. Если без ошибок - кидаем в очередь или какой-то иной приёмник, передаём в цикл парсинга данных, там уже разбираем посылку согласно мануалу. Чтобы операции чтения не подвисали, установить таймаут в 1 сек. на VISA Configure Serial Port (по дефолту там 10 сек. стоит). В качестве примера может подойти вот эта заготовка. Таймаут поставить 1000 мс (при малых значениях VISA может "глючить" порой), число считываемых байтов - 4096. Ну, а вместо склейки (Concatenate Strings) - отправка в очередь. Таким образом, всё сведётся к работе со строками - парсинг, склейка, выделение блоков и т.п.

Хочешь - не хочешь, а из порта-то в любом случае надо всё выгребать, битое - не битое, годное или нет... Так что весь разбор байтов проще сделать в отдельном цикле, и там уже определить номер посылки, реальный размер (а может пропал один байт или один лишний?), контр. сумму. Да и это лучше в том плане, что при "косяках" со связью порядок чтения может сбиться, а непосредственно при парсинге это легко отследить. Когда-то делал похожую заготовку парсера-коллектора сообщений - http://labviewportal.org/viewtopic.php?p=65656#p65656 Можно её чуть допилить, вставив анализ размера и CRC.
Последний раз редактировалось dadreamer 26 июл 2018, 12:29, всего редактировалось 2 раза.
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: Разбор по блокам телеграммы с COM-порта

Сообщение Vitekkz88 »

Описание протокола обмена я добавил в vi ранее, вот скрин
Да у Вас размер то всей телеграммы есть! Ураааа, галактика спасена! Вот вы там пример скинул, там в заголовке есть начальные поля 0000 0000, затем поле 0000, а дальше 2 байта с размером 0223. В описании говорится, что это размер в 16-битных словах(т.е. по 2 байта каждое слово). Смотрим Ваш пример с пачкой данных и видим, что всё так и есть. Байты FF07 - это некоторый флаг и адрес устройства.
Всё, вся задача сводится к вычитке первых 10 байт, а потом вычитываем остальное по известному размеру(посчитайте, входит ли туда CRC, а то хз).
Потребуется синхронизация по началу пакета при стартере программы, либо запускать прогу раньше самого устройства и ждать начало транзакций.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1729
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Благодарил (а): 1 раз
Контактная информация:

Re: Разбор по блокам телеграммы с COM-порта

Сообщение Jakob Brontfeyn »

загляните в это обсуждение, может пригодится

http://www.labviewportal.org/viewtopic. ... 250#p65830
Darkcrown
interested
interested
Сообщения: 8
Зарегистрирован: 26 июл 2018, 08:03
Версия LabVIEW: 2015
Контактная информация:

Re: Разбор по блокам телеграммы с COM-порта

Сообщение Darkcrown »

Спасибо всем за ответы! Поигрался, почитал документацию, в общем нет там терминального бита как такового.. Результат - раз в секунду получаю целые 3 телеграммы одним куском, зато не порезанные, правда при старте нужна синхронизация секунды на 3-4..
Вложения
3.png
3.png (8.69 КБ) 5394 просмотра
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Разбор по блокам телеграммы с COM-порта

Сообщение dadreamer »

Darkcrown писал(а):Спасибо всем за ответы! Поигрался, почитал документацию, в общем нет там терминального бита как такового.. Результат - раз в секунду получаю целые 3 телеграммы одним куском, зато не порезанные, правда при старте нужна синхронизация секунды на 3-4..
Я почему-то думал, что должно что-то такое получиться...
Вложения
Untitled 1-1.vi
lv2015
(15.88 КБ) 161 скачивание
Darkcrown
interested
interested
Сообщения: 8
Зарегистрирован: 26 июл 2018, 08:03
Версия LabVIEW: 2015
Контактная информация:

Re: Разбор по блокам телеграммы с COM-порта

Сообщение Darkcrown »

Спасибо! Немного поигрался с таймаутом, теперь получаю целое сообщение(без склейки), правда нужна все же синхронизация(от 1-3 сек). Теперь осталось от обрезка телеграммы раскидать по лучам и полям и вывести для наглядности..)
Вложения
telegram.zip
(34.54 КБ) 167 скачиваний
Darkcrown
interested
interested
Сообщения: 8
Зарегистрирован: 26 июл 2018, 08:03
Версия LabVIEW: 2015
Контактная информация:

Re: Разбор по блокам телеграммы с COM-порта

Сообщение Darkcrown »

В общем сделан показ лучей.. Девайс сей - Sick S300
Вложения
scanner.zip
(43.79 КБ) 158 скачиваний
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Общие»