andybeg 0 21 июля, 2010 Опубликовано 21 июля, 2010 (изменено) · Жалоба пытаюсь конвертировать модбас данные во флоут 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); и на принтфе просто без ругани выкидывает из программы Изменено 21 июля, 2010 пользователем andybeg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Savrik 0 21 июля, 2010 Опубликовано 21 июля, 2010 · Жалоба Странно.. Код на первый взгляд без ошибок.. Попробуйте вместо data[х] присвоит какое-то значение, скажем, запишите туда единицы. И запустите Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andybeg 0 21 июля, 2010 Опубликовано 21 июля, 2010 · Жалоба попробовал ещё один вариант перевда во флоут 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); результат тот е, только теперь уж понятно что вылетет именно при выводе числа Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Savrik 0 21 июля, 2010 Опубликовано 21 июля, 2010 (изменено) · Жалоба мм.. даже не знаю.. На большом брате все работает, значит, трабл в железе.. компилируется без варнингов? Памяти досаточно? А вообще что-либо printf() выводит? Изменено 21 июля, 2010 пользователем Savrik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andybeg 0 22 июля, 2010 Опубликовано 22 июля, 2010 (изменено) · Жалоба варнинг то я и не заметил incompatible implicit declaration of built-in function ‘memcpy’ правда ворнинг появляется только во втором варианте кнвертации, в первом его естественно нет принтф печатает float = /> Изменено 22 июля, 2010 пользователем andybeg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 22 июля, 2010 Опубликовано 22 июля, 2010 · Жалоба А вы уверены, что в вашем варианте printf вообще активирована поддержка float? Попробуйте, для проверки: float vv = 123.567; printf("float = %f\n", vv); Работает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
etoja 0 22 июля, 2010 Опубликовано 22 июля, 2010 · Жалоба 1) Формирование строки сделайте с помощью sprintf, а выдачу строки - с помощью printf. 2) В вашем компиляторе float может оказаться 16-битным и правильнее написать double. 3) Полезно почитать книгу Керниган Б.В. и Ричи Д.М. -Язык C Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andybeg 0 22 июля, 2010 Опубликовано 22 июля, 2010 · Жалоба активирована поддержка float?вероятно не активирована, не работает, по итогу привёл к инту и пользовал эти флоуты так, в конце концов пока что дробная часть не актуальна 2) В вашем компиляторе float может оказаться 16-битным и правильнее написать double. дабл постигла та же участь 1) Формирование строки сделайте с помощью sprintf, а выдачу строки - с помощью printf. 3) Полезно почитать книгу Керниган Б.В. и Ричи Д.М. -Язык C попробую Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 45 22 июля, 2010 Опубликовано 22 июля, 2010 · Жалоба При таком заполнении 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 начинает конверировать инвалидное число в десятичное и сходит с ума :). Мой совет: ... потренируйтесь на нулях :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andybeg 0 23 июля, 2010 Опубликовано 23 июля, 2010 (изменено) · Жалоба может оказаться, что вы записали в него "нечисло". Т.к. далеко не любая комбинация битов является валидным значением float. А бедняга printf начинает конверировать инвалидное число в десятичное и сходит с ума smile.gif. Мой совет: ... потренируйтесь на нулях smile.gif не сцать - записываю число, ибо после приведения к инту получаю правильное число без дробной части Изменено 23 июля, 2010 пользователем andybeg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
forever failure 0 23 июля, 2010 Опубликовано 23 июля, 2010 · Жалоба 1. Каким образом первоначально формируются эти четыре байта ? 2. Порядок следования байт (little/big) endian, не ? 3. Тема целевой платформы, на которой происходит выполнение не раскрыта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andybeg 0 23 июля, 2010 Опубликовано 23 июля, 2010 (изменено) · Жалоба 1. Каким образом первоначально формируются эти четыре байта ?MODBUS и ещё раз повторюсь - разбираю я их верно 3. Тема целевой платформы, на которой происходит выполнение не раскрыта.а тема нет? никак не названа? Изменено 23 июля, 2010 пользователем andybeg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
forever failure 0 23 июля, 2010 Опубликовано 23 июля, 2010 · Жалоба Про тему пардон, в шары долблюсь. Верно - это как ? Они из каких данных составляются, в коде покажите. Ну и опять же на АРМе порядок следования байт может быть любым. Он одинаков на обоих сторонах модбаса ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andybeg 0 23 июля, 2010 Опубликовано 23 июля, 2010 (изменено) · Жалоба верно это так что с 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); программа вылетает Изменено 23 июля, 2010 пользователем andybeg Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 23 июля, 2010 Опубликовано 23 июля, 2010 · Жалоба 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]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться