Hola a todos!
Hace mucho que no andaba por estos lados. En fin, una vez mas quería que me pudiesen ayudar a mejorar un código que estoy implementando en CCS C.
Este código lo quiero depurar bn con ayuda de ustedes y luego pasarlo a una librería, para que se pueda manejar de mejor forma.
Es un código que recibe una trama proveniente del PC, la composición la pueden ver mas abajo.
Espero que me puedan echar una manito y sobre todo en la parte de poder transfórmala en una librería, si es que se puede . El código en si funciona de lo mas bien, y esta recontra probado, pero quiero más jijijiji
Bueno espero que me puedan ayudar en esto.
Saludos que estén bn.
recepcion serial:
//Programa de recepcion por el puerto serial
//autor: japifer_22
//Foro: TODOPIC
//Identidad de la trama a recepcionar:
//00$,000000,000000,000,000,000,000,00000000,00000000,00000000*000D
//| | | | | | | | | | | | |
//1 2 3 4 5 6 7 8 9 10 11 12 13
//
//N° | información | N°caracteres | Descripción
//---|-------------|--------------|----------------------------------------|
//01 |LF |2 |Salto de linea nueva |
//---|-------------|--------------|----------------------------------------|
//02 |$ |1 |Inicio de trama |
//---|-------------|--------------|----------------------------------------|
//03 |000000 |6 |ID de dispositovo que esta transmitiendo|
//---|-------------|--------------|----------------------------------------|
//04 |000000 |6 |ID del que recibe |
//---|-------------|--------------|----------------------------------------|
//05 |000 |3 |Numero de repetición de la misma trama |
//---|-------------|--------------|----------------------------------------|
//06 |000 |3 |Data 1, string de 3 caracteres |
//---|-------------|--------------|----------------------------------------|
//07 |000 |3 |Data 2, string de 3 caracteres |
//---|-------------|--------------|----------------------------------------|
//08 |000 |3 |Data 3, string de 3 caracteres |
//---|-------------|--------------|----------------------------------------|
//09 |00000000 |10 |Data 4, string de 8 caracteres |
//---|-------------|--------------|----------------------------------------|
//10 |00000000 |10 |Data 5, string de 8 caracteres |
//---|-------------|--------------|----------------------------------------|
//11 |00000000 |10 |Data 6, string de 8 caracteres |
//---|-------------|--------------|----------------------------------------|
//12 |*00 |3 |Checksum |
//---|-------------|--------------|----------------------------------------|
//13 |CR |2 |Retorno de carro |
//---|-------------|--------------|----------------------------------------|
//NN |, |9 |Separador de datos |
//---|-------------|--------------|----------------------------------------|
//NN | |58 |Numero total de caracteres en la trama |
//---|-------------|--------------|----------------------------------------|
///////////////////////////////////////////////////////////////////////////////
#include <16f877a.h> // PIC utilizado
#FUSES HS, NOPROTECT, NOPUT, NOBROWNOUT, NOWDT, NOCPD //ordenes para el PIC
#use delay (clock=20000000) //clock=20Mhz
#USE RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7, stream=RF) //
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int const Nstring=65; //Numero de caracteres que resive el string_UART1
int8 const LF=0x0A ; //Salto a linea nueva
int8 const CR=0x0D; //Retorno de carro
char ID_unidad[]="123456"; //ID propio del hardware
char string_RF[Nstring]; //string que almacena los datos que provienen de RS-232
int N_datos_RF; //indica la cantidad de datos que se almaceno en string_RF
int flag_checksum; //sirve para pasar al calculo del checksum cuando ingresa por la rs232 un CR
int flag_extraccion; //sirve para procesar el string_RF si es que esta todo bien en la funcion calculo_del_checksum...
//cantidad de comas, numeros de caracteres, ID de unidad y el checksum...
char ID1[7]={0},ID2[7]={0},RPT[4]={0}; //string de almacenamientos.......
char Datum1[4]={0},Datum2[4]={0},Datum3[4]={0};
char Datum4[9]={0},Datum5[9]={0},Datum6[9]={0};
//..................
void entrada_datos_RF(char data_in); //pre-procesamiento de los datos de entrada del puerto serial
void borrar_datos_RF(void); //borra los registros del string_RF mas el contador de caracteres N_datos_RF
void calculo_del_checksum(void); //verifica si la trama que a llegado esta correcta o no, y si es para este hardware
void extraer_datos_string_RF(void); //extrae los datos de la trama una vez verificado que este todo bien...
#int_RDA //interrupcion para la resepcion serial
void rda_isr()
{
char lectura_RF=0x00;
lectura_RF=fgetc(RF); //recoge los datos proveniente del puerto serial
if(lectura_RF !=0x00){ //si tenemos nuevo dato.....
entrada_datos_RF(lectura_RF); //lo envio a mi funcion de pre-procesamiento entrada_datos_RF
}
}
void entrada_datos_RF(char data_in){ //pre-procesamiento de los datos de entrada del puerto serial
switch (data_in) { //reviso que dato es el que a ingresado por el puerto serial y......
case LF: //identifico que es una linea nueva y......
//borrar_datos_RF(); //borro todo lo que pueda tener el string_RF, para dejar listo para usar.... (AQUI ME TIRA UN WARNING :( )
break;
case CR: //proceso los datos que se ingresaron a string_RF....
flag_checksum=1; //primero indicando que se tiene que ir a revisar si esta todo bien....
break;
default: //si no es una linea nueva ni el comando de procesamiento entonces.....
string_RF[N_datos_RF++]=data_in; //guardo todo lo que llega del puerto serial en string_RF
}
}
void borrar_datos_RF(void){
int c=0;
for(c=0;c<=Nstring;c++){ //recorro todoel string_RF y....
string_RF[c]=0x00; //pongo a cero todo
}
N_datos_RF=0; //reinicio el contador de caracteres.
}
void calculo_del_checksum(void){
flag_checksum=0;
int i,c,w,a,z;
int checksum;
char XOR[]=" ";
char XD[]=" ";
char address[7]={0};
for(checksum = 0 , z=0, a=0 ,w = 0, i = 0; i<N_datos_RF; i++){
c=(unsigned char)string_RF[i];
if(c=='*'){w=i;break;}
if(c!='$')checksum^=c; //calculo el checksum..
if(c==',')a++; //reviso la cantidad de ','
if(a==2 && string_RF[i] !=',' && z<6)address[z++]=string_RF[i]; //extraigo la ID del equipo..
}
XOR[0]=string_RF[w+1];XOR[1]=string_RF[w+2];
sprintf(XD,"%X",checksum);
if(strcmp(XD,XOR)==0 && a==9 && i==58 && strcmp(address,ID_unidad)==0)flag_extraccion=1; //el checksum esta bien¿?...la cantidad de separadores¿?...
else borrar_datos_RF(); //el numero de caracteres¿?... y la id del equipo¿?.....
//SI...entonces paso a extraer los datos del string_RF
//en casocontrario borro el string_RF y espero nueva trama
}
void extraer_datos_string_RF(void){
flag_extraccion=0;
int a,e;
char b;
for(a=0,e=0;a<N_datos_RF;a++){
b=(unsigned char)string_RF[a];
if(b=='*')break;
if(b==',')e++;
if(e==1 && string_RF[a] !=',')ID1[a-2]=string_RF[a]; //extraigo la ID del equipo que envia los comandos
if(e==2 && string_RF[a] !=',')ID2[a-9]=string_RF[a]; //extraigo la ID del equipo que recive los comandos
if(e==3 && string_RF[a] !=',')RPT[a-16]=string_RF[a]; //extraigo el numero de intento que se hace para comprobar conexion
if(e==4 && string_RF[a] !=',')Datum1[a-20]=string_RF[a]; //extraigo datos...
if(e==5 && string_RF[a] !=',')Datum2[a-24]=string_RF[a]; //de 3 digitos..
if(e==6 && string_RF[a] !=',')Datum3[a-28]=string_RF[a]; //
if(e==7 && string_RF[a] !=',')Datum4[a-32]=string_RF[a]; //de 8 digitos..
if(e==8 && string_RF[a] !=',')Datum5[a-41]=string_RF[a]; //
if(e==9 && string_RF[a] !=',')Datum6[a-50]=string_RF[a]; //.........
}
borrar_datos_RF();
}
void main(){ //programa principal
borrar_datos_RF(); //borro string_RF
enable_interrupts(INT_RDA); //avilito interrupcion de recepcion serial
enable_interrupts(GLOBAL); //todas las interrupciones activadas
fprintf(RF,"hola");
while(TRUE){
//if(seg_RTC==1)lectura_escritura_RTC();
if(flag_checksum==1)calculo_del_checksum();
if(flag_extraccion==1)extraer_datos_string_RF();
switch (Datum4){
case "12345678":
output_high(PIN_D0);
break;
case "12345679":
output_low(PIN_D0);
break;
}
}
}