Преобразование из необработанных данных в float из DDSU666-H

Привет, профессора, я пытаюсь прочитать данные из DDSU666-H ( Smart metter) CHINT используя modbus RTU, я получаю только необработанные данные , но я не знаю , как преобразовать их в float, в приведенном ниже коде речь идет о напряжении, реальные данные-233,4 В, но в последовательном-вот так, может ли кто-нибудь помочь мне преобразовать это в float 233,4 В, спасибо так много!

Вот мой код, я получаю его из библиотеки modbusmaster.
/*
RS485_HalfDuplex.pde - пример использования библиотеки ModbusMaster для связи
с контроллером EPSolar LS2024B, использующим полудуплексный приемопередатчик RS485.
Этот пример протестирован на солнечном контроллере заряда EPSolar LS2024B.
Спецификации протокола см. Здесь:
http://www.solar-elektro.cz/data/dokumenty/1733_modbus_protocol.pdf
Библиотека:: ModbusMaster
Автор:: Мариус Кинтель <marius at kintel dot net>
Copyright:: 2009-2016 Doc Walker
Лицензируется по лицензии Apache версии 2.0 (далее - "Лицензия").;
вы не можете использовать этот файл, кроме как в соответствии с Лицензией.
Копию Лицензии вы можете получить по адресу:
http://www.apache.org/licenses/LICENSE-2.0
Если это не требуется применимым законодательством или не согласовано в письменной форме, программное обеспечение
распространяется по Лицензии на условиях "КАК ЕСТЬ".,
БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ, явных или подразумеваемых.
См.Лицензию для конкретного языка, регулирующего разрешения и
ограничения в соответствии с Лицензией.
*/
#include <ModbusMaster.h>
/*!
Мы используем приемопередатчик RS485, совместимый с MAX485.
Rx/Tx подключается к аппаратному последовательному порту в режиме "Serial".
Контакты Data Enable и Receiver Enable подключаются следующим образом:
*/
#define MAX485_DE 50
#define MAX485_RE_NEG 52
// instantiate ModbusMaster object
ModbusMaster node;
void preTransmission()
{
digitalWrite(MAX485_RE_NEG, 1);
digitalWrite(MAX485_DE, 1);
}
void postTransmission()
{
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
}
void setup()
{
pinMode(MAX485_RE_NEG, OUTPUT);
pinMode(MAX485_DE, OUTPUT);
// Init in receive mode
digitalWrite(MAX485_RE_NEG, 0);
digitalWrite(MAX485_DE, 0);
// Modbus communication runs at 115200 baud
Serial1.begin(9600);
Serial.begin(9600);
// Modbus slave ID 1
node.begin(12, Serial1);
// Callbacks allow us to configure the RS485 transceiver correctly
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop()
{
uint8_t i, result;
uint16_t data[2];
union
{
uint32_t j;
float f;
} u;
// Read 16 registers starting at 0x3100)
Serial.println("-----------------------");
result = node.readHoldingRegisters(0x2000, 2);
if (result == node.ku8MBSuccess)
{
for (i = 0; i < 2; i++)
{
data[i] = node.getResponseBuffer(i);
}
Serial.println(data[0]);
Serial.println(data[1]);
u.j = ((unsigned long)data[1] << 16 | data[0]);
Serial.println(u.f);
}
@HẢI HỒ, 👍-1
Обсуждение1 ответ
Похоже, в техническом паспорте не указано конечное значение. Или, может быть, это так, но вы этого не показываете. Из полученных вами чисел следует, что float находятся в порядке большого конца, тогда как ваш код предполагает, что литтл-эндиан.
Измените назначение u.j следующим образом:
u.j = ((unsigned long)data[0] << 16 | data[1]);
о, я действительно успешно прочитал регистр напряжения, но с frequentcy ( 0x200E) это не работает, ха-ха, @HẢI HỒ
Здравствуйте, эксперт, почему я не могу прочитать активный регистр частоты и мощности, в то время как я могу прочитать напряжение и ток ?, @HẢI HỒ
@hẢihỒ: Понятия не имею. Проверьте документацию вашего устройства., @Edgar Bonet
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Печать string and integer LCD
- устаревшее преобразование из строковой константы в 'char*'
не вопрос об Arduino ... в лучшем случае это общий вопрос программирования, @jsotola
пожалуйста, удалите изображение текста и добавьте текст actusl ... текст на картинке не может быть скопирован для анализа, @jsotola
вы имеете в виду текст "привет, профессор"?, @HẢI HỒ
нет, распечатка показаний ... это должен быть текст, а не картинка, @jsotola
Не могли бы вы поделиться своей проводкой между модулем rs485 и ddsu, пожалуйста?, @acca rien