En lugar de enviar secuencialmente los datos via serial deberias enviar un string de caracteres y luego simplemente deberas almacenarlo en un array para luego procesarlo. Para ello seria conveniente que definas una estructura de la trama que enviaras desde la PC hacia tu micro.
Una estructura de trama podria ser el siguiente:
ID_trama;Dir_origen;Dir_destino;dato;chk
Donde:
ID_trama seria un caracter ASCII : 1byte
Dir_origen codificado en HEX en formato ASCII: cantidad de bytes requeridos asi para enviar la dir 0xF0 se necesitan 4 bytes
Dir_destino codificado en HEX en formato ASCII: cantidad de bytes requeridos asi para enviar la dir 0xF00 se necesitan 5 bytes
dato: de acuerdo a que quieras enviar aqui puede ser variable desde 1 byte hasta n (n un numero suficiente de acuerdo a las necesidades)
chk: es opcional, es un checksum para control de errores. Obviamente requerira un procesamiento adicional.
; : el punto y coma es un separador de campos, de esta forma se facilita la identificacion de los campos y posterior procesam.
Un ejem de trama seria:
C;0xFE;0XED;hola;1F
De esta forma tienes una cadena con 19 caracteres. Puedes delimitar tu proyecto a 32 caracteres como máximo.
Bueno en CCS escribirias algo asi:
#include "C:\Documents and Settings\usuario\Mis documentos\Montes\18F252\final3\final3.h"
#include <KBD.C>
#include <24256.C>
#include <STDLIB.H>
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,restart_wdt)
#define Lon_Trama 32
char Buffer_Rx[Lon_Trama];static int reloj,Tiempo_testeobat;
static int TIME_APAGADO;
*
* Hay otra varibles declaradas
*
#int_RTCC
RTCC_isr()
{
reloj++;
Tiempo_testeobat++;
TIME_APAGADO++;
}
//******************************************************************************
#int_RDA //cuando llega un dato habilito band_rx y capturo el dato
RDA_isr()
{
gets(Buffer_Rx);
bandera_rxdato=true;
} *
*
void salida()
{
//if(bandera_rxdato==true) seria mejor consultar dentro del main puesto asi no necesitarias realizar la llamada a la funcion
// { bandera_rxdato=false; // aqui debes de limpiar tu bandera para que puedas ingresar la proxima vez// En lugar de realizar if anidados seria mejor usar un switch-case
// Tb una vez desparseado tu trama en cada campo los valores ascii de las direcciones deberas convertirlos en valores enteros
// Utiliza para ello la funcion atoi()....espero esto t sirva if(var==1)
{
if(rxdato==0xf0)//si es f0 es la direccion del hand
{
destino=rxdato;
bandera_rxdato=false;
}
else //si no salgo
{
rxdato=0;
bandera_rxdato=false;
var=0;
bandera_conv==true;
}
}
if(var==2)
{
origen=rxdato;
bandera_rxdato=false;
}
if(var==3)
{
comando=rxdato;
bandera_rxdato=false;
}
if(var==4)
{
dir_a=rxdato;
bandera_rxdato=false;
}
if(var==5)
{
dir_b=rxdato;
bandera_rxdato=false;
}
if(var==6)
{
contador=rxdato;
bandera_rxdato=false;
}
if(var==7)
{
valor=rxdato;
bandera_rxdato=false;
var=0;
Termino_salida=true;
bandera_conv=true;
}
// }
return ;
}
*
*
void main()
{
port_b_pullups(TRUE);
SET_TRIS_A(0x01);//10000 22/06/07
SET_TRIS_C(0x00);
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
//setup_adc_ports(NO_ANALOGS);
//setup_adc(ADC_OFF);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_RDA); Interrupcion recepcion rs232
enable_interrupts(GLOBAL);
init_ext_eeprom();
//kbd_init();
*
*
*
while (TRUE) // si no colocas dentro de un bucle infinito una vez terminada la ultima linea de tu funcion main () tu micro se queda sin hacer mas nada....o es eso lo que deseas ?
{
if(bandera_rxdato==true)
salida();
//****** tu codigo restante
}}
Espero te sirva...
Saludos