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

Темы связанные с инженерными разработками, но не подходящие в другие ветки форума

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

Postby Darkcrown on 26 Jul 2018, 09:34

Всем привет! Есть девайс, постоянно отправляющий телеграммы по ком-порту. Получаю через конвертер RS-422->RS-232. Данные прилетают корректные в HEX, но приходят кусками, т.е. прилетает часть телеграммы, потом еще кусок, может прилететь конец предпоследней телеграммы с добавкой новой(незаконченной). Телеграммы всегда разные по размеру. Я ищу начало по стартовым битам, а именно 0000 0000 и определяю начало или конец и склеиваю. Есть проблема, что в одном сообщении может быть сразу две телеграммы со стартовыми битами и тогда Search and Replace String видит только первую телеграмму. По сути, телеграмма состоит из стартовых битов , заголовка, даты и CRC(для проверки, формируется из заголовка + даты) и мне нужно проверять валидность CRC и раскидать по блокам данные из даты.. Как я понимаю, что-то делаю не корректно.., есть ли нормальные методы обработки данной информации? Просьба хотя бы ткнуть, куда копать(две недели мучений..))
Attachments
hex.zip
Архив vi
(177.58 KiB) Downloaded 14 times
screen.png
Скрин vi
Darkcrown
interested
interested
 
Posts: 6
Joined: 26 Jul 2018, 08:03
LabVIEW Version: 2015
Karma: 0

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

Postby Vitekkz88 on 26 Jul 2018, 09:57

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 захода: кусок с размером данных, затем всё остальное.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
expert
expert
 
Posts: 1017
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 281
hardware I/O VIP

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

Postby Darkcrown on 26 Jul 2018, 10:15

Вот пример структуры полной телеграммы
Attachments
1.png
Darkcrown
interested
interested
 
Posts: 6
Joined: 26 Jul 2018, 08:03
LabVIEW Version: 2015
Karma: 0

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

Postby Darkcrown on 26 Jul 2018, 10:20

Описание протокола обмена я добавил в vi ранее, вот скрин
Attachments
2.png
Darkcrown
interested
interested
 
Posts: 6
Joined: 26 Jul 2018, 08:03
LabVIEW Version: 2015
Karma: 0

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

Postby dadreamer on 26 Jul 2018, 10:42

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

Хочешь - не хочешь, а из порта-то в любом случае надо всё выгребать, битое - не битое, годное или нет... Так что весь разбор байтов проще сделать в отдельном цикле, и там уже определить номер посылки, реальный размер (а может пропал один байт или один лишний?), контр. сумму. Да и это лучше в том плане, что при "косяках" со связью порядок чтения может сбиться, а непосредственно при парсинге это легко отследить. Когда-то делал похожую заготовку парсера-коллектора сообщений - viewtopic.php?p=65656#p65656 Можно её чуть допилить, вставив анализ размера и CRC.
Last edited by dadreamer on 26 Jul 2018, 12:29, edited 2 times in total.
User avatar
dadreamer
professor
professor
 
Posts: 3085
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 776
I/O VIP vision internet

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

Postby Vitekkz88 on 26 Jul 2018, 10:45

Описание протокола обмена я добавил в vi ранее, вот скрин
Да у Вас размер то всей телеграммы есть! Ураааа, галактика спасена! Вот вы там пример скинул, там в заголовке есть начальные поля 0000 0000, затем поле 0000, а дальше 2 байта с размером 0223. В описании говорится, что это размер в 16-битных словах(т.е. по 2 байта каждое слово). Смотрим Ваш пример с пачкой данных и видим, что всё так и есть. Байты FF07 - это некоторый флаг и адрес устройства.
Всё, вся задача сводится к вычитке первых 10 байт, а потом вычитываем остальное по известному размеру(посчитайте, входит ли туда CRC, а то хз).
Потребуется синхронизация по началу пакета при стартере программы, либо запускать прогу раньше самого устройства и ждать начало транзакций.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
expert
expert
 
Posts: 1017
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 281
hardware I/O VIP

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

Postby Jakob Brontfeyn on 26 Jul 2018, 12:51

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

viewtopic.php?f=21&t=8250#p65830
User avatar
Jakob Brontfeyn
expert
expert
 
Posts: 1696
Joined: 28 Feb 2008, 11:01
Medals: 6
Activity (1) Gold (1) Silver (2) Black (2)
Karma: 227
VIP

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

Postby Darkcrown on 26 Jul 2018, 15:25

Спасибо всем за ответы! Поигрался, почитал документацию, в общем нет там терминального бита как такового.. Результат - раз в секунду получаю целые 3 телеграммы одним куском, зато не порезанные, правда при старте нужна синхронизация секунды на 3-4..
Attachments
3.png
3.png (8.69 KiB) Viewed 503 times
Darkcrown
interested
interested
 
Posts: 6
Joined: 26 Jul 2018, 08:03
LabVIEW Version: 2015
Karma: 0

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

Postby dadreamer on 26 Jul 2018, 15:51

Darkcrown wrote:Спасибо всем за ответы! Поигрался, почитал документацию, в общем нет там терминального бита как такового.. Результат - раз в секунду получаю целые 3 телеграммы одним куском, зато не порезанные, правда при старте нужна синхронизация секунды на 3-4..

Я почему-то думал, что должно что-то такое получиться...
Attachments
Untitled 1-1.vi
lv2015
(15.88 KiB) Downloaded 18 times
User avatar
dadreamer
professor
professor
 
Posts: 3085
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 776
I/O VIP vision internet

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

Postby Darkcrown on 27 Jul 2018, 13:28

Спасибо! Немного поигрался с таймаутом, теперь получаю целое сообщение(без склейки), правда нужна все же синхронизация(от 1-3 сек). Теперь осталось от обрезка телеграммы раскидать по лучам и полям и вывести для наглядности..)
Attachments
telegram.zip
(34.54 KiB) Downloaded 14 times
Darkcrown
interested
interested
 
Posts: 6
Joined: 26 Jul 2018, 08:03
LabVIEW Version: 2015
Karma: 0

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

Postby Darkcrown on 27 Jul 2018, 15:35

В общем сделан показ лучей.. Девайс сей - Sick S300
Attachments
scanner.zip
(43.79 KiB) Downloaded 15 times
Darkcrown
interested
interested
 
Posts: 6
Joined: 26 Jul 2018, 08:03
LabVIEW Version: 2015
Karma: 0


Return to Общие

Who is online

Users browsing this forum: No registered users and 5 guests

cron