Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Float в MSP430
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
SofuS
Есть: контроллер MSP430F149. Контроллер передает по UART(через СОМ) данные, которые я принимаю на клиентской программе, написанной на С++. Данные на мк представлены в float. Если предварительно
библиотечной функ-ей на самом контроллере переводить данные из float в двоично-десятичные, то я принимаю корректные значения. Но время для обработки в контроллере критично и оч. желательно передавать сразу в float, как есть. Передавая float и принимая их сразу в C++ тоже как float ...я получаю не совсем то, что должно быть. Вопрос : TI-ский float как-то отличается от общепринятого (IEEE)?Или у меня ошибка в сишной проге и все должно работать верно? Если TI float отличается, то не поделитесь сцылками с описанием TI float -а.(сам не нашел). Заранее благодарен.
-=MISHA=-
Переменные типа float можно разложить на байты с помощью union.
Передать полученные 4 байта по uart-у на комп.
Затем, на компе, обратно собрать в переменную типа float.

Например:
Создаём такой тип:

typedef union {
float ft;
unsigned char bt[4];
}MyType;

Объявляем переменные:
MyType tmp;
float f;
unsigned char b[4];

Перед передачей раскладываем float на байты:

tmp.ft = f;
b[0] = tmp.bt[0];
b[1] = tmp.bt[1];
b[2] = tmp.bt[2];
b[3] = tmp.bt[3];

И теперь в uart кидаем полученные байты b[0],b[1],b[2],b[3]

На компе, по такому же принципу, получаем из 4-х байт float.
VAI
применяйте одинаковое выравнивание в программе для MSP и в программе на РС.
Про компилер от TI сказать ничего не могу, для MSP использую ИАР.
Для программ в контроллер и в РС используется один и тот-же заголовочный файл с описанием применяемых данных.

Описывать данные приблизительно так:
Перед описанием выравнивание делаете как надо, после - возвращаете назад.
Не делайте для MSP выравнивание по байтам (#pragma pack( 1 )) - код будет толстый и плохой
Код
/* -------------------------------------------------------------------------------------------------------- **
*  Директива "#pragma pack()" работает одинакого в "MSP430 IAR C/EC++ Compiler" и "Borland C++Builder" и "VC"
* -------------------------------------------------------------------------------------------------------- */
#pragma pack( 2 )     // выравнивание по 2-м байтам - используем это выравнивание, в MSP дает оптимальный код
// ДЛЯ ВСЕХ КОМПИЛЯТОРОВ!!! Если несколько char-ов подряд в структуре, то компилятор размещает char-ы компактно,
// с выравниванием по байтам, только последний нечетный выравнивает по словам!

#define flt_cnt   4                     // Количество каналов, обрабатываемых фильтром
#define bas_cnt   3                     // Количество основных каналовавтокоррекций и т.д.


typedef struct              // Константы, меняемые при регулировке
{ unsigned short    Firm_number;        // заводской номер прибора
  unsigned short    Firmware_ver;       // Версия программного обеспечения прибора (printf( "\fВерсия программного\nобеспечения: v %x.%02x", ( Firmware_ver >> 8 ), Firmware_ver & 0xff );)
  double            Ku[flt_cnt];       // чувствительность по всем каналам
  float             Pr_ekv;
  double            M_press;
  float             accuracy_gase[bas_cnt]; // округление при выводе
  float             auto_zero_val[bas_cnt];
  ser_io_koef       net_param;
  Temp_norma        T_norma;
  press_difference  Press_diff;
  FLAG              ini_flag;
} Flash_Constant;

#pragma pack()                          // выравнивание по умолчанию
SofuS
Спасибо большое VAI!!! поставил и там и там одинаковые директивы #pragma pack. ВСЕ работает как надо! Я сразу подумал, что нада как-то смещение (выравнивание) поменять, но не знал как. Есче раз благодарю за помощь!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.