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

C 如何通过串口打印浮点?,c,atmega,C,Atmega,到目前为止,我能够通过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_se

到目前为止,我能够通过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);
    }
}
void主管道(void)
{
/*很好*/
int16_t a=132;
字符数据[100]={0};
sprintf(数据,“%”PRId16,a);
Liburat_send(“a:”,strlen(“a:”);
libuart_send(数据,strlen(数据));//工作正常
/*下面的代码不起作用*/
双l_数据=132.34;
字符数据[100]={0};
sprintf(数据,“%f”,l_数据);
Liburat_send(“f:”,strlen(“f:”);
libuart_send(数据,strlen(数据));//不工作
}
void libuart_send(void*p_数据,int p_数据大小)
{
断言(p_数据!=NULL);
断言(p_数据大小>0);
对于(int i=0;i而(!(UCSR0A&(1由于函数的大小,AVR端口默认情况下不链接任何浮点支持(顺便说一句,还有许多ARM实现)。请记住,浮点数学支持+printf浮点可能会占用多达15k的32k程序内存

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

-Wl,-u,vfprintf-lprintf\u flt-lm
,它将进行打印

顺便说一句,尽量避免浮点数。下面是乘法运算基准表(结果以循环为单位)

uint8 22

uint16 98

uint32 102

int8 22

int16 92

int32 108

浮动2986


在1MHz上,与10000 int32相比,每秒只能执行300次浮点乘法。始终将其放在maind中

我们不知道libuart\u send
在做什么(UDR0是什么?)。您应该向我们提供一些。请注意,根据C11标准,
main
应返回一个
int
。因此您的代码不是用标准、托管、C11编写的(甚至不应编译)。可能您的嵌入式设备不支持将
float
传递到
sprintf
?可能需要您链接一个浮点支持库才能工作。请查看您的平台文档。@BasileStarynkevitch请参阅update@DavidSchwartz我已经链接到了-lprintf_flt,但这并没有改变任何事情为什么占用这么多空间?因为它是非常复杂的函数。