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

时间:2019-01-23 05:53:37

标签: c atmega

到目前为止,我已经能够通过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);
    }
}

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

谢谢

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

1 个答案:

答案 0 :(得分:1)

由于功能的大小,默认情况下,AVR端口不链接任何浮动支持(也包括许多ARM实现)。请记住,浮点数数学支持+ printf浮点数可能会占用32k程序内存中的15k!

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

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

顺便说一句,尽量避免漂浮成斑块。下面是具有乘法运算基准(周期结果)的表

  

uint8 22

     

uint16 98

     

uint32 102

     

int8 22

     

int16 92

     

int32 108

     

浮动2986

在1MHz上,与10000 int32相比,每秒只能执行300次浮点乘法。始终将它保存在您的掌中