|
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
||||||||||||||||
Qt + последовательный порт24.12.2014, 12:04. Показов 3963. Ответов 15
Метки нет (Все метки)
Добрый день. Осваиваю чтение данных из последовательного порта, и возник такой вопрос.
Вот есть метод, который считывает данные:
С этим все понятно. А в каком виде байты будут? Я без устройства, и поэтому мне приходится гадать, в каком виде каждый байт будет. Знаю точно, что пакет данных выглядит примерно так: (здесь и далее, в хексе) 00 22 11 F0 88 F0 F0 F0 F0 11 F0 77 EE F0 3C Где первый байт, это байт синхронизации, и он всегда 00, а все остальное еще и кодированные байты, то есть их надо каким то образом декодировать. Подскажите, каким образом это делать? У меня есть таблица, где прописано, что байт 1 это допустим в кодированном виде байт 11. Из чего я могу сделать вывод, что операцию кодирования\декодирования надо будет делать через обычное сравнивание. А как мне каждый байт сравнить? Пробовал так:
предупреждение: comparison is always false due to limited range of data type [-Wtype-limits] if (data.at(0) == 0xF0) ^ Вот, и я вообще запутался. Более того, изначально я не знаю, какой длины пакет. Тот пример, что я привел, это минимальный пакет - заголовок + контрольная сумма. В таком случае, я не знаю, весь ли пакет пришел, пока не расшифрую заголовок пакета. И еще вопрос, касаемо контрольной суммы. Она всегда находится в конце пакета и составляет 4 байта. И так же в кодировке. Контрольная сумма CRC16, табличная. Нашел для Qt метод: Кликните здесь для просмотра всего текста
Я правильно понимаю, что мне надо в этот метод отправить пакет и на выходе я получу массив байтов с контрольной суммой? Заранее извиняюсь за, возможно, столь примитивные вопросы, никогда прежде не занимался работой с байтами.
0
|
||||||||||||||||
| 24.12.2014, 12:04 | |
|
Ответы с готовыми решениями:
15
Последовательный порт
ArduinoIDE и последовательный порт |
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
| 24.12.2014, 12:24 | |
|
Воротислав,
1. Вы реально считаете, что на форуме кто либо не имея не то что вашего устройства, но и вообще не имея понятия о том, что это за устройство, сможет подсказать как расшифровать байтовый массив? 2. В функцию расчета CRC передаешь массив байт и получаешь целое 4-х байтовое число. Добавлено через 2 минуты Дальше это число можешь воспринимать как 4 байта и запихнуть их в байтовый массив, если тебе это нужно...
1
|
|
|
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
|
| 24.12.2014, 12:34 [ТС] | |
|
solar_wind,
1. я не уверен, но так ли важно знать что это за устройство, чтоб по протоколу разобрать по байтам пакет? То есть, если касаемо вида, в каком приходит пакет, то да, согласен. Могу сказать, что устройства находится на железнодорожных станциях и отвечают за какую либо часть, например за стрелки на путях. Или разрешающий сигнал. Больше информации не имею на данный момент. А что касаемо разбора пакета? То есть я пример реального пакета привел. Это он в кодированном наборе (кроме первого байта), кодировка Бауэра. Таблицу кодирования могу приложить, если таковая будет необходима. 2. Понял, благодарю.
0
|
|
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
| 24.12.2014, 12:40 | |
|
Воротислав, Ну если есть таблица кодирования, то делаешь цикл по массиву и дальше сравниваешь байты. Желательно, что бы типы сравниваемых байтов соответствовали друг другу.
1
|
|
|
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
|
| 24.12.2014, 12:43 [ТС] | |
|
solar_wind, Вот именно с этого я и начал пост :-). Как правильно сравнить байты, не могу догнать. Может имеет смысл перевести QByteArray к другому виду? Например весь массив QByteArray в массив char*[] и там уже сравнивать? Если да, то как это сделать?
0
|
|
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
||||||
| 24.12.2014, 12:48 | ||||||
Сообщение было отмечено Воротислав как решение
Решение
Воротислав, Зависит от того в каком виде у тебя таблица.
Можно получить указатель на char через функцию data. Попробуй вот так:
1
|
||||||
|
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
|
| 24.12.2014, 12:51 [ТС] | |
|
solar_wind, таблица пока в виде doc-файла
. Спасибо большое!
0
|
|
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
||
| 24.12.2014, 12:53 | ||
Важно как она у тебя в памяти в программе будет отображена.
0
|
||
|
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
||||||||||||||||
| 25.12.2014, 01:26 [ТС] | ||||||||||||||||
|
Чет я вообще перестал понимать.
В одной программульке формирую массив байт:
data.toHex to send: "002211f088f0f0f0f011f077eef03c" отправляю в порт:
Packet data.size(): 30 Как так то? То есть то, что было одним байтом, стало двумя... А как мне получить то, что я отправил?
0
|
||||||||||||||||
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
| 25.12.2014, 06:21 | |
|
Ну для начала я бы посоветовал вам почитать что такое структуры данных и как различные данные представляются в памяти.
Изначально у вас был массив из 15 байт. Далее вы, как я понимаю, использовали функцию data.toHex Вы знаете что эта функция делает? Она просто преобразовывает шестнадцатеричное представление данных в текст. Каждая латинская буква может быть закодирована одним байтом. Один байт в шестнадцатеричном виде представляется 2 символами. toHex превратила каждый из этих символов в букву/цифру и каждый из этих символов, который раньше характеризовал пол байта, теперь превратился в байт. И это символьное представление ты уже передал в порт. И абсолютно логично, что ты получил 30 байт. Добавлено через 2 минуты Воротислав, То есть вы получили точно то, что отправили. Но отправили вы не массив data.
1
|
|
|
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
||||||
| 25.12.2014, 08:48 [ТС] | ||||||
|
solar_wind, благодарю! уже становится понятнее. Значит не правильно понял описание:
"QByteArray QByteArray::toHex () const Возвращает копию массива, преобразованного в шестнадцатеричный вид. Шестнадцатеричное представление использует цифры 0-9 и буквы a-f." Вот я и не мог предположить, что будет текст. И меня смущал тот факт, что после вызова
0
|
||||||
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
||
| 25.12.2014, 08:54 | ||
|
Воротислав, qDebug наверное пытался отобразить текст отображая символьное представление кодов из массива. Или просто не понял, что ты от него хочешь. Если хочешь посмотреть реально, что в памяти, то память и смотри, дебагеры предоставляют такую возможность. Надо только адрес нужной ячейки памяти выяснить.
Добавлено через 20 секунд
0
|
||
|
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
|||||||||||||||||
| 25.12.2014, 12:16 [ТС] | |||||||||||||||||
|
solar_wind,
С - это полубайт? А можно ли как то байты, как правильно сказать, совмещать что ли? Из этой конструкции:
7E0C И по прежнему 4 байта, а мне надо из них сделать 2 байта. Я так предполагаю, что это надо делать в функции декодирования, она на данный момент выглядит так: Кликните здесь для просмотра всего текста
То есть где то здесь, надо указать массиву, что грубо говоря, два чара - это один байт? И еще вопрос, функция qFromLittleEndian поможет ли мне "развернуть" порядок байт? После декодирования я получаю: 7E0C А надо: с0е7
0
|
|||||||||||||||||
|
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
|
|
| 25.12.2014, 12:32 | |
|
Воротислав,
То есть у тебя кодировщик тупо берет младшую половину каждого байта и из них получает нужные значения? Странное какое то кодирование...... Но вообще ты можешь совмещать все что угодно. Изучай битовые операции https://ru.wikipedia.org/wiki/... 0%F6%E8%E8 Не, ну конечно ты можешь и через преобразование в текст и обратно сделать, но это не очень хороший способ наверное....
1
|
|
|
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
|||||||||||
| 25.12.2014, 12:43 [ТС] | |||||||||||
|
solar_wind, младшую половину байта? я предполагал, что у меня весь байт кодирует...
0
|
|||||||||||
|
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
|
|
| 25.12.2014, 12:48 [ТС] | |
|
0
|
|
| 25.12.2014, 12:48 | |
|
Помогаю со студенческими работами здесь
16
Отправка байт в последовательный порт Последовательный порт в Multisim 13 не работает Cинхронный последовательный порт DSP
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|