如何通过串行打印浮点数?

How to print a float via serial?

到目前为止,我可以通过 uart 发送字符串、数字等。下面的代码在嵌入式设备 (atmega328p) 上运行,并将数据发送到运行 putty 的笔记本电脑:

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);
    }
}

将浮点数发送到我的 putty 终端时,我看到一个问号而不是实际的浮点值。为什么?

谢谢

编辑:这是数据表的 pdf 版本,其中解释了 UDR0 的作用(参见第 195/452 页):https://www.sparkfun.com/datasheets/Components/SMD/ATMega328.pdf

由于函数的大小,AVR 端口默认不 link 任何浮点数支持(顺便说一句,许多 ARM 实现也是如此)。请记住,浮点数学支持 + printf 浮点数可能会占用 32k 程序内存中的 15k!

您需要添加正确的选项来打印浮点数。

-Wl,-u,vfprintf -lprintf_flt -lm 它将打印。

顺便说一句,尽量避免将花车作为牌匾。下面是带有乘法运算基准的 table(循环结果)

uint8 22

uint16 98

uint32 102

int8 22

int16 92

int32 108

float 2986

与 10000 int32 相比,在 1MHz 上每秒只能执行 300 次浮点乘法。时刻关注它