Diseño de lógica Rx ISR de comunicación serie

1

Si no estoy equivocado, se supone que un ISR debe realizar un procesamiento mínimo cuando recibe datos en serie (a través de UART). Estoy planeando implementar un protocolo de este tipo para la comunicación entre 2 sistemas a través de uart. Esta es una situación aproximada de cómo planeo la codificación del ISR. Supongamos 2 sistema A & B donde A está enviando un mensaje a B: La palabra clave se utiliza para indicar el inicio del mensaje (los datos establecidos / longitud no pueden ser la palabra clave). ChannelOK, longitud de datos, RxLength, RxData, paquete recibido indicador en el proceso de B son por defecto 0.Length de datos = no. de (todos los datos) en bytes (por ejemplo, si todos los datos = 1, longitud de los datos = 1)

A's Process                               
 Send Keyword
 Send Length of data
 Send all data                

B's Process
 Rx Interrupt
 enter ISR
 ISR: if(Received Byte == Keyword && !ChannelOK)
      {
        Set ChannelOK 
      }

      if(ChannelOK && RxLength)
      {
       Set Length of data=received byte 
       ChannelOK=0
       RxLength=0
      }

      if(Length of data != 0 && RxData)
      {
        Store Data
        --Length of data
        if(Length of data==0)
        {
         Set Packet received flag
         RxData=0
        }
      } 

      if(ChannelOK)
      {
       Set RxLength
      } 

      if(Length of data)
      {
       Set RxData
      }
     Reset to Interrupt Again

Mi duda es: B tiene tantas cosas que hacer en el ISR mientras que A envía continuamente. Asumiendo que A envía datos a 7.5Mbps (11 bits por transferencia), el ISR tiene que restablecer la interrupción cada vez (11 / 7.5M) segundos. Esto parece muy muy pequeño. Los datos se perderán si no puedo restablecer la interrupción a tiempo o si se almacenará en la FIFO de 16 bytes, de modo que se pueda activar una interrupción de inmediato, la segunda vez que se reinicie la interrupción o si debo frenar un proceso de Tx esperando un ACK para cada byte (se ralentiza mucho) ???

Soy un novato en ISR's. Por favor, ayuda Cualquier diseño o protocolo ISR para la comunicación de datos en serie sería útil

Gracias

    

2 respuestas

1

Le propondré un método que le puede resultar útil con algunas modificaciones que se adapten a sus necesidades.

En este método, el ISR es tan pequeño que solo guarda los datos en una matriz para su posterior decodificación en el programa principal, se utilizan dos contadores para detectar los datos recibidos y los datos decodificados. Por supuesto, puede utilizar el puntero en lugar de los contadores.

   ISR:
 { 
    Receivedbytes[i++]= Rxbuffer;
    dataReceived++;
    }

    main:

    void UARTdecode{

    if (dataDecoded<dataRecived)
    {
    Received byte = Receivedbytes[j++];
    ///// where routine 
    if(Received Byte == Keyword && !ChannelOK)
          {
            Set ChannelOK 
          }
    ..
    ..
    ..
    //// end of routine 

    dataDecoded+=x; (where x is the amount of data decoded or message length)
    }

    }

P.S: Es MUY IMPORTANTE que i y j se declaren como variables estáticas

También puede consultar el código fuente de la biblioteca serial del hardware arduino, es de código abierto y utiliza ISR para recibir los datos "HardwareSerial.h" en el directorio de instalación

    
respondido por el ElectronS
2
B tiene tantas cosas que hacer en el ISR

No, al menos no si diseña correctamente el sistema. Mantendría cualquier lógica de decodificación fuera del ISR. Por lo general, mi controlador de interrupciones UART toma el byte del hardware, borra la condición de interrupción y rellena el byte en un FIFO. El código de primer plano puede tomarlo desde allí. Haga que el FIFO sea lo suficientemente grande como para que el código de primer plano pueda ejecutarse en ráfagas y el FIFO no se desborde entre ráfagas.

Si hay demasiado que hacer por byte, entonces tiene un problema fundamental que el firmware no puede solucionar. Necesita un procesador más rápido o una comunicación más lenta.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas