我正在使用 ATmega128,我需要两个串行端口进行通信。我一直在使用“stdio.h”头文件中的 printf 通过 USART 0 发送数据。我还需要通过 USART 1 向 lcd 发送数据,我对使用格式化输入功能感到好奇。我一直认为将相同的 printf 函数连接到 USART 1 和 USART 0 会使编译器感到困惑,所以我没有尝试过。
谁能建议如何让另一个 printf 说“Lprintf”通过 USART 1 发送数据?
我正在使用 ATmega128,我需要两个串行端口进行通信。我一直在使用“stdio.h”头文件中的 printf 通过 USART 0 发送数据。我还需要通过 USART 1 向 lcd 发送数据,我对使用格式化输入功能感到好奇。我一直认为将相同的 printf 函数连接到 USART 1 和 USART 0 会使编译器感到困惑,所以我没有尝试过。
谁能建议如何让另一个 printf 说“Lprintf”通过 USART 1 发送数据?
您在这里要做的是使用fprintf()
. 有关该功能,请参阅 avr-libc 上的文档。本质上,您希望fputc()
为 UART1 提供一个功能,为 UART0 提供一个功能。然后,基于此,您可以创建两个FILE
缓冲区。一旦你这样做了,你就可以自由地使用fprintf()
每一个。或者,您可以指向stdout
这些缓冲区之一,以便能够使用printf()
.
FILE uart1_out = FDEV_SETUP_STREAM(uart1_putc, 0, _FDEV_SETUP_WRITE);
FILE uart0_out = FDEV_SETUP_STREAM(uart0_putc, 0, _FDEV_SETUP_WRITE);
fprintf(&uart1_out, "printing to UART1");
fprintf(&uart0_out, "printing %d to UART0", 0);
stdout = &uart1_out;
stderr = &uart0_out;
printf("This string will be printed thru UART1");
fprintf(stderr, "This string will be printed thru UART0");
您只需要根据需要提供实现int uart1_putc(int, FILE*)
和int uart0_putc(int, FILE*)
操作数据。
希望这可以帮助。
干杯。