A la vista de este código
void USART_add_to_buffer(char c){
USART_buffer[USART_nextRec++]=c;
if(USART_nextRec==bytes_for_USART_buffer){
USART_nextRec=0;
}
if(c==end_of_transmit){
--USART_nextRec;
if(USART_buffer[USART_nextRec-3]==WhatAmI){
if(USART_buffer[USART_nextRec-2]==WhoAmI){
if(USART_buffer[USART_nextRec-1]==Command_Execute){
Command=0x01;
}
}
}
USART_nextRec = 0;
}
}
Fijaos que lo primero que se ejecuta es exactamente la asignación de
c en
USART_buffer y el incremento posterior de
USART_nextRec. Cualquier instrucción posterior debe tener en cuenta este hecho.
Así al recibir la trama
R1X! ocurre lo siguiente ...
USART_nextRec vale
0.
Se recibe
R.
Se guarda
R en
USART_buffer[0] y se incrementa
USART_nextRec.
USART_nextRec vale
1.
Como
c no es
! (definido como
end_of_transmit) no hacemos nada mas.
...
Se recibe
1.
Se guarda
1 en
USART_buffer[1] y se incrementa
USART_nextRec.
USART_nextRec vale
2.
Como
c no es
! (definido como
end_of_transmit) no hacemos nada mas.
...
Se recibe
X.
Se guarda
X en USART_buffer[2] y se incrementa
USART_nextRec.
USART_nextRec vale
3.
Como
c no es
! (definido como
end_of_transmit) no hacemos nada mas.
...
Se recibe
!.
Se guarda
! en USART_buffer[0] y se incrementa
USART_nextRec.
USART_nextRec vale
4.
Como
c si es
! (definido como
end_of_transmit) ejecutamos el interior de
if(c==end_of_transmit) que es este caso ya es cierto.
El estado al entrar dentro de este if es el descrito anteriormente como
USART_buffer[0]=R
USART_buffer[1]=1
USART_buffer[2]=X
USART_buffer[3]=! end_of_transmit
y
USART_nextRec vale
4.
Y entonces lo primero que hago es decrementar en 1 el contenido de
USART_nextRec con
--USART_nextRec para que las comparaciones siguientes tengan sentido.
Con
--USART_nextRec el valor de
USART_nextRec es
3.
Y así los siguientes If's indican:
if(USART_buffer[USART_nextRec-3]==WhatAmI) es lo mismo que
if(USART_buffer[0]==WhatAmI)if(USART_buffer[USART_nextRec-2]==WhoAmI) es lo mismo que
if(USART_buffer[1]==WhoAmI)if(USART_buffer[USART_nextRec-1]==Command_Execute) es lo mismo que
if(USART_buffer[2]==Command_Execute)Si estos tres If's encadenados son verdad entonces se cambia la variable
Command asignándole el valor
1 para que surta lo efectos a que sea menester.
En cualquier caso, y tras haber recibido
! (end_of_transmit) se vuelve a inicializar a
0 el valor de
USART_nextRec para que la siguiente recepción vuelva a comenzar por
USART_buffer[0].
Esta es la descripción, paso a paso, de este código.
Un saludo.