Перейти к содержанию
    

printf("\n float = %f \n", value.fVal); выкидывает из программы

пытаюсь конвертировать модбас данные во флоут

 

union { float fVal; unsigned char bytes[4]; } value;

value.bytes[0] = data[4];

value.bytes[1] = data[3];

value.bytes[2] = data[6];

value.bytes[3] = data[5];

printf("\n float = %f \n", value.fVal);

и на принтфе просто без ругани выкидывает из программы

Изменено пользователем andybeg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно.. Код на первый взгляд без ошибок.. Попробуйте вместо data[х] присвоит какое-то значение, скажем, запишите туда единицы. И запустите

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

попробовал ещё один вариант перевда во флоут

float Float(const unsigned char* p)

{

float val;

memcpy(&val,p,sizeof(val));

return val;

}

 

arr[0] = data[4];

arr[1] = data[3];

arr[2] = data[6];

arr[3] = data[5];

fl = Float(arr);

 

printf("\n float = %f \n", fl);//(unsigned int)value.fVal);

результат тот е, только теперь уж понятно что вылетет именно при выводе числа

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мм.. даже не знаю.. На большом брате все работает, значит, трабл в железе.. компилируется без варнингов? Памяти досаточно?

 

А вообще что-либо printf() выводит?

Изменено пользователем Savrik

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

варнинг то я и не заметил

incompatible implicit declaration of built-in function ‘memcpy’

правда ворнинг появляется только во втором варианте кнвертации, в первом его естественно нет

 

принтф печатает

float = />
Изменено пользователем andybeg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы уверены, что в вашем варианте printf вообще активирована поддержка float? Попробуйте, для проверки:

 

float vv = 123.567;
printf("float = %f\n", vv);

 

Работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1) Формирование строки сделайте с помощью sprintf, а выдачу строки - с помощью printf.

2) В вашем компиляторе float может оказаться 16-битным и правильнее написать double.

3) Полезно почитать книгу Керниган Б.В. и Ричи Д.М. -Язык C

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

активирована поддержка float?
вероятно не активирована, не работает, по итогу привёл к инту и пользовал эти флоуты так, в конце концов пока что дробная часть не актуальна

2) В вашем компиляторе float может оказаться 16-битным и правильнее написать double.
дабл постигла та же участь

1) Формирование строки сделайте с помощью sprintf, а выдачу строки - с помощью printf.

3) Полезно почитать книгу Керниган Б.В. и Ричи Д.М. -Язык C

попробую

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При таком заполнении flоat-переменной

union { float fVal; unsigned char bytes[4]; } value;
value.bytes[0] = data[4];
value.bytes[1] = data[3];
value.bytes[2] = data[6];
value.bytes[3] = data[5];

может оказаться, что вы записали в него "нечисло". Т.к. далеко не любая комбинация битов является валидным значением float.

А бедняга printf начинает конверировать инвалидное число в десятичное и сходит с ума :).

Мой совет: ... потренируйтесь на нулях :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

может оказаться, что вы записали в него "нечисло". Т.к. далеко не любая комбинация битов является валидным значением float.

А бедняга printf начинает конверировать инвалидное число в десятичное и сходит с ума smile.gif.

Мой совет: ... потренируйтесь на нулях smile.gif

не сцать - записываю число, ибо после приведения к инту получаю правильное число без дробной части
Изменено пользователем andybeg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Каким образом первоначально формируются эти четыре байта ?

2. Порядок следования байт (little/big) endian, не ?

3. Тема целевой платформы, на которой происходит выполнение не раскрыта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Каким образом первоначально формируются эти четыре байта ?
MODBUS и ещё раз повторюсь - разбираю я их верно

 

3. Тема целевой платформы, на которой происходит выполнение не раскрыта.
а тема нет? никак не названа?
Изменено пользователем andybeg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про тему пардон, в шары долблюсь.

 

Верно - это как ? Они из каких данных составляются, в коде покажите. Ну и опять же на АРМе порядок следования байт может быть любым. Он одинаков на обоих сторонах модбаса ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

верно это так что с ttyS имею протокол модбас и входящую посылку <01><03><04><D1><C7><47><81><81><62> где болдом обозначены байты данных, они запихиваются в массив data c которым проводятся выше опсанные манипуляции и по итогу печатаем printf("\n float = %d \n", (unsigned int)fl); получая на выходе верное число без дробной части, а при чистом флоуте printf("\n float = %lf \n",fl); программа вылетает

Изменено пользователем andybeg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

value.bytes[0] = data[4];

value.bytes[1] = data[3];

value.bytes[2] = data[6];

value.bytes[3] = data[5];

 

Как-то приходилось работать с одним тепловычислителем, так там честно говорили что протокол modbus-подобный и float передавались с порядком байт little-endian друг за другом:

 

value.bytes[0] = data[3];

value.bytes[1] = data[4];

value.bytes[2] = data[5];

value.bytes[3] = data[6];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...