Autor Tema: Sobre este ejemplo de recepcion de datos por rs232  (Leído 2807 veces)

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

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Sobre este ejemplo de recepcion de datos por rs232
« en: 09 de Diciembre de 2019, 13:28:38 »
Hola muchach@s, bueno haciendo una practica con el rs232, encontre este ejemplo aqui mismo en el foro,
Código: [Seleccionar]
#include <16f84A.h>
#include <string.h>
#use delay(clock=4M)
#fuses NOWDT,NOPUT
#use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_A1, FORCE_SW) //manejo del RS232

char string[30];
char pass[8]="entrar";

void main(void){
 SET_TRIS_A(0b00010);
 while(1){
  printf("\n\rPassword: "); // el password es: entrar
  gets(string);
  if(!strcmp(string, pass))  // cuando la comparación NO es igual, retorna 1
   printf("\n\rPassword correcto");
  else
   printf("\n\rError, intente de nuevo");
 }
}
El ejemplo lo saque de aqui: http://www.todopic.com.ar/foros/index.php?topic=26297.0
Funciona bien siempre y cuando no sobrepasamos los digitos al introducir la clave, por ejemplo la clave es "entrar" y la coloco y el password es correcto, pero si coloco por ejemplo "Jesucristo nuestro señor Padre Hijo y Espiritu Santo", me dice Error, intente de nuevo, ok todo parece bien pero si quiero colocar de nuevo la clave correcta "entrar" entonces no la reconoce porque la función strcmp me sobrescribe en el array pass y por eso me dice clave invalida.
Ahora he intentado muchas formas pero no logro hacer que no me sobre escriba el array "pass". Ahora tambien me gustaria que mi clave estuviese como una const pero no lo he logrado hacer. Vamos muchach@s a matarnos la cabeza con esto, otra cosa no quiero usar la eeprom ya que este es solo un ejercicio para aprendizaje, ya que en un proyecto profesional si se debe usar la eeprom y eso es bien facil de implementar. Yo se que la clave de todo es no sobrepasar la longitud maxima de cadena para el array "pass" pero que pasa si yo quiero ahorrar ram y solo coloco en el array la cantidad de 10. Me entienden.
« Última modificación: 09 de Diciembre de 2019, 13:37:48 por Carlos2302 »
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Sobre este ejemplo de recepcion de datos por rs232
« Respuesta #1 en: 09 de Diciembre de 2019, 14:38:27 »
Yo se que no te lo voy a resolver, pero te voy a indicar donde esta el problema.

El gets() no tiene limite, es decir vos no le das un maximo de 30 caracteres, por lo que si le entregas 40, el sigue escribiendo a pesar que vos definiste el array de solo 30 caracteres. Esto se conoce como buffer overflow.

Solucion: Crear una funcion con el getc() que tenga en cuenta cuando llega al maximo del array, y ademas tenga en cuenta el 0x13 que es donde indica el final del string el gets.
Recorda que el ultimo caracter debe ser el caracter nulo 0x00 ( '0\' )

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Sobre este ejemplo de recepcion de datos por rs232
« Respuesta #2 en: 09 de Diciembre de 2019, 20:21:07 »
Maestro KillerJC, gracias por responder, solo con decirme como puedo hacerlo es mas que suficiente, ya estoy trabajando en como leer en dato desde la ROM, el help de ccs me lo explica. Voy a mostrarlo aqui. Ya con esto aprendi algo mas hoy, ahora voy a acceder a todo el const "mi_clave" con un ciclo for y voy a investigar si puedo comparar otro array directamente con el const. Claro esta esto no tiene mucha utilidad para un sistema donde vaya a implementar un sistema de seguridad, ya que la clave seria constante y en caso de querer cambiarla pues no se podria. Es solo como un ejemplo de entretenimiento. Queria enviar unas imagenes pero los archivos soy muy grandes.  :5] :? :(

Código: [Seleccionar]
#include <Accediendo a ROM con punteros.h>
BYTE CONST mi_clave []= {9,4,2,1,4,9,8,2};
void main()
{
   while(TRUE)
   {
   int x;
x = mi_clave [2]; //va hacer 2
   }
}

Bueno si me explican como poner una imagen para que vean de donde saque el ejemplo.
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Sobre este ejemplo de recepcion de datos por rs232
« Respuesta #3 en: 09 de Diciembre de 2019, 20:46:00 »
La forma en como leo la rom. Aclaro en este ejemplo no uso punteros.

#include <Accediendo a ROM.h>
BYTE CONST mi_clave [9]= {9,4,2,1,4,9,8,2};
char mi_clave2[9];

void main()
{
   while(TRUE){
   int a;
   for(a=0;a<=8;a++){
   //x=mi_clave [a]; //va hacer 7
   mi_clave2[a]=mi_clave [a];
         }
     }
}
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Sobre este ejemplo de recepcion de datos por rs232
« Respuesta #4 en: 09 de Diciembre de 2019, 20:48:57 »
El gets con un limite seria algo asi:

Código: C
  1. char almacen[10];
  2. char test[] = "Hola como estas seguro por que no reconozco nada";
  3. char test2[] = {0x01,0x02,0x03,0x04,0x13,0x22,0x22};
  4.  
  5. void getsn(char *txt,uint8_t largo){
  6.     uint8_t i;
  7.     for(i=1; i<largo; txt++, i++)
  8.     {
  9.         *txt = getc();
  10.         if(*txt == 0x13) break;
  11.     }
  12.     *txt = 0;
  13. }
  14.  
  15. void main(void){
  16.  
  17.     while(1){
  18.         getsn(almacen,sizeof almacen);
  19.         getsn(almacen,sizeof almacen);
  20.     }  
  21. }

La comparacion letra por letra esta buena y seria algo asi::

Código: C
  1. const char password[] = {'1','3','8','7','2'};
  2.  
  3. bool comparepass(char *txt,uint8_t largo){
  4.     uint8_t i;
  5.     for(i=0; i<largo; txt++, i++)
  6.     {
  7.         if(*txt != getc()) return false;
  8.     }
  9.     return true;
  10. }
  11.  
  12. void main(void){
  13.  
  14.     while(1){
  15.         if(comparepass(password,sizeof password))
  16.        {
  17.           //Pass correcto
  18.        }
  19.     }  
  20. }

No probe los codigos... es simplemente a modo de orientacion.

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Sobre este ejemplo de recepcion de datos por rs232
« Respuesta #5 en: 09 de Diciembre de 2019, 22:23:30 »
Mañana los pruebo si mi Dios lo permite. A y si lo permite mi esposa tambien, :oops: :) Analizando el codigo por encima eso es Xc o me parece.
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Sobre este ejemplo de recepcion de datos por rs232
« Respuesta #6 en: 09 de Diciembre de 2019, 22:37:57 »
Es C, con el uso de stdint.h

No hay nada que sea exclusivo de XC8

Desconectado Carlos2302

  • PIC16
  • ***
  • Mensajes: 110
Re:Sobre este ejemplo de recepcion de datos por rs232
« Respuesta #7 en: 12 de Diciembre de 2019, 20:22:18 »
Hola a tod@s en especial a mi estimado amigo KILLERJC, bueno ire al grano despues de tantos elogios  :D :oops: , acabo de encontrar una funcion donde puedo salir de la funcion getc()  cuando trabajamos en comunicacion serial. Les dejo el ejemplo ya que nunca aporto nada solo uso el foro para aprender de los demas, aunque mi profesion es otra me encanta la programacion de los pic y cuando tengo tiempo libre estoy metido es eso 24 horas. :oops:
Código: [Seleccionar]
#include <Recibiendo_datos_Interrupcion_origen.h>
#use rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, FORCE_SW) //manejo del RS232

char string[7];
char pass[7]="entrar";
char string1[10], string2[10];
char time_out,x;
short timeout_error;

char timed_getc() {
   long timeout;
   
   timeout_error=FALSE;
   timeout=0;
   
   while(!kbhit()&&(++timeout<50000)) // 1/2 second
      delay_us(10);

   if(kbhit())
 
      return(getc());
   else {
      timeout_error=TRUE;
      return(0);
   }
}

void main(void){
string1="dasa";
strcpy(string1,"hi");//escribo en string1
strcpy(string2,"there"); //escribo en string2
strcat(string1,string2);// los datos se concatenan en string1
printf("http://www.ccsinfo.com/faq.php?page=getc_timeout\r\n"); // de donde saque
//la funcion timed_getc(); para evitar quedarme dentro de getc indifinidamente
printf("El largo de los dos array es %u\r\n", strlen(string1));     
 printf("\n\rIngrese la contraseña por favor: "); // el password es: entrar
 while(true){
 
 
  time_out = timed_getc();
  while (time_out !=0){ //si time_out es diferente de 0 
  string[x]=time_out;//coloco el dato en el array string
  ++x; //incrementamos x para el indice del array
  time_out=0; //colocamos time_out en cero de lo contrario nos quedamos siempre
  //en el while
  }
  if(x>5){//si x llego a 5 podemos hacer la comparacion de las contraseñas
  if(!strcmp(string, pass)){  // cuando la comparación NO es igual, retorna 1
   printf("\n\rPassword correcto");
   delay_ms(2500);
   printf("\n\rIngrese la contraseña por favor: ");
   x=0;
   }
   
  else{
   printf("\n\rError, intente de nuevo");
      delay_ms(2500);
   printf("\n\rIngrese la contraseña por favor: ");
   x=0;
  }
  }
 }
 
 }


El ejemplo dice que por interrupcion pero existen dos proyectos dentro del rar en donde el otro si uso la interrupcion pero no me servia para lo que queria.
« Última modificación: 12 de Diciembre de 2019, 20:24:39 por Carlos2302 »
Gracias a Dios por aquellas personas que ayudan sin esperar nada a cambio. Dios los bendiga hoy mañana y siempre.

Desconectado carpoolo

  • PIC10
  • *
  • Mensajes: 19
Re:Sobre este ejemplo de recepcion de datos por rs232
« Respuesta #8 en: 17 de Diciembre de 2019, 15:24:35 »
Complementando lo  que dijo KILLERJC Y si usas la Interrupcion del Uart? para capturar caracter, por caracter? para luego procesarlo?