如何创建名称略有不同的printf

时间:2014-01-18 07:15:12

标签: serial-port printf avr stdio usart

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

任何人都可以建议如何让另一个printf说“Lprintf”通过USART发送数据1 ??

2 个答案:

答案 0 :(得分:2)

您要在此处执行的操作是使用fprintf()。有关该功能,请参阅avr-libc上的文档。基本上,您希望UART1具有fputc()功能,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*)的实施,即可根据需要操作数据。

希望这有帮助。

干杯。

答案 1 :(得分:0)

根据您的链接方式,有两种选择可能更简单:

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

    < / LI>
  2. 如果您使用FILE结构将USART链接到stdio函数(可能),则可以使用fprintf()将结果定向到特定的流。