Autor Tema: formar una libreria a partir de un codigo ya creado  (Leído 1790 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
formar una libreria a partir de un codigo ya creado
« en: 09 de Junio de 2012, 02:13:19 »
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:
Código: [Seleccionar]
//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;
  }
}
}
« Última modificación: 09 de Junio de 2012, 04:33:45 por japifer_22 »

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: formar una libreria a partir de un codigo ya creado
« Respuesta #1 en: 09 de Junio de 2012, 03:42:45 »
ha! y les dejo una trama en hexa por si quieren probar el programita:
trama en Hexa...
Código: [Seleccionar]
0A 24 2C 41 42 43 44 45 46 2C 31 32 33 34 35 36 2C 41 42 43 2C 34 35 36 2C 47 48 49 2C 37 38 39 2C 31 32 33 34 35 36 37 38 2C 41 42 43 44 45 46 47 48 2C 31 32 33 34 35 36 38 38 2A 32 43 0D
trama en ASCII...
Código: [Seleccionar]
$,ABCDEF,123456,ABC,456,GHI,789,12345678,ABCDEFGH,12345688*2Crecordando que al principio lleva 0x0A y al final de la trama 0x0D, datos en hexa.

 :mrgreen: :mrgreen: :mrgreen: :mrgreen:

bucha y ojalas me puedan ayudar o orientar a hacer la libreria de este codigo.
y no seria nada de malo que al probarlo dejacen aqui sus comentarios, de si funciono bien o no, por que al yo crear el codigo, a lo mejor me paso en alto algo  :mrgreen:
« Última modificación: 09 de Junio de 2012, 03:54:23 por japifer_22 »

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: formar una libreria a partir de un codigo ya creado
« Respuesta #2 en: 09 de Junio de 2012, 09:46:12 »
Hola japifer_22:
                   Para hacerlo librería deberías separar el código en funciones y plantear que parámetros deberían recibir dichas funciones. También vas a tener que decidir si usarás punteros o variables globales. Luego lo incluirías a tu programa principal con un #include.

Podés hacerlo usando punteros  Por ejemplo:

signed char recibe_trama_desde_PC(char *ptrDatum1, char *ptrDatum2, char *ptrDatum3, char *ptrDatum4, char *ptrDatum5, char *ptrDatum6)
{

// código de la función

return // y que la función devuelva un valor de tipo entero con información sobre si recibió bien la trama o no.
          // por      ejemplo 0   o  -1
}

Luego desde tu programa principal hacés el llamado de la función y ésta cargará en tus arrays los valores enviados desde el pc.


O hacerlo con variables globales:

signed char recibe_trama_desde_PC(char Datum1[4], char Datum2[4], char Datum3[4], char Datum4[9], char Datum5[9], char Datum6[9])
{

// código de la función

return // y que la función devuelva un valor de tipo entero con información sobre si recibió bien la trama o no.
          // por      ejemplo 0   o  -1
}
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: formar una libreria a partir de un codigo ya creado
« Respuesta #3 en: 09 de Junio de 2012, 16:56:53 »
voy a intentar hacer lo que me dices jukinch, gracias por la sugerencia, se agradece....

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: formar una libreria a partir de un codigo ya creado
« Respuesta #4 en: 09 de Junio de 2012, 17:09:09 »
japifer_22:
           Me equivoqué en la declaración de la función recibe_trama_desde_PC con variables globales.  :-)

la función sería así:
signed char recibe_trama_desde_PC(void)
{
// código de la función
return // y que la función devuelva un valor de tipo entero con información sobre si recibió bien la trama o no.
          // por      ejemplo 0   o  -1
}

y te restaría definir como variables globales en main.c  :

char Datum1[4], char Datum2[4], char Datum3[4], char Datum4[9], char Datum5[9], char Datum6[9];
y no las volverías a definir dentro de la función recibe_trama_desde_PC.
Al tener dichas variables ámbito global las podrás usar dentro de la función recibe_trama_desde_PC sin problemas.
 Saludos.
          Jukinch


"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: formar una libreria a partir de un codigo ya creado
« Respuesta #5 en: 09 de Junio de 2012, 18:20:26 »
hola otra vez, he estado intentado pasar el codigo a una libreria, pero no puedo, esque no tengo los conceptos bien claro.

me refiero a que al saltar mu interrupcion de recepcion serial, yo envio lo resivido y lo paso a una función que me indica que el estado de la trama que entra, luego si todo esta bn, de esa misma funcion paso a otra para que calcule si la trama resivida esta bn igual, de ser así paso a otra funcion mas que eextrae todo los parametros de esa trama, y en caso cont rario pasa a una funcion que borra todo lo recepcionado.

ahora mi pregunta es. ¿puedo hacer este tipo de anidaciones de funciones?
lo otro que no me queda claro es como uso los parametros que se extraen de la trama¿?

el intento que he echo es el que sigue, en cuanto a la libreria:

Código: [Seleccionar]
#define Nstring 65                   //Numero de caracteres que resive el string_RF
#define LF 0x0A                      //Salto a linea nueva
#define CR 0x0D                      //Retorno de carro

#ifndef ID_unidad
#define ID_unidad "123456"
#endif

char string_RF[Nstring];
int N_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....                
              break;
     case CR:                                   //proceso los datos que se ingresaron a string_RF....
              calculo_del_checksum();           //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 calculo_del_checksum(void){

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)extraer_datos_string_RF(); //el checksum esta bien¿?...la cantidad de separadores¿?...
   else borrar_datos_RF();                                                                          //el numero de caracteres¿?... y la id del equipo¿?.....
}


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 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.
}
« Última modificación: 09 de Junio de 2012, 18:39:06 por japifer_22 »

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: formar una libreria a partir de un codigo ya creado
« Respuesta #6 en: 09 de Junio de 2012, 18:27:58 »
si podés hacer este tipo de anidaciones de funciones.
Los datos que extraes de la trama los tenés que guardar en algún lado. Por eso te decía lo de las variables globales para Datum1,2,3,4,5,6
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes