Cuando entra un caracter se genera la interrupción, se ejecuta el código que tienes dentro de la interrupción e inmediatamente sale de la interrupción, esto lo hace automático, hasta que llegue un nuevo caracter
No puedes definir la variable posicion_sms dentro de la interrupción, porque cada vez que entre un caracter se reinicia el contador, debes definirla por fuera de esta instancia
La variable flag se está siempre, sólo debería encenderse cuando llegue el dato correcto
Intenta hacer este ejercicio, debe funcionar y así comprenderás como puedes capturar los datos
#int_rda //Vector de interrupcion de la recepcion de datos
void interrupcion_rx() //por el usart
{
int respaldo;
respaldo = getc();
if(respaldo == '*')
{con_recepcion = 0; modo_recepcion = 0;}
dato_recibido[con_recepcion] = respaldo;
if(respaldo == '#')
{decodificar();}
con_recepcion++;
if(con_recepcion == 19)
{con_recepcion = 0;}
}
///////////////////////////////////////////////////////////////////////////////
void decodificar()
{
if(dato_recibido[1] == 'S' && dato_recibido[2] == 'I')
{
output_high(buzzer);
}
if(dato_recibido[1] == 'N' && dato_recibido[2] == 'O')
{
output_low(buzzer);
}
}
en la imagen está el esquema para elevar el voltajes con dos transistores