Как распечатать поплавок через серийный номер? - PullRequest
0 голосов
/ 23 января 2019

Пока я могу отправлять строки, числа и т. Д. Через uart. Приведенный ниже код выполняется на встроенном устройстве (atmega328p) и отправляет данные на мой ноутбук, на котором работает шпаклевка:

void main(void)
{
    /* Works fine */
    int16_t a = 132;
    char data[100] = {0};

    sprintf(data, "%"PRId16, a);
    libuart_send("a: ", strlen("a: "));  
    libuart_send(data, strlen(data)); //works fine

    /* Below doesn't work */
    double l_data = 132.34;
    char data[100] = {0};

    sprintf(data, "%f", l_data);
    libuart_send("f: ", strlen("f: "));  
    libuart_send(data, strlen(data)); //doesnt work
}

void libuart_send(void *p_data, int p_data_size)
{
    assert(p_data != NULL);
    assert(p_data_size > 0);

    for(int i = 0; i < p_data_size; i++)
    {
        /* Wait for empty transmit buffer. */
        while ( !( UCSR0A & (1<<UDRE0)) );

        /* Put data into buffer, sends the data. */
        UDR0 = *(((signed char*)(p_data)) + i);
    }
}

При отправке float на мой терминал замазки вместо фактического значения float отображается знак вопроса. Почему?

Спасибо

РЕДАКТИРОВАТЬ: Это PDF-версия таблицы данных, которая объясняет, что помимо прочего делает UDR0 (см. Стр. 195/452): https://www.sparkfun.com/datasheets/Components/SMD/ATMega328.pdf

1 Ответ

0 голосов
/ 23 января 2019

Порт AVR по умолчанию не связывает какую-либо поддержку с плавающей точкой (кстати, многие реализации ARM) из-за размера функций. Помните, что поддержка float math + printf float может занять до 15 КБ памяти вашей программы 32 КБ !!

Вам необходимо добавить правильные параметры для печати чисел с плавающей точкой.

-Wl,-u,vfprintf -lprintf_flt -lm и он напечатает.

Кстати, старайтесь избегать поплавков как табличка. Ниже у вас есть таблица с тестом операции умножения (результаты в циклах)

uint8 22 * ​​1011 *

uint16 98

uint32 102

int8 22 * ​​1017 *

int16 92

int32 108

float 2986

на 1 МГц вы можете выполнять только 300 умножений с плавающей запятой в секунду по сравнению с 10000 int32. Имейте это всегда в своей голове

...