План был такой: не отключать приёмник у драйвера 485, ловить эхо переданных символов, и по приёму последнего символа отключать передатчик.
Пишу:
Код
// прерывание по приёму.
void rx_interrupt(void)
{
if (is_tx_on()) // передатчик включен?
{
if (!tx_on_) // передача окончена?
tx_off(); // отключаем передатчик.
}
else // обычный приём.
{
RxBuf.put(RXBUF0);
}
}
// прерывание по передаче
void tx_interrupt(void)
{
if (TxBuf.is_empty())
{
tx_on_ = false;
}
else
TXBUF0 = TxBuf.get();
}
};
void rx_interrupt(void)
{
if (is_tx_on()) // передатчик включен?
{
if (!tx_on_) // передача окончена?
tx_off(); // отключаем передатчик.
}
else // обычный приём.
{
RxBuf.put(RXBUF0);
}
}
// прерывание по передаче
void tx_interrupt(void)
{
if (TxBuf.is_empty())
{
tx_on_ = false;
}
else
TXBUF0 = TxBuf.get();
}
};
Вроде бы всё логично. Сначала опустошается TXBUF0, возникает прерывание tx_interrupt, я сбрасываю флажок tx_on_. Затем этот последний символ принимается, возникает прерывание по приёму, я отключаю передатчик.
Но. Почему-то сначала возникает прерывание по приёму, а лишь затем - по опустошению передатчика! Как такое может быть?