到目前为止,我已经能够通过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
答案 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次浮点乘法。始终将它保存在您的掌中