Просмотр полной версии : Обработка данных из протокола ОВЕН
Получаю кадр по протоколу ОВЕН. Получаю адрес, признак запроса ,размер блока, хэш и 4 бита данных. Эти биты данных перевожу во флоат и получаю огромное число (при нуле градусов = 1,026399E+09, в которое и намёка нет на нужное мне значение. Причём заметил, что приращение этого числа не линейно по сравнению с приращением температуры на приборе. Возле нуля градусов на каждую 0.1 градуса это число изменяется примерно на 0.01. А возле 60 градусов оно изменяется только примерно на 0.0001. И чем дальше тем менее заметны изменения.
Вопрос в следующем! Как получить именно значение температуры, которое выдаёт прибор.
Добрый вечер!
При работе с приборами ОВЕН использую функции из проверенной библиотеки ввода/вывода owen_io.dll.
Особых проблем с использованием не было.
С уважением
Спасибо за ответ! С библиотекой без проблем. Я без неё делаю. Просто нужно будет реализовать чтение из трм на мк. Всё сделал кроме последнего этапа - интерпретация 4-х байт во флоат. На компе в этом помогла функция BitConvert.toSingle()
Byte_ch(5) = (Byte_buff(9) << 4) Or (Byte_buff(10))
Byte_ch(4) = (Byte_buff(11) << 4) Or (Byte_buff(12))
Byte_ch(3) = (Byte_buff(13) << 4) Or (Byte_buff(14))
Byte_ch(2) = (Byte_buff(15) << 4) Or (Byte_buff(16))
' Byte_ch(1) = (Byte_buff(17) << 4) Or (Byte_buff(18))
' Byte_ch(0) = (Byte_buff(19) << 4) Or (Byte_buff(20))
DATA_R = BitConverter.ToSingle(Byte_ch, 2) 'Тут уже реальная температура
А вот как на СИ это организовать такой перевод?
Всё получилось)))
data[3]=65;
data[2]=151;
data[1]=46;
data[0]=55;
value = *(float*)&data;
Беру адрес массива байт и принудительно говорю копилятору, что это не байт а флоат. Соответственно он берёт первые 4 байта (тип флоат занимает 4 байта) и интерпретирует их как число типа флоат.
В переменной value теперь число 18,89.......ну и там ещё много ненужных цифр.
rekbrjaaa
20.12.2016, 07:59
доброе утро. а контрольная сумма не как по modbus ?полином 8F 57?
Да, вот расчёт
/* расчет контрольной суммы */
unsigned short owenCRC16(unsigned char* packet, size_t length)
{
size_t i, j;
unsigned short crc;
crc = 0;
for (i = 0; i < length; ++i)
{
unsigned char b = packet[i];
for (j = 0; j < 8; ++j, b <<= 1)
{
if ((b ^ (crc >> 8)) & 0x80)
{
crc <<= 1;
crc ^= 0x8F57;
}
else
crc <<= 1;
}
}
return crc;
}
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot