1

我正在使用 ATmega128,我需要两个串行端口进行通信。我一直在使用“stdio.h”头文件中的 printf 通过 USART 0 发送数据。我还需要通过 USART 1 向 lcd 发送数据,我对使用格式化输入功能感到好奇。我一直认为将相同的 printf 函数连接到 USART 1 和 USART 0 会使编译器感到困惑,所以我没有尝试过。

谁能建议如何让另一个 printf 说“Lprintf”通过 USART 1 发送数据?

4

2 回答 2

2

您在这里要做的是使用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*)操作数据。

希望这可以帮助。

干杯。

于 2014-01-19T17:36:40.313 回答
0

根据您链接它的方式,有两种可能更简单的替代方案:

  1. 用于sprintf()将您的格式化文本写入字符串,然后使用您自己的putchar()putstring()将其发送到所需的 USART。

  2. 如果您使用FILEstruct 将 USART 链接到 stdio 函数(可能),您可以使用fprintf()将结果定向到特定流。

于 2014-01-19T02:38:40.120 回答