Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2014, 20:33   #1
Punk1911
Пользователь
 
Регистрация: 18.04.2014
Сообщений: 10
По умолчанию Выделение нужных байт из массива байт

Всем привет!

Пробую написать программу для диагностики автомобиля по K-line. К слову, программа пишется в основном для себя и для изучения нового для меня языка программирования.
Моих знаний пока что хватило на написание метода коммуникации с блоком управления через СОМ-порт (k-line адаптер на FT232RL). Блок отвечает положительно, значит я на верном пути

Только у меня возник вопрос: как отделять в принятом сообщении то, что я послал в порт от ответа блока управления?
То есть при посылке пакета startComm = 81 10 F1 81 03 в порт, при чтении из порта я получаю эхо+ответ блока = 81 10 F1 81 03 83 F1 10 C1 6B 8F 3F. Жирным выделен ответ блока, который и требуется далее анализировать.
Есть мысли просто проходить по принятому массиву байт и сравнивать с массивом, который я послал в порт. Когда элементы массивов перестанут совпадать, то значит дошли до посылки от блока. Может есть еще какие-нибудь варианты?
Punk1911 вне форума Ответить с цитированием
Старый 18.04.2014, 21:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Не очень понимаю почему в ответе идет запрос, но думаю твоя идея правильная.
Впрочем если ответ всегда идет в начале, можно просто вычислить смещение по длине запроса и уже сместив указатель массива считывать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.04.2014, 23:43   #3
Punk1911
Пользователь
 
Регистрация: 18.04.2014
Сообщений: 10
По умолчанию

Спасибо! Думаю, идея со смещением подойдет. Просто запоминать, сколько байт послал в порт (N) и первые N-байт просто отсекать из принятого массива.

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не очень понимаю почему в ответе идет запрос
Могу ошибаться в своих рассуждениях, но K-line - это один провод, а у COM-порта Rx и Tx. То есть два провода переходят в один Из-за этого и получаем, так называемое, эхо.
Punk1911 вне форума Ответить с цитированием
Старый 18.04.2014, 23:57   #4
NomenEstOmen
Пользователь
 
Регистрация: 11.04.2014
Сообщений: 21
По умолчанию

При смещении только надо проверять, что в начале именно запрос. Т.к. Он там может быть не всегда (учитывая подробность описания проблемы )
NomenEstOmen вне форума Ответить с цитированием
Старый 19.04.2014, 06:05   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
k-line адаптер на FT232RL
у вас идет эхо по одной простой причине: в используемом вами k-line адаптере не реализовано/не предусмотрено управление режимом приемника (его блокирование/бланкирование) на время передачи, вот он и ловит то, что передает. Такой же эффект есть и просто в дешевых USB/RS-485, где признак передачи с FT-232 не задействован для управления 2-3 ногами ADM485, к примеру.

К сожалению, реализаций K-line адаптера множество, начиная от FT-232 + L9637, заканчивая просто на двух транзисторах, поэтому и советовать что-то конкретное при вашем умолчании об реализации нельзя. Однако в данном конкретном случае, наличие эха - не трагедия и решается просто - приемом в буфер и разбором пакета, начиная с длины переданного пакета, т.е. смещения, как и посоветовали выше.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 19.04.2014, 15:33   #6
Punk1911
Пользователь
 
Регистрация: 18.04.2014
Сообщений: 10
По умолчанию

raxp, большое спасибо за развернутый ответ! Адаптер собран на FT232RL + L9637. Думаю, что в данном случае нет возможности управлять эхом.
Punk1911 вне форума Ответить с цитированием
Старый 22.04.2014, 13:40   #7
Punk1911
Пользователь
 
Регистрация: 18.04.2014
Сообщений: 10
По умолчанию

Чтобы не плодить еще одну тему, задам еще один вопрос тут.

Как определить конец посылки из порта? Я использую методику чтения из порта, как написано в MSDN SerialPort.DataReceived - событие

Можно ли использовать свойство BytesToRead, чтобы однозначно определить окончание приема байт?
Punk1911 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция изменяет старший байт числа на заданное значение,не изменяя младший байт ( C++ ) Любимый_1 Помощь студентам 3 07.10.2013 16:42
Контрольная сумма массива байт. ka11n C# (си шарп) 1 26.02.2013 11:24
Найти байт максимальным количестов единиц и байт с максмальным количеством нулей и разность (ассемблер) Beren42 Помощь студентам 0 15.12.2010 20:32
Получение массива байт JPanel BleStaR Общие вопросы по Java, Java SE, Kotlin 0 15.12.2010 17:20
Перевод массива битов в байт Барбарис Общие вопросы .NET 4 25.02.2010 16:15