Autor Tema: Pic con dos Puerto Serie  (Leído 3425 veces)

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

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Pic con dos Puerto Serie
« en: 16 de Febrero de 2009, 01:35:54 »
Hola estoy tratando de implementar un modulo que esta constituido por un pic que tiene dos puertos serie (USART Fisico y USART Virtual), este es un fragmento de mi programa, el compilador del CCS me da un error  :?: pero no logro entender a que se debe, alguien me podria decir cual es mi error?  :g)

Código: [Seleccionar]
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

const char ID[]="placa-0001";
char c;

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM =USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)

void main(){
while (1) {
    if (kbhit(USART_FISICO))
 
    fputc(("Esto es una prueba de la",ID),USART_VIRTUAL);
 
  }
}

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Pic con dos Puerto Serie
« Respuesta #1 en: 16 de Febrero de 2009, 11:12:10 »
Hola Meduza!
Yo lo probe asi:
Citar
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

const char ID[]="placa-0001";
char c;

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM =USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)

void main()
{
while (1)
   {
    if (kbhit(USART_FISICO))
      {
      for (c=0;c<11;c++)
      fputc(("Esto es una prueba de la %s",ID[c]),USART_VIRTUAL);
      }
    }
}
Y me funciono!

Saludos
« Última modificación: 16 de Febrero de 2009, 11:15:34 por RALF2 »

Desconectado joseto

  • PIC10
  • *
  • Mensajes: 11
Re: Pic con dos Puerto Serie
« Respuesta #2 en: 19 de Febrero de 2009, 19:04:43 »
 :) Hola

Prefiero usar algo asi:

fprintf(USART_VIRTUAL,"Esto es una prueba de la %s",ID);

funciona OK

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2062
Re: Pic con dos Puerto Serie
« Respuesta #3 en: 20 de Febrero de 2009, 22:57:43 »
Perfecto joseto!
Gracias por la sugerencia   :mrgreen:

Saludos

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: Pic con dos Puerto Serie
« Respuesta #4 en: 23 de Febrero de 2009, 15:05:33 »
Código: [Seleccionar]
Hola, nuevamente tengo una duda  :mrgreen:
En el siguiente codigo el USART_FISICO envia a un periferico el mensaje "Inicializando el Controlador placa-0001" y en respuesta el periferico devuelve el mensaje "OK", entonce es pic debe de verificar este mensaje y si es igual debe de enviar el mensaje "Comando Recibido" al USART_VIRTUAL el problema es que no se cumple esto cual es mi error?


#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

const char ID[]="placa-0001";
char c;

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM =USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)

void main()
{
//
//
//
        fprintf(USART_FISICO,"Inicializando el Controlador,%s",ID);
        delay_ms(200);

while (TRUE){
        if (kbhit(USART_FISICO)){
     
            c=fgetc(USART_FISICO);
            if (c=="OK")
fprintf(USART_VIRTUAL,"Comando Recibido");
                 }
      }   
}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Pic con dos Puerto Serie
« Respuesta #5 en: 23 de Febrero de 2009, 15:30:47 »
Hola.

Yo usaria como pin de Rx para el USART_VIRTUAL uno que tenga una interrupcion (RB0, o alguno con CCPx) y gestionaria la recepcion de los caracteres mediante la interrupcion.

No puedes compara strings de la manera como esta en el if, usa la libreria string.h para hacer las comparaciones, o hazlas tu mismo, son solo 2 bytes que tienes que comparar.

Saludos
El papel lo aguanta todo

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: Pic con dos Puerto Serie
« Respuesta #6 en: 23 de Febrero de 2009, 15:45:55 »
Hola Mlo,

Gracias por tu sugerencia pero el PortB0 ya lo tengo usando para otra cosa, y en cuanto a la comparacion de string me podrias dar un ejemplo?

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Pic con dos Puerto Serie
« Respuesta #7 en: 23 de Febrero de 2009, 16:33:41 »
Hola.

Una de las formas de hacerlo seria la siguiente:
Código: [Seleccionar]
if(!strncmp(cbuff, dbuff,4))
{
 ...
}

En donde cbuff[], seria el array donde estan los datos obtenidos en la transmision serial y dbuff[] seria el array donde tengo la referencia a comparar, por ejemplo: "OK". El ultimo numero (4) es el numero de bytes que quiero comparar.

Saludos
El papel lo aguanta todo

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: Pic con dos Puerto Serie
« Respuesta #8 en: 23 de Febrero de 2009, 17:54:44 »
Hola Mlo,

Podrias decirme cual es mi error?

Código: [Seleccionar]
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#include <stdlib.h>

const char ID[]="placa-0001";
int const MAXLENBUFF=4;
char cbuff[MAXLENBUFF];
char dbuff[MAXLENBUFF];

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM =USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)

void main()
{
strcpy(dbuff,"OK");
//
//
//
        fprintf(USART_FISICO,"Inicializando el Controlador,%s",ID);
        delay_ms(200);

while (TRUE){

        if (kbhit(USART_FISICO)){
            cbuff=fgetc(USART_FISICO);
            if(!strncmp(cbuff,dbuff,4))
                fprintf(USART_VIRTUAL,"Comando Recibido\r\n");
               
             }
         }   
}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Pic con dos Puerto Serie
« Respuesta #9 en: 23 de Febrero de 2009, 23:06:47 »
Hola.

Es la forma como adquieres el dato del serial, de la forma como lo haces solo captas la letra O. Debes capturar dos letras: O y K.
El papel lo aguanta todo

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: Pic con dos Puerto Serie
« Respuesta #10 en: 24 de Febrero de 2009, 01:45:09 »
No entiendo?  :(

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Pic con dos Puerto Serie
« Respuesta #11 en: 24 de Febrero de 2009, 02:25:10 »
La funcion que estas usando para obtener el string OK, no es el adecuado, ya que la funcion fgetc() retorna un byte. En el codigo que tu tienes, primero quieres capturar la letra O y luego comparas (ademas, la asignacion del dato al array esta mal hecho, debes indicarle en que posicion del array lo vas a guardar).

Revisa bien los conceptos de definicion de array, veo que los tienes muy enredados.

Saludos
El papel lo aguanta todo

Desconectado Medusa

  • PIC18
  • ****
  • Mensajes: 252
Re: Pic con dos Puerto Serie
« Respuesta #12 en: 24 de Febrero de 2009, 19:59:46 »
Hola Mlo, he tratado de seguir tus consejos pero no doy con la solucion a mi problema, tendrias la amabilidad de poner un ejemplo o retocar mi codigo, te agradecera

Código: [Seleccionar]
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#include <stdlib.h>

const char ID[]="placa-0001";

// Variables Globales ///////////////////////////////////////////////////////////////////

char buffrec[2];                        // Buffer de Recepcion
int  xbuffrec=0x00;                              // índice del Buffer de Recepcion

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,STREAM =USART_FISICO)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7,STREAM=USART_VIRTUAL)
 

void main()
{

 char xcommand[2];
//
//
//
        fprintf(USART_FISICO,"Inicializando el Controlador,%s",ID);
        delay_ms(200);

while (TRUE){
    xbuffrec=0x00;

        if (kbhit(USART_FISICO)){
           buffrec[xbuffrec++]=fgetc(USART_FISICO);                       // lo recibo y lo añado al Buffer de Recepcion
           strcpy(xcommand,"OK");
           if(!strncmp(buffrec,xcommand,strlen(xcommand))){

   fprintf(USART_FISICO,"Comando Recibido\r\n");
           }   
        }
     }   
}

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Pic con dos Puerto Serie
« Respuesta #13 en: 25 de Febrero de 2009, 02:48:53 »
Hola.

Primero captura los dos bytes y luego comparas. La inicializacion de la variable xbuffrec deberia ser fuera del while(true). Se podria usar un tercer byte (\r o \n por ejemplo) para avisarle al PIC que el envio termino y que pueda pasar a la comparacion del string.
El papel lo aguanta todo

Desconectado joseto

  • PIC10
  • *
  • Mensajes: 11
Re: Pic con dos Puerto Serie
« Respuesta #14 en: 27 de Febrero de 2009, 03:03:05 »
Que tal   :)

En el encabezado de tu programa agrega #include <string.h>  es la libreria que nos ayuda a manejar cadenas de caracteres y prueba lo siguiente:

Código: [Seleccionar]

if (kbhit(USART_FISICO)){
           buffrec[xbuffrec]=fgetc(USART_FISICO);                              // lo recibo y lo añado al Buffer de Recepcion
           if(buffrec[xbuffrec]==0x0D)                                         //verifica si llego el Enter (caracter 0x0D) que me indica el fin del comando
           {
                  buffrec[xbuffrec]='\0';                                       //borro el Enter para realizar comparacion
                  strcpy(xcommand,"OK");                                        //preparo el texto con el que voy a comparar
                  if(!strcmp(buffrec,xcommand))
                  {
                          fprintf(USART_FISICO,"Comando OK\r\n");            //comparacion exitosa
                  }else
                  {
                          fprintf(USART_FISICO,"Comando Desconocido\r\n")
                   }
                  xbuffrec=0;                                                    //encero el contador para recibir nuevo comando
            }else
            {
                  ++xbuffrec;                                                  //incremento contador para recibir nuevo caracter
            }

}



Cabe indicar que el caracter 0x0D (Tecla Enter) es el que indica que el comando se termino de recibir, por lo tanto se debe proceder a realizar la comparacion.
Todo este codigo concuerda con lo que MLO indica en el post anterior.


 8)