Autor Tema: comunicacion de 2 RS232 en un PIC18f4550  (Leído 2578 veces)

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

Desconectado sparta13

  • PIC10
  • *
  • Mensajes: 7
comunicacion de 2 RS232 en un PIC18f4550
« en: 12 de Marzo de 2014, 16:11:27 »
Bien...que tal gente del foro, he trabajado con microcontroladores como por un mes, realizo un proyecto el cual es comunicar con un microcontrolador PIC18F4550 2 puertos seriales usando 2 RS232...la cuestion es que deseo comunicar cadenas por lo cual uso la funcion fgets de esta forma:

#include <18f4550.h>
#FUSES INTHS,MCLR,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT, CPUDIV1, PLL1
#use delay(internal=4MHZ)
//#use fixed_io(A_outputs=pin_A0)
#include <stdio.h>
#use rs232(baud=9600,xmit=pin_c6, rcv=pin_c7,stream=PC1)
#use rs232(baud=9600,xmit=pin_b1, rcv=pin_b0,stream=PC2)

char cpc1[10],cpc2[10];
//char datos;

void main ()
{
while(TRUE) {
  if (kbhit(PC1)) {
   fgets(cpc1,PC1);
   fputs(cpc1,PC2);
  }
   else
  {
   fgets(cpc2,PC2);
    fputs(cpc2,PC1);
              }
             
        }
  }

bien la comunicacion funciona bien al solo declarar :

void main ()
{
while(TRUE) {
 
   fgets(cpc1,PC1);
   fputs(cpc1,PC2);
 
   fgets(cpc2,PC2);
    fputs(cpc2,PC1);
             
             
        }
  }


pero solo lo realiza una sola  vez de una pc hacia la otra primero en PC1 y luego en PC2 y al querer introducir 2 cadenas consecutivas no lo hace, lo que deseo es que lo realice consecutivamente ...si introcusco 5 cadenas diferentes en PC1 las 5 las trasmita a PC2, y en su defecto al irnos a PC2 a trasmitir lo realice de igual manera

se que puede ser una cosa muy secilla pero ya estoy como en blanco agradeciendo su ayuda por adelantado espero puadan ayudarma.   :oops:

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: comunicacion de 2 RS232 en un PIC18f4550
« Respuesta #1 en: 12 de Marzo de 2014, 16:25:21 »
Hola,

no debería ser:

Código: C#
  1. void main ()
  2. {
  3.   while(TRUE) {
  4.     if (kbhit(PC1)) {
  5.      fgets(cpc1,PC1);
  6.      fputs(cpc1,PC2);
  7.     }
  8.     if (kbhit(PC2)) {
  9.       fgets(cpc2,PC2);
  10.       fputs(cpc2,PC1);
  11.     }        
  12.   }
  13. }

Saludos!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado camhost1

  • PIC12
  • **
  • Mensajes: 51
Re: comunicacion de 2 RS232 en un PIC18f4550
« Respuesta #2 en: 13 de Marzo de 2014, 00:33:18 »
Hola amigo te sugiero que utilices interrupciones para la captura de las cadenas, realice algo similar link, la diferencia era que solo capturaba caracteres, aunque con algunas  modificaciones se puede obtener el resultado que esperas. Saludos

Desconectado sparta13

  • PIC10
  • *
  • Mensajes: 7
Re: comunicacion de 2 RS232 en un PIC18f4550
« Respuesta #3 en: 14 de Marzo de 2014, 15:20:08 »
ha...sabia que era algo no tan dificil gracias BrunoF y camhos1 el link es bueno pero no entiendo que diferencia hay entre usar las interrupciones y no usarlas???... bueno la cuestion continua... algo que no comprendia bien era la utilizacion del fputs la funcion manda un cr y lf al final lo que me probocaba un salto de linea no deseado bueno a lo que entinedo... a si que comense a trabajar en el problema y estoy atorado en esto:

#include <18f4550.h>
#FUSES INTHS,MCLR,NOWDT,NOPROTECT,PUT,NOLVP,NOBROWNOUT, CPUDIV1, PLL1
#use delay(internal=4MHZ)
#include <stdio.h>
#use rs232(baud=9600,xmit=pin_c6, rcv=pin_c7,stream=PC1)
#use rs232(baud=9600,xmit=pin_b1, rcv=pin_b0,stream=PC2)

char cpc1[100],cpc2[100];
char contPC1,contPC2;
int longitudPC1,longitudPC2;

void main ()
{
while (true)
     {
if (kbhit(PC1) )
      {
          fgets(cpc1,PC1);
          longitudPC1=strlen(cpc1);
          for (contPC1=0;contPC1<=(longitudPC1-1);)
          {
             fputc(cpc1[contPC1],PC2);
             contPC1++;
                                }
                        }
if (kbhit(PC2) )
       {
           fgets(cpc2,PC2);
           longitudPC2=strlen(cpc2);
           for (contPC2=0;contPC2<=(longitudPC2);)
           {
                fputc(cpc2[contPC2],PC1);
                contPC2++;
                                   }
                        }
              }
    }



ahora bien... de PC1 hacia PC2 la comunicacion es correcta ya no tengo el cl y lf agregados y mi comunicacion es esperada... pero en caso contrario de PC2 a PC1 no lo hace bien ahora no me manda el lf solo un cr y si cominezo con CP1 lo hace bien pero luego ya no reaciona PC2 no se que ocurra...me he buelto atorar en lo mismo  :cry:  desculpen las molestias y espero puedan ayudarme. muy agradecido...