Autor Tema: problemas buffer del puerto rs232  (Leído 2925 veces)

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

Desconectado moronilehi

  • PIC10
  • *
  • Mensajes: 17
problemas buffer del puerto rs232
« en: 04 de Octubre de 2009, 02:15:49 »
Hola soy nuevito en este mundo
Tengo problemas con el programa para recibir  datos, por el puerto rs232 a  través de  las interrupciones para recibir datos.  Yo tengo que hacer una aplicación por visual BASIC .que envía al micro  un comando, además envía un valor de dirección  y una variable a guardar en la memoria entre 0 a 255 .por  ejemplo  si envió  el comando “\w”, donde le dice al micro que debe  esperar valores para  escribir en la memoria.  Los valores que espera  y que debe recibir  por el mismo puerto rs232, una dirección  y un valor a guardar.y tambien el micro debe enviar valores si le manda por ejemplo"\l" donde el micro debe esperar el comando a leer  y luego de recivir el valor de la direcion a leer el pic envia al programa de visual basic los valores guardados.
 como sabemos El programa  VB envía cadenas  al micro, por tal razón estoy tratando de usar  un buffer para poder usar valores de 0 a 255 direciones de la eeprom. Pero he tenido puros problemas.
Además cuando envió un dato por VB. La interrupción para recibir del micro.  Me funciona una vez y deja de funcionar.  Para que vuelva a funcionar debo poner  reset y además cuando pongo las condiciones del la sub programa procesar_comando, de la condiciones “if” aparece  un error en el compilador, el erro que lanza   en “ccs” es“ lable =scr 2178”.
Estoy usando el Proteus, para poder simular el programa. Uso el “COMPIN” para poder enviar de Proteus hacia VB.
Para simular los puertos virtuales  rs232, uso el programa VSPD.
Aquí  les dejo código que pretendo usar y foto  del programa.

Gracias por la antemanos ;-) :-/.
http://s4.subirimagenes.com/otros/previo/thump_3316790ventana.jpg
http://s4.subirimagenes.com/otros/previo/thump_3316797proteus.jpg
http://s4.subirimagenes.com/otros/previo/thump_3316806error.jpg
http://s4.subirimagenes.com/otros/previo/thump_3316807error2.jpg
http://s4.subirimagenes.com/otros/previo/thump_3316814error3.jpg
Código: [Seleccionar]
// _232_buffered.c

#include <16f876a.h> // Definiciones del PIC 16F876A
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT  // Los Fuses de siempre
#use delay(clock=4000000)  // Oscilador a 4 Mhz
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)// RS232 Estándar

// CONSTANTES /////////////////////////////////////////////////////////////////
int const lenbuff=32;  // Longitud de buffer, Ajustar
                                       // a lo que desees (o te sea posible)
// VARIABLES EN RAM ///////////////////////////////////////////////////////////
int  xbuff=0x00;                       // Índice: siguiente char en cbuff
char cbuff[lenbuff];                   // Buffer
char rcvchar=0x00;                     // último caracter recibido
int1 flagcommand=0;                    // Flag para indicar comando disponible
// Declaración de Funciones ///////////////////////////////////////////////////
void inicbuff(void);                   // Borra buffer
void  addcbuff(char c);                 // añade caracter recibido al buffer
void echos(char c);                    // Eco selectivo sobre RS232
void procesa_comando(void);            // Procesa comando
#include <stdlib.h>
// INTERRUPCIONES /////////////////////////////////////////////////////////////

#int_rda
void serial_isr() {                    // Interrupción recepción serie USART

   rcvchar=0x00;                       // Inicializo caracter recibido                   
   if(kbhit()){                        // Si hay algo pendiente de recibir ...
      rcvchar=getc();                  // lo descargo y ...
      addcbuff(rcvchar);               // lo añado al buffer y ...
      echos(rcvchar);                  // hago eco (si procede).
   }
}

// Desarrollo de Funciones ////////////////////////////////////////////////////

void echos(char c){                    // Echo selectivo ----------------------

      switch(c){
         case 0x0D: printf(" [Ent] " ); // Si he pulsado la tecla [Intro]
                    break;
         case 0x08: printf(" [Del] " ); // Si he pulsado la tecla [Retroceso]
                    break;
         case 0x1B: printf(" [Esc] " ); // Si he pulsado la tecla [Escape]
                    break;
         default:   putc(rcvchar);     // Echo de cualquier otro caracter
      }
}

void inicbuff(void){                   // Inicia a  cbuff -------------------
   int i;

   for(i=0;i<lenbuff;i++){             // Bucle que pone a 0 todos los
      cbuff[ i ]=0x00;                   // caracteres en el buffer
   }
   xbuff=0x00;                         // Inicializo el indice de siguiente
                                       // caracter
}

void addcbuff(char c){                  // Añade a cbuff -----------------------

      switch(c){
         case 0x0D:                    // Enter -> Habilita Flag para procesar
            flagcommand=1;             // Comando en Main
            break;
         case 0x08:                    // Del   -> Borra último caracter del Buffer
            if(xbuff>0) cbuff[--xbuff]=0x00;
            break;
         case 0x01B:                   // Esc   -> Borra el Buffer completamente
            inicbuff();
            break;
         default:
            cbuff[xbuff++]=c;          // Añade caracter recibido al Buffer
      }
}


// Programa Principal /////////////////////////////////////////////////////////

void main() {

   inicbuff();                                   // Borra buffer al inicio
 
   printf("** RS232 Buffered **" );  // Presenta menú
   printf("[Enter] Procesa comando" );
   printf("[Escape] Borra todo el buffer" );
   printf("[Delete] Borra último carácter del buffer" );
  printf("[\w] Comando Escribe" );
   printf("[\r] Comando Lee" );
   printf("" );
   enable_interrupts(int_rda);                   // Habilita Interrupción RDA
   enable_interrupts(global);                    // Habilita interrupciones
   do {
 
      if(flagcommand) procesa_comando();         // Si hay comando pendiente
                                                 // de procesar ... lo procesa.
   } while (TRUE);
}
// Procesador de Comandos /////////////////////////////////////////////////////

void procesa_comando(void){
   int i,xv;
   char arg[lenbuff];                   // Argumento de comando (si lo tiene)
   flagcommand=0;                       // Desactivo flag de comando pendiente.
   printf("Procesando ... " );       // Monitorizo procesando ...
   for(i=0;i<lenbuff;i++){             // Bucle que pone a 0 todos los
      arg[ i ]=0x00;                     // caracteres en el argumento
   }
   if(cbuff[0]=="\"&&cbuff[1]=="r")
   {   // Comparo inicio del buffer con comando ""
   printf("Leyendo ... " );           // Aqui lo que deseemos hacer con comando ""   
   }
   if(cbuff[0]=="\"&&cbuff[ 1 ]=="w")
   {   // Comparo inicio del buffer con comando "w"
      i=2;
      do
      {                               // Extraemos argumento del buffer
         arg[i-2]=cbuff;             // a partir del 3er byte y hasta .
      }while(cbuff[++i ]!=0x00);
            xv = atoi(arg);     
            printf("Escribiendo %s %u... ",arg,xv ) ;// Aqui lo que deseemos hacer con comando "w"
                                        // Monitorizamos el argunmento.
   }
   inicbuff();                          // Borro buffer.
   printf("Procesado." );        // Monitorizo procesado.
}


[\code]

Desconectado pic32

  • PIC12
  • **
  • Mensajes: 57
Re: problemas buffer del puerto rs232
« Respuesta #1 en: 24 de Abril de 2011, 07:31:55 »
Al final lo pudiste solucionar, yo estoy teniendo problemas parecidos?