SerialEvent2() er ikke en interruptrutine. Den leses for hver runde i loop(). Det betyr at det er vanskelig å lese en datastrøm fra en GPS-enhet uten at noe av data går tapt dersom det er tidskrevende lesing av andre sensorer i programskissen. Under vises en iterruptrutine for UNO som kan brukes til å lese et tegn fra en GPS som bruker Serial2-porten, legge den i en buffer og gi en statusvariabel til loop()-rutinen når et linjeskift er påvist. loop()-rutinen kan da behandle GPS-strengen slik som man ønsker mens interruptrutinen fortsetter å samle data uavhenig av tid som brukes til å lese andre sensorer.
Her er de elementene som må legges til i programskissen for å lese tegn fra GPS-enheten med Serial2-porten.:
#define FOSC 160000//// Clock Speed
#define BAUD 4800
#define MYUBRR F_CPU/(16UL*BAUD)-1
void setup()
{
buf1.reserve(100);
gpsbuffer.reserve(100);
USART2_Init( MYUBRR); //GPS
}
void loop()
{
if (gps_ferdig==true)
{
Serial.println(gpsbuffer);
gps_ferdig=false;
}
else
{
// behandle andre sensorer
}
void USART2_Init( unsigned int ubrr){
// Set baud rate
UBRR2H = (unsigned char)(ubrr>>8);
UBRR2L = (unsigned char)ubrr;
// Enable receiver and transmitter
UCSR2B =(1<<RXEN2)|(1<<TXEN2)|(3<<6);
// Set frame format: 8data, 2stop bit
UCSR2C = (1<<USBS2)|(3<<UCSZ02);
}
ISR(USART2_RX_vect)
{
char c=char(UDR2);
if (int(c)==13)
{
// Serial.println(buf1.substring(0,6));
if (buf1.substring(0,6)=="$GPRMC")
{
gpsbuffer=buf1;
gps_ferdig=true;
}
buf1="";
}
else if ((int(c)!=10) && (int(c)!=13))
{
buf1 +=c;
//Serial.println(buf1);
}
}