Как декодировать кадр Modbus в значение с плавающей запятой с помощью кода Arduino?

Здравствуйте, пожалуйста, мне нужна ваша помощь, в настоящее время я работаю над проектом emodbus с arduino, я хочу прочитать данные из счетчика энергии на последовательный монитор на плате arduino,

Я отправляю, например, следующий кадр Arduino на счетчик, чтобы восстановить значение напряжения: 01 03 00 12 00 02 64 0E в ответ от счетчика на карту Arduino я получаю следующий кадр: 01 03 04 43 54 19 9A 25 9C, который должен иметь значение: 212.1

Моя проблема в том, что я не мог отобразить на последовательном мониторе, как я могу декодировать этот кадр с помощью кода Arduino, чтобы получить истинное значение


person Oussama    schedule 01.04.2020    source источник
comment
Каков формат кадра, что в каких байтах, приведите пример, как интерпретировать   -  person Codebreaker007    schedule 02.04.2020
comment
@ Codebreaker007 получает кадр в 9 байтах: 01 03 04 43 54 19 9A 25 9C, я не знаю, правильно ли я вам отвечу   -  person Oussama    schedule 02.04.2020
comment
Да, я прочитал это, но неважно, я дам вам ответ через несколько минут.   -  person Codebreaker007    schedule 02.04.2020
comment
@ Codebreaker007 Большое спасибо, на самом деле я мог декодировать кадр на выходе, но проблема, с которой я столкнулся, заключается в том, что иногда я получаю истинное значение, иногда нет, проблема в кадре приема, иногда я не получаю его полностью   -  person Oussama    schedule 02.04.2020


Ответы (1)


Прочтите здесь о библиотеке modbus

Форматы кадров (это отвечает на мой вопрос из комментария - вы должны были это знать)

«Фрейм» Modbus состоит из блока данных приложения (ADU), который инкапсулирует блок данных протокола (PDU): [10]

ADU = Address + PDU + Error check,
PDU = Function code + Data.

Порядок байтов для значений в кадрах данных Modbus: старший байт многобайтового значения отправляется раньше остальных. Все варианты Modbus используют один из следующих форматов кадра. [1]
Формат кадра Modbus RTU (в основном используется в линиях асинхронных последовательных данных, таких как RS-485 / EIA-485)
Имя Длина (биты) Функция
Начало 28 Минимум 3½ символа времени молчания (условие отметки) < br> Адрес 8 Адрес станции
Функция 8 Указывает код функции; например, чтение катушек / регистров хранения
Данные n × 8 Данные + длина будут заполнены в зависимости от типа сообщения
CRC 16 Проверка циклическим избыточным кодом
Конец 28 По крайней мере, 3½ символа паузы между кадрами

Прежде чем использовать библиотеку или стандартные блоки из нее, сначала прочтите проблемы. Чтобы получить приложение для emodbus, перейдите сюда: просмотрите файлы emodbus.h и emodbus.cpp, etools.h и etools.cpp

person Codebreaker007    schedule 02.04.2020
comment
можешь проверить мою проблему? в stackoverflow.com/questions/ 60998226 / - person Oussama; 02.04.2020
comment
Да, я решил это с помощью этого кода: `while (RS485-› available ()) {RS485- ›readBytes (data, 9); Строка data1 = Строка (данные [3], HEX) + Строка (данные [4], HEX) + Строка (данные [5], HEX) + Строка (данные [6], HEX); const char modbus_data [data1.length () + 1]; data1.toCharArray (modbus_data, data1.length () + 1); союз {uint32_t я; float f; } Напряжение; напряжение. i = strtoul (modbus_data, NULL, 16); ` - person Oussama; 02.04.2020