Pues todo el codigo es mucho, os pego lo importante, si hay algo que creeis que debo poner avisarme:
Primero de todo los fuses y lo de la comunicacion:
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOWRT,NOLVP,NODEBUG,USBDIV,CPUDIV1,PLL2,VREGEN,NOPBADEN
#use delay(clock=48000000)
// el clock que tendremos a la entrada del CPU, en este caso 48MHZ
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
Ahora la interrupcion rda (igual os parece larga, pero cuando no se queda colgada va bien y no pierdo caracteres)
#int_rda
void serial_isr() {
/* Interrupcion de recepcion por puerto serie */
int i;
if(kbhit()) //Si hay algo pendiente de recibir
{
gets(cmd); //Leo el comando
tamanhoOrden=strlen(cmd);
if(tamanhoOrden>=longitudComando)
{
printf("CEOF%c",finRespuesta);
tamanhoOrden=0;
return;
}
for(i=0;i<=tamanhoOrden;i++) //Almaceno el comando en el buffer
{
bufferRecepcion[siguienteIN]=cmd;
siguienteIN++;
if(siguienteIN==longitudBuffer)
siguienteIN=0;
}
tamanhoOrden=0;
}
}
Esta funcion saca un comando del buffer y lo almacena en la variable comando:
void obtenerComando()
{
/* Saca un comando del buffer y actualiza el puntero siguienteOUT */
int i;
for(i=0;bufferRecepcion[siguienteOUT]!=finOrden;i++)
{
comando=bufferRecepcion[siguienteOUT];
siguienteOUT++;
if(siguienteOUT==longitudBuffer)
siguienteOUT=0;
}
comando=finOrden;
siguienteOUT=(siguienteOUT+1) % longitudBuffer;
}
Segun el comando recibido hace lo que sea: (por ahora no hacen nada util)
void procesarComando()
{
/* Ejecuta la accion asociada a un comando */
if(comando[0]=='c' && comando[1]=='o' && comando[2]=='n')
{
//comando de conexion: con
printf("ok%c",finRespuesta);
return;
}
if(comando[0]=='f' && comando[1]=='i' && comando[2]=='n')
{
//comando de desconexion: fin
seguir=0;
printf("ok%c",finRespuesta);
return;
}
//si recibimos un comando no conocido
printf("CMD_UNKOWN%c",finRespuesta);
}
Y el main en bucle:
while(seguir)
{
if(comRecibidoSerie) //Recibimos comando por RS232 //hay un define asi: #define comRecibidoSerie siguienteIN!=siguienteOUT //Flag que indica comando recibido por serie
{
obtenerComando(); //Obtenemos un comando del buffer
procesarComando(); //Lo procesamos
}
}
El funcionamiento es correcto, pero tarde o temprano se termina colgando (a veces tarda mucho). Cuando se cuelga (luz TXD del SIOW encendida seguida) lo que hago es cerrar el SIOW y volverlo a arrancar, en ese momento puedo seguir metiendo caracteres donde estaba....curioso
En cuanto a una colision, pues no se porque podria ser...no hago nada raro
Saludos y muchas gracias