|
printf("\n float = %f \n", value.fVal); выкидывает из программы, lpc2478 & uClinux |
|
|
|
Jul 21 2010, 15:44
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
пытаюсь конвертировать модбас данные во флоут Цитата 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 - Jul 21 2010, 16:15
|
|
|
|
|
Jul 21 2010, 19:04
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
попробовал ещё один вариант перевда во флоут Цитата 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); результат тот е, только теперь уж понятно что вылетет именно при выводе числа
|
|
|
|
|
Jul 22 2010, 01:56
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
варнинг то я и не заметил Цитата incompatible implicit declaration of built-in function ‘memcpy’ правда ворнинг появляется только во втором варианте кнвертации, в первом его естественно нет принтф печатает Цитата float = />
Сообщение отредактировал andybeg - Jul 22 2010, 02:05
|
|
|
|
|
Jul 22 2010, 05:55
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
А вы уверены, что в вашем варианте printf вообще активирована поддержка float? Попробуйте, для проверки: Код float vv = 123.567; printf("float = %f\n", vv); Работает?
|
|
|
|
|
Jul 22 2010, 18:47
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
Цитата активирована поддержка float? вероятно не активирована, не работает, по итогу привёл к инту и пользовал эти флоуты так, в конце концов пока что дробная часть не актуальна Цитата 2) В вашем компиляторе float может оказаться 16-битным и правильнее написать double. дабл постигла та же участь Цитата 1) Формирование строки сделайте с помощью sprintf, а выдачу строки - с помощью printf. 3) Полезно почитать книгу Керниган Б.В. и Ричи Д.М. -Язык C попробую
|
|
|
|
|
Jul 22 2010, 21:02
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
При таком заполнении 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 начинает конверировать инвалидное число в десятичное и сходит с ума  . Мой совет: ... потренируйтесь на нулях
|
|
|
|
|
Jul 23 2010, 01:58
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
Цитата может оказаться, что вы записали в него "нечисло". Т.к. далеко не любая комбинация битов является валидным значением float. А бедняга printf начинает конверировать инвалидное число в десятичное и сходит с ума smile.gif. Мой совет: ... потренируйтесь на нулях smile.gif не сцать - записываю число, ибо после приведения к инту получаю правильное число без дробной части
Сообщение отредактировал andybeg - Jul 23 2010, 01:59
|
|
|
|
|
Jul 23 2010, 04:49
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
Цитата 1. Каким образом первоначально формируются эти четыре байта ? MODBUS и ещё раз повторюсь - разбираю я их верно Цитата 3. Тема целевой платформы, на которой происходит выполнение не раскрыта. а тема нет? никак не названа?
Сообщение отредактировал andybeg - Jul 23 2010, 04:50
|
|
|
|
|
Jul 23 2010, 06:38
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(andybeg @ Jul 21 2010, 18:44)  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];
|
|
|
|
|
Jul 23 2010, 06:58
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
Цитата value.bytes[0] = data[3]; value.bytes[1] = data[4]; value.bytes[2] = data[5]; value.bytes[3] = data[6]; с модбасом вапще часто творят что хотят, канонически быйты идут в том порядке в котором сделано у меня
|
|
|
|
|
Jul 23 2010, 07:08
|
Частый гость
 
Группа: Участник
Сообщений: 133
Регистрация: 30-11-06
Пользователь №: 22 954

|
Цитата И: верность числа в чём заключается ? предлагаю закрыть тему неверного фрмирования флоута, провёл эксперимент Цитата vv=123.456; printf("\n int %d ",(unsigned int)(10*vv)); и на выходе получил 1234, думаю можно сделать вывод о том что проблемы именно с принтфом Цитата Пробую телепатировать: должно получится 66467.6, нет, не так ? именно так
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|