Codice:
#define Rx_BufferSize 32 //definisce dimensione buffer in 32 byte
//definizioni variabili
unsigned char U1RxBuff[Rx_BufferSize]; // buffer seriale
unsigned char U1RxPtrIn = 0; // indice bytes in ingresso catturati dall'interrupt
unsigned char U1RxPtrOut = 0; // indice byte in uscita letti dalla routine seriale
void _UARTRXInterrupt(void) // UART RX interrupt
{
_U1RXIF = 0; // interrupt flag reset
U1RxBuff[U1RxPtrIn] = ReadUART(); // legge il byte presente nella seriale. ReadUART() routine presente nella libreria C18
U1RxPtrIn ++; // avanza di un byte
if (U1RxPtrIn >= Rx_BufferSize)
U1RxPtrIn = 0; //se l'indice arriva al termine del buffer azzera e riparte dll'inizio
}
unsigned char BuffReadU1(void) //Routine che restituisce il primo byte memorizzato nel buffer
{
unsigned char c = 0;
c = U1RxBuff[U1RxPtrOut]; //Legge il buffer e mette il byte nella variabile c
++U1RxPtrOut; //avanza l'indice di un byte
if (U1RxPtrOut >= Rx_BufferSize) //Controlla la fine del buffer
U1RxPtrOut = 0;
return (c); //restituisce il byte letto
}
void UartRX(void) //Routine di ricezione seriale principale
{
if(U1RxPtrIn != U1RxPtrOut) //Controlla se gli indici sono diversi sono presenti nuovi dati nel buffer
data = BuffReadU1(); //legge il byte e lo mette nella variabile utente
}
Ecco il codice semplificato della routine del buffer, come dicevo prima, va riadattata al tuo codice, ma il concetto è lo stesso.
I dati ricevuti dall' uart vengono memorizzati nel buffer a scorrimento attraverso l'interrupt di ricezione.
Successivamente vengono prelevati dalla routine dell'utente da dentro il buffer, che intanto potra' memorizzare altri dati.
Il buffer è circolare, nel senso che quando arriva al termine, viene azzerato e riparte dell'inizio.
Ciao
Guido