Идея правильная, вот пример кода который кочует из проекта в проект:
Код
struct {
volatile BYTE mode;
volatile WORD timeout;
volatile BYTE errc;
volatile WORD tx_cnt;
volatile WORD tx_len;
BYTE* tx_buf;
volatile WORD rx_cnt;
volatile WORD rx_len;
BYTE* rx_buf;
} UCB; //UART control block
SIGNAL(SIG_UART_RECV)
{
//wdt_reset();
SET_RX_BUSY;
UCB.timeout = 0;
UCB.rx_buf[UCB.rx_cnt] = UDR;
if(hRxProc) hRxProc();
UCB.rx_cnt++;
if(UCB.rx_cnt >= UCB.rx_len)
{
CLR_RX_BUSY;
if(hRxEnd) hRxEnd();
UCB.rx_cnt = 0;
}
}
Здесь:
SET_RX_BUSY - установка флажка занятости UART (пакет в процессе приема)
hRxProc() вызов функции для анализа пришедшего байта проинициализиоравна как NULL
hRxEnd() вызов функции обработки заполненного буфера.
BYTE* tx_buf,rx_buf указатели на объявленные глобально буфера.
Теперь самое интересное- UCB.timeout. Один из таймеров умеющий работать в режиме CTC,
настроен на генерацию миллисекунд, в его прерывании ин(де)крементируются счетчики задержек,
счетчики секунд и UCB.timeout который проверяеться либо в основном контексте либо в hRxProc(),
смотря по протоколу.
И последнее не надо складывать данные сразу в EEPPROM - он не вечен.