Autor Tema: enviar cadena de caracteres variables en rs232  (Leído 2229 veces)

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

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
enviar cadena de caracteres variables en rs232
« en: 25 de Mayo de 2008, 18:59:37 »
hola, hoy pongo mi duda, y si ya la hicieron anteriormente les pido disculpas y pongan el link del hilo, ya que por mas que busque no encontre nada, mi duda es la siguiente, he estado leyendo el ejemplo del maestro redpic acerca del buffer, pero , si pudieran poner un ejemplo, muy sencillo de que los datos cuando se guarden en la eprom del pic, activar un pin, mande la sentencia de que lo envie como una cadena de caracteres via rs232, por asi decirlo, que supongamos que guardo tres caracteres en la eprom, y que esos tres caracteres mandarlos como un printf, la verdad he estado leyendo, creo que eso se hace con un sprintf, pero no he entendido muy bien la verdad, y como soy de laidea que viendo como se hace se aprende, pues pido un poco de ayuda, bueno, gracias de adelantado a todos :)
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: enviar cadena de caracteres variables en rs232
« Respuesta #1 en: 25 de Mayo de 2008, 23:01:14 »
Hola

No se si te entiendo bien, pero si tienes "1", "2" y "3" en la eeprom quieres que salga "123" en el COM??? , si es asi, lo unico que tienes que hacer es guardar los datos en un buffer dato[3] y luego utilizar el printf("%s \r\n", dato) y saldra.

Espero tus comentarios

Saludos
El papel lo aguanta todo

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: enviar cadena de caracteres variables en rs232
« Respuesta #2 en: 26 de Mayo de 2008, 00:44:55 »
mmmmmmmm,  :shock: parece muy facil,  :), lo hago y te digo, pero por tu respuesta y la experiencia, me dice que respuestas buenas son respuestas bien definidas, gracias, MLO estamos en contacto
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: enviar cadena de caracteres variables en rs232
« Respuesta #3 en: 26 de Mayo de 2008, 02:41:43 »
Hola

Te posteo un ejemplo que hice.
Código: [Seleccionar]
#include <16F873A.h>
#fuses XT, NOLVP, NOWDT
#use delay(clock=4M)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)

#rom 0x2100={'1','2','3'}

int1 data_rdy = 0;
int8 dato[3] = "0";

#int_EXT
void envio_isr(void)
{
data_rdy = true;
}

void leer_dato(void)
{
int8 i=0;

for(i=0;i<=2;i++)
{
dato[i] = read_eeprom(i);
}
}

void main (void)
{
setup_adc(ADC_OFF);
setup_comparator(NC_NC_NC_NC);
ext_int_edge(L_TO_H);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
printf("Prueba RS232 \r\n");

 while(true)
 {
if(data_rdy)
{
data_rdy = false;
leer_dato();
printf("Dato %s \r\n", dato);
}
 }
}


Adjunto el archivo en proteus.

Saludos
El papel lo aguanta todo

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: enviar cadena de caracteres variables en rs232
« Respuesta #4 en: 26 de Mayo de 2008, 16:31:20 »
 :-/ gracias, estaba probando mi programa y no me salia, pero con el ejemplito ya tengo las cosas claras, una pregunta cuando declare una cadena como:

char buffer[];

pero no declaraba

buffer[]=read_eeprom(i);

pero no declaraba el buffer;

bueno gracias, y seguire posteando, por que tengo muchas dudas, jejeje, sobre advertencia no hay engaño  :) saludos MLO
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: enviar cadena de caracteres variables en rs232
« Respuesta #5 en: 26 de Mayo de 2008, 16:57:19 »
Ok scientist, con gusto.

No entiendo bien tu pregunta, pero va una respuesta  :mrgreen: ojala le atine otra vez  :D :D

Cuando defines un array como char buffer[], hay que determinar la dimension que va a tener, hay varias formas de hacerlo, una pues, sabiendo de antemano cuantos caracteres va a tener el array, en este caso son tres, asi que lo defino char buffer[3]="0" ( siempre tiendo a inicializar los buffers para no llevarme sorpresas ). Otra manera es la siguiente char buffer[]="Hola mundo", donde se asigna automaticamente el valor de la dimension del array.

Ya en la funcion de lectura leo byte a byte y lo guardo en el buffer. Claro esta que es mejor tener control sobre la dimension del buffer para trabajarlos como queramos.

Saludos
El papel lo aguanta todo

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: enviar cadena de caracteres variables en rs232
« Respuesta #6 en: 26 de Mayo de 2008, 19:56:19 »
bueno,ahora tengo otro problema, y es que e intentado hacer un programa que tenga 4 botones de control mas la int externa, los 4 botones de control los cogi de las  int_rb, el rb4 hace el de grabar, cuando lo dejas sumido por 2 segundos, este entra a la fase de grabar, ahora con rb5 y rb6 modifico la variable que quiero guardar en la eeprom, rb5 es mas, y rb6 es menos, y con rb7 confirmo que quiero grabbar ese numero, y se incrementa la variable de direccion de la rom, la verdad no me sale la parte de grabacion, no porque, aqui pego el codigo y la simulacion
Código: [Seleccionar]
#FUSES HS,NOWDT,NOPROTECT,NOLVP


#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#use standard_io(b)


////////////////variables/////////////////
int1 data_rdy = 0;
int8 dato[8] = "0";
int contRTCC=0;
int1 flag=0;
int1 flag_enter=0;
int k=0;
int grabar=0;
int1 ok=0;
int1 flag_direccion_mas=0;
int1 flag_direccion_menos=0;
int j=0;
////////////interrupciones///////////////

#int_EXT
void envio_isr(void)
{
   data_rdy = true;
}

#int_timer0
void interruption_clock1(void){
if(flag_enter==1){
set_timer0(0);
++contRTCC;
if (contRTCC==230){
contRTCC=0;
flag=1;
}
}else{
flag=0;
}
}
#int_rb
void enter_inte(void){
if (input(pin_b4)){

flag_enter=1;
}else{
flag_enter=0;
}

if (input(pin_b5)){

flag_direccion_mas=1;
}else{
flag_direccion_mas=0;
}
if (input(pin_b6)){

flag_direccion_menos=1;
}else{
flag_direccion_menos=0;
}

if (input(pin_b7)){
ok=1;
}else{
ok=0;
}


}
//////////funciones//////////////
void leer_dato(void)
{
   int8 i=0;

   for(i=0;i<=8;i++)
   {
      dato[i] = read_eeprom(i);
   }
}

void main (void)
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   ext_int_edge(L_TO_H);
   enable_interrupts(INT_EXT);
   enable_interrupts(int_rb);
   enable_interrupts(int_rtcc);
   enable_interrupts(GLOBAL);
   printf("Prueba RS232 \r\n");

 while(true)
 {
   if(data_rdy)
   {
      data_rdy = false;
      leer_dato();
      printf("Dato %s \r\n", dato);
   }
   
   if ((flag==1)&&(flag_enter==1)){
   delay_ms(500);
   printf("ok");
   
   grabar=grabar+1;
   delay_ms(300);
   }
 
   
   if (grabar==1){
   if(flag_direccion_mas==1){
   delay_ms(400);
   k=k+1;
   
   
   }
   
   if(flag_direccion_menos==1){
   delay_ms(400);
   k=k-1;
   
   }
   
   if(ok==1){
   delay_ms(400);
   j=j+1;
   write_eeprom(j,k);
   }
   
   }
   
   if(grabar==2){
   grabar=0;
   j=0;
   }
   
   
   
   
   
   
   
   
   
   
 }   
}



bueno , gracias  :lol:
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: enviar cadena de caracteres variables en rs232
« Respuesta #7 en: 27 de Mayo de 2008, 02:41:10 »
hola, tal vez fui muy extenso en mi pregunta,  :)  por mi experiencia, no es bueno extenderse en la pregunta, asi que sere mas especifico

en el programa

Código: [Seleccionar]

int8 dato[8] = "0";
int1 flag_direccion_mas=0;
int1 flag_direccion_menos=0;
int j=0;
int k=0;

if(flag_direccion_mas==1){
   delay_ms(400);
   k=k+1;
   printf("%d",k);
   
   }
   
   if(flag_direccion_menos==1){
   delay_ms(400);
   k=k-1;
   printf("%d",k);
   }
   
   if(ok==1){
   delay_ms(400);
   j=j+1;
   write_eeprom(j,k);
   printf("grabamos");
   }

aqui cuando activo la interrupcion externa hago esto:

for(i=0;i<=8;i++)
   {
      dato[i] = read_eeprom(i);
   }




pero cuando lo leo no aparece:solo dato:1, por mas que ponga otras variables, que podria ser?
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: enviar cadena de caracteres variables en rs232
« Respuesta #8 en: 27 de Mayo de 2008, 10:38:37 »
Hola.

No entiendo bien tu pregunta, asumo que es que no lees ningun dato desde la eeprom ( mas bien no se despliega ningun dato de la eeprom en el terminal virtual ), aun cuando en la eeprom hayas guardado algun dato. Recuerda que debes guardar los datos en la eeprom en ASCII para que en el terminal te salgan los caracteres, es decir, si yo guardo 5 en la eeprom y saco ese valor por el terminal, saldra el ascii correspondiente a 0x05 (ENQ), y yo quiero el '5', el cual corresponde a guardar 0x35 en la eeprom, si soy claro?  :mrgreen: :mrgreen:

Mira en el ejemplo que te envie, que el buffer es dato[3] = {'1', '2', '3'} y no dato[3] = {1,2,3}, de ser este ultimo estaria enviando al terminal SOH, STX, ETX, que son los ascii correspondientes a 1,2 y 3 respectivamente.

Saludos
El papel lo aguanta todo

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: enviar cadena de caracteres variables en rs232
« Respuesta #9 en: 27 de Mayo de 2008, 17:33:04 »
 :-/ asi es, me di cuenta que si guardaba cuando vi en la simulacion de proteus como se encontraba la memoria eeprom, pero no sabia por que no lo desplegaba, ahora ya se por que, grax MLO , tienes buen karma  :)
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: enviar cadena de caracteres variables en rs232
« Respuesta #10 en: 27 de Mayo de 2008, 19:19:55 »
 :mrgreen: :mrgreen: :mrgreen: :mrgreen:
Gracias amigo, por aca a la orden

Saludos
El papel lo aguanta todo