Я бы сделал реализацию кольцевого FIFO-буфера. Создал бы два экземпляра - на прием и на передачу.
Далее все просто:
1. При приеме символов из UART1 помещал бы их в первый буфер.
2. При приеме символов из UART2 помещал бы их во второй буфер.
3. При наличии символов в первом буфере и готовности передатчика UART2 выбирал бы их оттуда и записывал в UART2.
4. При наличии символов во втором буфере и готовности передатчика UART1 выбирал бы их оттуда и записывал в UART1.
Пример реализации кольцевого FIFO-буфера:
CODE
//-----------------------------------------------------------------------------
// void sp_tx_push(sSERIAL_PORT *port, const BYTE x)
//-----------------------------------------------------------------------------
void sp_tx_push(sSERIAL_PORT *port, const BYTE x)
{
int tmp_t;
port->tx_buf[port->tx_t] = x;
tmp_t = port->tx_t + 1;
if(tmp_t >= port->tx_size) tmp_t -= port->tx_size;
if(tmp_t != port->tx_b) port->tx_t = tmp_t;
}
//-----------------------------------------------------------------------------
// BYTE sp_tx_pop(sSERIAL_PORT *port)
//-----------------------------------------------------------------------------
BYTE sp_tx_pop(sSERIAL_PORT *port)
{
BYTE x;
if(port->tx_b == port->tx_t) return 0;
x = port->tx_buf[port->tx_b];
port->tx_buf[port->tx_b++] = 0;
if(port->tx_b >= port->tx_size) port->tx_b -= port->tx_size;
return x;
}
Опрос флагов UART, запись и чтение регистра данных UART, инициализация UART - тривиально.