Ну..... кое что у меня заработало.
Суть проблемы.
По умолчанию библиотека stdio.h заточена под 3 потока. (stdin, stdout, stderr). И следовательно для двухстороннего общения по 2 UART этого мало.
Что сделал чтобы заработало.
Файл stdio.h запрещен к изменению так как является частью среды разработки. Я сохранил копию файла stdio.h и добавил в свой проект под новым именем stdio_dual.h. Во всем проекте заменил stdio.h на stdio_dual.h. И внес в файл следующие изменения:
Добавил 2 строчки
Код:
//Было
#define stdin (__iob[0])
#define stdout (__iob[1])
#define stderr (__iob[2])
//Добавил
#define stdinsoft (__iob[3])
#define stdoutsoft (__iob[4])
Теперь спокойно можно организовать прием и передачу по 2 интерфейсам
Код:
static FILE uart = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
static FILE Soft_uart = FDEV_SETUP_STREAM(Soft_uart_putchar, Soft_uart_getchar, _FDEV_SETUP_RW);
stdin=stdout=&uart;
stdinsoft=stdoutsoft=&Soft_uart;
Как читать и писать в порт
Код:
fscanf(stdin,"%s",&StringUART);
fprintf(stdout,"USART = %s\n",StringUART);
fscanf(stdinsoft,"%s",&StringUART);
fprintf(stdoutsoft,"Soft_USART = %s\n",StringUART);
Подводные камни:
Компилятор не мог найти эти переменные: stdinsoft и stdoutsoft. Мне пришлось их продублировать в main.h. Спустя некоторое время я решил их закомментировать и компилятор ругаться по новой не стал. При этом все продолжило работать.
PS/ К сожалению пока тест проводился только на одном аппаратном UART. И частично на программном UART (Пока не могу добиться стабильной работы).