如何通过串行打印浮点数?
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 次浮点乘法。时刻关注它
到目前为止,我可以通过 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 次浮点乘法。时刻关注它