Страница 1 из 1

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

Добавлено: 26 июл 2018, 09:34
Darkcrown
Всем привет! Есть девайс, постоянно отправляющий телеграммы по ком-порту. Получаю через конвертер RS-422->RS-232. Данные прилетают корректные в HEX, но приходят кусками, т.е. прилетает часть телеграммы, потом еще кусок, может прилететь конец предпоследней телеграммы с добавкой новой(незаконченной). Телеграммы всегда разные по размеру. Я ищу начало по стартовым битам, а именно 0000 0000 и определяю начало или конец и склеиваю. Есть проблема, что в одном сообщении может быть сразу две телеграммы со стартовыми битами и тогда Search and Replace String видит только первую телеграмму. По сути, телеграмма состоит из стартовых битов , заголовка, даты и CRC(для проверки, формируется из заголовка + даты) и мне нужно проверять валидность CRC и раскидать по блокам данные из даты.. Как я понимаю, что-то делаю не корректно.., есть ли нормальные методы обработки данной информации? Просьба хотя бы ткнуть, куда копать(две недели мучений..))

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

Добавлено: 26 июл 2018, 09:57
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 захода: кусок с размером данных, затем всё остальное.

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

Добавлено: 26 июл 2018, 10:15
Darkcrown
Вот пример структуры полной телеграммы

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

Добавлено: 26 июл 2018, 10:20
Darkcrown
Описание протокола обмена я добавил в vi ранее, вот скрин

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

Добавлено: 26 июл 2018, 10:42
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.

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

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

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

Добавлено: 26 июл 2018, 12:51
Jakob Brontfeyn
загляните в это обсуждение, может пригодится

http://www.labviewportal.org/viewtopic. ... 250#p65830

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

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

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

Добавлено: 26 июл 2018, 15:51
dadreamer
Darkcrown писал(а):Спасибо всем за ответы! Поигрался, почитал документацию, в общем нет там терминального бита как такового.. Результат - раз в секунду получаю целые 3 телеграммы одним куском, зато не порезанные, правда при старте нужна синхронизация секунды на 3-4..
Я почему-то думал, что должно что-то такое получиться...

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

Добавлено: 27 июл 2018, 13:28
Darkcrown
Спасибо! Немного поигрался с таймаутом, теперь получаю целое сообщение(без склейки), правда нужна все же синхронизация(от 1-3 сек). Теперь осталось от обрезка телеграммы раскидать по лучам и полям и вывести для наглядности..)

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

Добавлено: 27 июл 2018, 15:35
Darkcrown
В общем сделан показ лучей.. Девайс сей - Sick S300