¿Cómo usar los datos de UART rx de ISR al bucle principal?

1

Estoy usando PIC18F y actualmente intento conectarlo con SIM900. Estoy usando la interrupción UART Rx. ISR está funcionando correctamente, pero me pregunto cómo obtener datos en el ciclo principal. Digamos:

#pragma interrupt hi_prioriint
void hi_prioriint(void)
{
   if(PIR1bits.RCIF==1)
   {
      Rx = ReadUSART();  //store the received byte in Rx
   }
 }

Ahora quiero usar Rx en el ciclo principal. Por ejemplo, si envío el comando AT , necesito verificar si recibí OK o ERROR de SIM900. (Por el momento solo lo estoy probando con un solo byte y lo convertiré más tarde en cadenas de recepción porque la respuesta del SIM900 es en forma de cadena)

Ejemplo:

 putrsUSART("AT\r");        //sending AT command
 delay(500)                 //delay of 500ms
 if(strcmp(Rx,"OK")==0)     //checking the response
 {
    //if received OK then proceed further
 }

Entonces, ¿cómo usar los datos de RX de ISR en el bucle principal?

    
pregunta S Andrew

2 respuestas

8

La forma convencional de hacer esto es usar un búfer circular (a veces también denominado cola circular). La rutina de interrupción de Rx inserta bytes de datos recibidos en la cola usando su puntero / índice de entrada. El código de la línea principal utiliza el puntero / índice de salida para extraer los datos de la cola.

La gran ventaja de este procedimiento es que permite que los datos de Rx lleguen a ráfagas que pueden llegar más rápido de lo que puede consumir el bucle de la línea principal debido a la latencia en otras tareas. Mientras la profundidad de la cola sea suficiente y el código de la línea principal pueda consumir los datos de Rx al menos tan rápido como el flujo de datos a largo plazo, este es el camino a seguir.

Tenga en cuenta que existe una gran cantidad de información en línea sobre el diseño, la codificación y el funcionamiento de las colas circulares. Una sugerencia es que puede haber una mejora de rendimiento en el uso de colas circulares si la profundidad de la cola se mantiene a una potencia uniforme de dos bytes. Una vez hecho esto, el ajuste del índice de la cola de arriba a abajo de la cola puede convertirse en una máscara simple del índice con un valor de (profundidad de la cola - 1).

    
respondido por el Michael Karas
0

Una alternativa es, en la interrupción de RX, almacenar los caracteres recibidos en un búfer volátil, incrementando un puntero en cada recepción. Cuando se recibe un carácter CR / LF, establezca un bit de marca global "recibir completado" y reinicie el puntero. Encuesta esta "recibir completa" en el bucle principal. Cuando el remitente termina en un CR / LF, el bucle principal puede leer el búfer lleno.

    
respondido por el rdtsc

Lea otras preguntas en las etiquetas