TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: em2401 en 21 de Noviembre de 2013, 16:00:07

Título: Ayuda con comunicación en serie
Publicado por: em2401 en 21 de Noviembre de 2013, 16:00:07
Saludos con la comunidad, vengo a pedir su ayuda con esto de la comunicación en serie entre 2 pics. La teoría del envio y recepción ya la comprendí, en gran parte gracias a este foro y a las preguntas que ya hicieron sobre el tema. Mi problema es el siguiente, escribi un programa para enviar una variable int16 a través del puerto serie y que el otro pic la recibiera y la volviese s convertir a int16 hasta ahi todo bien, lo que me esta rompiendo la cabeza es intentar mandar 2 variables. les adjunto los codigos:

EMISOR
Código: [Seleccionar]
#include <16f876.h>
#device adc=10
#fuses hs,nowdt
#use delay(clock=20M)
#use rs232(baud=2400, xmit=pin_c6,rcv=pin_c7)
#include <lcd.c>
#INCLUDE <stdlib.h>
void main()
{
   int16 A,B;
   char x="x",y="y",A1[5],B1[5];
   lcd_init();
   setup_adc(adc_clock_internal);
   setup_adc_ports(all_analog);
   
   while(1)
   {
      set_adc_channel(0);
      delay_us(20);
      A=read_adc();
      sprintf(A1,"%04.0Lu",A);
      set_adc_channel(1);
      delay_us(20);
      B=read_adc();
      sprintf(B1,"%04.0Lu",B);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"x= %4.0Lu",A);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"y= %4.0Lu",B);
      putc(x);
      delay_ms(50);
      printf("%04s",A1);
      delay_ms(50);
      putc(y);
      delay_ms(50);
      printf("%04s",B1);
      delay_ms(50);
   }
}

RECEPTOR
Código: [Seleccionar]
#include <16f876.h>
#fuses hs,nowdt
#use delay(clock=20M)
#use rs232(baud=2400, xmit=pin_c6,rcv=pin_c7)
#include <lcd.c>
#INCLUDE <stdlib.h>
int i=0,c=0,x1=0,y1=0,e=0;
int16 A,B;
char x="x",y="y",A1[5],B1[5],valor;
#int_RDA
void RDA_isr()
{
   if(e==0)
   {
      valor=getc();
      if(strcmp(valor,x)==0)
      {
         x1=1;
      }
      else if(strcmp(valor,y)==0)
      {
         y1=1;
      }
      e=1;
   }
   if(x1==1)
   {
      A1[i]=getc();
      i++;
      if(i==4)
      {
         i=0;
         A=atol(A1);
         x1=0;
         e=0;
      }
   }
   if(y1==1)
   {
      B1[i]=getc();
      i++;
      if(i==4)
      {
         i=0;
         B=atol(B1);
         y1=0;
         e=0;
         c=1;
      }
   }
}
void main()
{
   lcd_init();
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   while(1)
   {
      if(c==1)
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc,"x= %4Lu",A);
         lcd_gotoxy(1,2);
         printf(lcd_putc,"y= %4Lu",B);
         c=0;
      }
   }
}

He intentado de 1000 formas distintas que el receptor me interprete bien lo que le llega pero no consigo hacerlo, aveces con simulación de proteus el receptor me muestra los dígitos combinados entra las 2 variables o aveces simplemente no me muestra nada.
Ojala me puedan ayudar, tal vez es un problema tonto mio de interpretación de la teoría o que se yo :(
Gracias de ante mano.
Título: Re: Ayuda con comunicación en serie
Publicado por: rivale en 22 de Noviembre de 2013, 11:52:47
Creo que tu problema es que estas enviando una cadena del tipo

X=1234;

y al momento de leerla estas separando el X, y despues intentas convertir la cadena "=1234" a un número