Как создать printf с немного другим именем

Я использую ATmega128, и мне нужно два последовательных порта для связи. Я использую printf из заголовочного файла "stdio.h" для отправки данных через USART 0. Мне также нужно отправлять данные через USART 1 на ЖК-дисплей, и мне интересно использовать функцию форматированного ввода. Я думал, что подключение одной и той же функции printf к USART 1 и USART 0 сбивает компилятор с толку, поэтому я не пробовал.

Кто-нибудь может подсказать, как заставить другой printf сказать "Lprintf" для отправки данных через USART 1??


person avr_rookie    schedule 18.01.2014    source источник


Ответы (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*), чтобы манипулировать данными по своему усмотрению.

Надеюсь это поможет.

Ваше здоровье.

person TRON    schedule 19.01.2014

В зависимости от того, как вы его связали, есть две альтернативы, которые, возможно, проще:

  1. Используйте sprintf(), чтобы записать отформатированный текст в строку, а затем используйте свои собственные putchar() или putstring(), чтобы отправить его на нужный USART.

  2. Если для связывания вашего USART к функциям stdio (вероятно), вы можете использовать fprintf() для направления результатов в конкретный поток.

person skyrift    schedule 19.01.2014