📄 avrmicrocontrollerintputoutputanalysis.txt
字号:
#include <stdio.h>
static int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,_FDEV_SETUP_WRITE);
static int uart_putchar(char c, FILE *stream)
{
if (c == ’\n’)
uart_putchar(’\r’, stream);
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return 0;
}
int main(void)
{
init_uart();
stdout = &mystdout;
printf("Hello, world!\n");
return 0;
}
在默认情况下,fdevopen 以及浮点数转换的printf和scanf 都需要动态内存分配(malloc),
这将连接动态内存分配模块,导致代码膨胀,如果系统中不使用浮点数转换,通过使用上面
的方法连接设备可以避免连接动态内存分配模块,这对于资源有限的单片机系统是难得的。
替代 fdevopen 函数的是宏FDEV_SETUP_STREAM ,它将初始化一个标准的i/o 对象(上
例中为mystdout),由于这个对象是用户定义的变量,固然无需动态分配内存。FILE 是标准
I/O 流使用的数据结构,stdin,stdout,stderr 均为指向FILE 结构的指针。正如上面的main 函
数中那样标准流对象stdout 指向用户定义的流对象数据结构后printf 可以正常使用了。此时
不能用fclose 关闭,如果需要关闭的话使用fdev_close.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -