Entonces para recibir 2 caracteres se me ocurrio esto, pero tengo que enviarle 2 veces el comando para que lo reconosca y cuando le pido que parpadee lo hace pero despues empieza con cosas raras, no quiere salir o se queda prendido.
Voy a intentar explicarte donde esta el error, a pesar que creo que ya te lo explique.
Cuando entra a la interrupcion es por que recibio 1 "un" solo caracter. ¿Por que tenes problemas? por el getch().
El getch es una funcion BLOQUEANTE, que quiere decir esto? te lo hago en un codigo para que lo entiendas:
Tu codigo:
Equivalente:
while(NoHayDato == 1) {}
c1 = DatoQueLLego
Basicamente es eso lo que tenes dentro del getch, es decir tenes un while, y que mientras no exista nada que llego se va a quedar ahi encerrado en ese while. Cuando llegue recien algo es cuando lo pone en c1 por ejemplo.
Ahora cuando es 1 solo no hay problema. Por que si recordas entra a la interrupcion cuando llega 1 dato. por lo tanto el primer getch SI o SI tiene dato, pero el segundo no! hasta que no le envies otro.
Si quisieras recibir de esa forma, es decir {A,B} Luego el bit {0-7} y Luego la accion {Z,X,P}, siendo Z de encendido, X de apagado, y P de parpadeo. Entonces haria una maquina de estado. Lo primero a recibir seria A o B para indicar el puerto. Una de las cosas que hice fue hacer que todos los comandos sean SI o SI de 3 letras.
char BufferEntrada[4]; // Buffer donde vamos a ir almacenando lo que va llegando
char BufferCopia[4]; // Buffer que es el que va a leer el main
char recibido; // Donde se va a guardar el char
bool DatoListo // Para indicarle al main que hay un dato
// Codigo de interrupcion:
switch(Estado)
{
case 0:
if (recibido=='A' || recibido == 'B')
{
Estado++;
BufferEntrada[0]=recibido;
}
break;
case 1:
if(recibido >= '0' && recibido <= '9')
{
Estado++
BufferEntrada[1] = recibido;
}
else
{
Estado = 0;
}
break;
case 2:
if(recibido == 'P' || recibido == 'Z' || recibido == 'X')
{
BufferCopia[2] = recibido;
BufferCopia[1] = BufferEntrada[1];
BufferCopia[0] = BufferEntrada[0];
DatoListo = true;
}
Estado = 0;
break;
default:
Estado = 0;
break;
// Codigo del main:
while(true)
{
if(DatoListo==true)
{
DatoListo= false;
// De ser mas puertos usar un switch en ves de ifs
if(BufferCopia[0] == 'A')
{
// Puerto A
// Aca seteo de parpadeo y
}
else
{
// Puerto B
}
}
}
// Codigo de interrupcion de timer
int_timer()
{
// Aca cada tanto verificar cual es el que debe hacerse parpadear y cambiarle el estado.
Te dejo la parte del main y la del timer para vos, es simple de realizarlo al menos en MPLAB, en CCS puede que se complique un poco mas.
Y para que entiendas, en el main cuando DatoListo se ponga a 1 o true, quiere decir que tenes los 3 caracteres en BufferCopia Y que eso no va a cambiar hasta que lleguen otros 3 caracteres mas, de los cuales obviamente son validos.
De recibir un caracter INVALIDO volveria al comienzo. Ejemplo A2F
Al recibir la F que seria un caracter "invalido" en el codigo que propusimos, no se queda esperando que uno lo corrija, es decir envie una P por ejemplo, sino que hay que enviar todo de vuelta "A2P",