C 如何通过串口打印浮点?
到目前为止,我能够通过uart发送字符串、数字等。下面的代码在嵌入式设备(atmega328p)上运行,并将数据发送到运行putty的笔记本电脑: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
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,但这并没有改变任何事情为什么占用这么多空间?因为它是非常复杂的函数。