Autor Tema: Leer cadena de caracter  (Leído 2901 veces)

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

Desconectado Lca12

  • PIC10
  • *
  • Mensajes: 5
Leer cadena de caracter
« en: 01 de Mayo de 2017, 23:19:52 »
Hola estoy intentando leer una cadena de caracter con la Uart pero el problema que tengo q es que se me sobreescribe el registro rcreg.Como hago para limpiarlo!?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer cadena de caracter
« Respuesta #1 en: 01 de Mayo de 2017, 23:27:35 »
Para leer una cadena, tenes que leer letra a letra y asi formar la cadena de texto.

Es decir vas a tener que leer RCREG por cada caracter que llegue. Suponete que envias "hola"

Entonces vas a recibir la 'h', luego la 'o' y asi hasta llegar a la 'a', Para que C sepa que es un string, debes terminar el array con un 0x00, por lo tanto para poder tener el string hola necesitas 5 lugares, los 4 de las letras y uno al ultimo que es cero.
« Última modificación: 01 de Mayo de 2017, 23:33:52 por KILLERJC »

Desconectado Lca12

  • PIC10
  • *
  • Mensajes: 5
Re:Leer cadena de caracter
« Respuesta #2 en: 01 de Mayo de 2017, 23:34:40 »
Si, eso hago! Pero al leer el 3 caracter me salta el error de sobreescritura.
Por ejemplo, envio el la plabra arbol con el virtual termial de la pc al pic y en mi pantalla
Lcd solo aparece las letras arb o ar

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer cadena de caracter
« Respuesta #3 en: 01 de Mayo de 2017, 23:45:47 »
Escribi/copia y pega el programa que tenes realizado
« Última modificación: 01 de Mayo de 2017, 23:54:03 por KILLERJC »

Desconectado Lca12

  • PIC10
  • *
  • Mensajes: 5
Re:Leer cadena de caracter
« Respuesta #4 en: 02 de Mayo de 2017, 00:40:16 »
#include <xc.h>
#define _XTAL_FREQ 8000000
#include "uart_tra.h"
#include "flex_lcd.h"
#include <stdio.h>





// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF        // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = OFF       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF       // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)

unsigned char buffer[20];// Para LCD
unsigned char datos[20]; // String de 20 caracters
int x=0;// Contador
unsigned int borrar;

void interrupt Uart()
{
  if(PIR1bits.RCIF==1)
  {     
    x++;
    if(x==1)
    {
        datos[0]=RCREG;
        sprintf(buffer,"%c",datos[0]);// C es de caracter
        Lcd_Out2(2,1,buffer);
    }
    if(x==2)
    {
        datos[1]=RCREG;
        sprintf(buffer,"%c",datos[1]);// C es de caracter
        Lcd_Out2(2,2,buffer);
    }
    if(x==3)
    {
        datos[2]=RCREG;
        sprintf(buffer,"%c",datos[2]);// C es de caracter
         Lcd_Out2(2,3,buffer);
    }
    if(x==4)
    {
        datos[3]=RCREG;
        sprintf(buffer,"%c",datos[3]);// C es de caracter
        Lcd_Out2(2,4,buffer);
    }
    if(x==5)
    {
        datos[4]=RCREG;
        sprintf(buffer,"%c",datos[4]);// C es de caracter
        Lcd_Out2(2,5,buffer);
    }
    if(x==6)
    {
        datos[5]=RCREG;
        sprintf(buffer,"%c",datos[5]);// C es de caracter
        Lcd_Out2(2,6,buffer);
    }
    if(x==7)
    {
        datos[6]=RCREG;
        sprintf(buffer,"%c",datos[6]);// C es de caracter
        Lcd_Out2(2,7,buffer);
    }
    if(x==8)
    {
        datos[7]=RCREG;
        sprintf(buffer,"%c",datos[7]);// C es de caracter
        Lcd_Out2(2,8,buffer);
    }
    if(x==9)
    {
        datos[8]=RCREG;
        sprintf(buffer,"%c",datos[8]);// C es de caracter
        Lcd_Out2(2,9,buffer);
    }
    if(x==10)
    {
        datos[9]=RCREG;
        sprintf(buffer,"%c",datos[9]);// C es de caracter
        Lcd_Out2(2,10,buffer);
    }
    if(x==11)
    {
        datos[10]=RCREG;
        sprintf(buffer,"%c",datos[10]);// C es de caracter
        Lcd_Out2(2,11,buffer);
    }
    if(x==12)
    {
        datos[11]=RCREG;
        sprintf(buffer,"%c",datos[11]);// C es de caracter
        Lcd_Out2(2,12,buffer);
    }
    if(x==13)
    {
        datos[12]=RCREG;
        sprintf(buffer,"%c",datos[12]);// C es de caracter
        Lcd_Out2(2,13,buffer);
    }
    if(x==14)
    {
        datos[13]=RCREG;
        sprintf(buffer,"%c",datos[13]);// C es de caracter
        Lcd_Out2(2,14,buffer);
    }
    if(x==15)
    {
        datos[14]=RCREG;
        sprintf(buffer,"%c",datos[14]);// C es de caracter
        Lcd_Out2(2,15,buffer);
    }
    if(x==16)
    {
        datos[15]=RCREG;
        sprintf(buffer,"%c",datos[15]);// C es de caracter
        Lcd_Out2(2,16,buffer);   
    }
           
    if(x==16)
    {x=0;}//Reiniciamos el contador
    if(RCSTAbits.OERR==1)//Error de sobre escritura
    {
        LATAbits.LATA6=1;
        RCSTAbits.CREN=0;
        RCSTAbits.CREN=1;
    }
     
   
  } 
}

void main(void)
{
   
    // OSC
    OSCCONbits.IRCF=0b1110; //8Mhz
    OSCCONbits.SPLLEN=0;
    OSCCONbits.SCS=0b10;
   
    TRISAbits.TRISA6=0;// RA6 Como salida
    LATAbits.LATA6=0; // RA6 Como 0 logico
    TRISAbits.TRISA4=0;// RA6 Como salida
    LATAbits.LATA4=0; // RA6 Como 0 logico
 
    Lcd_Init();     //inicializamos el lcd
    Lcd_Cmd(LCD_CLEAR);      //limpiamos lcd
    Lcd_Cmd(LCD_CURSOR_OFF);   //apagamos el cursor
    Lcd_Out(1, 1, "LECTOR RFID");
   
    iniciar_usart();//inicia el módulo USART PIC
 
    while(1)
    {
       
   
   
    }
 return;
     
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Leer cadena de caracter
« Respuesta #5 en: 02 de Mayo de 2017, 14:42:06 »
Una forma seria esta:

Código: C
  1. #include <string.h>
  2.  
  3. unsigned char buffer[20];// Para LCD
  4. unsigned char datos[20]; // String de 20 caracters
  5. unsigned char x=0;// Contador
  6. unsigned int borrar;
  7. unsigned char dato_completo = 0;
  8.  
  9. void interrupt Uart()
  10. {
  11.     if(PIR1bits.RCIF==1)
  12.     {      
  13.         if(RCSTAbits.OERR==1)//Error de sobre escritura
  14.         {
  15.             LATAbits.LATA6=1;
  16.             RCSTAbits.CREN=0;
  17.             RCSTAbits.CREN=1;
  18.             x=0;                //En caso de algun error reinicio todo
  19.             dato_completo = 0;
  20.         }
  21.         else
  22.         {
  23.             datos[x]=RCREG;
  24.             x++;
  25.             if(x==16)
  26.             {
  27.                 datos[x] = '\0';
  28.                 x = 0;
  29.                 dato_completo = 1;
  30.                 memcpy(buffer,datos,sizeof buffer); //Copio los datos a buffer, de esa forma puedo carga los valores nuevos que lleguen
  31.             }
  32.         }
  33.     }
  34. }
  35.  
  36. void main(void)
  37. {
  38.    
  39.     // OSC
  40.     OSCCONbits.IRCF=0b1110; //8Mhz
  41.     OSCCONbits.SPLLEN=0;
  42.     OSCCONbits.SCS=0b10;
  43.    
  44.     TRISAbits.TRISA6=0;// RA6 Como salida
  45.     LATAbits.LATA6=0; // RA6 Como 0 logico
  46.     TRISAbits.TRISA4=0;// RA6 Como salida
  47.     LATAbits.LATA4=0; // RA6 Como 0 logico
  48.  
  49.     Lcd_Init();     //inicializamos el lcd
  50.     Lcd_Cmd(LCD_CLEAR);      //limpiamos lcd
  51.     Lcd_Cmd(LCD_CURSOR_OFF);   //apagamos el cursor
  52.     Lcd_Out(1, 1, "LECTOR RFID");
  53.    
  54.     iniciar_usart();//inicia el módulo USART PIC
  55.  
  56.     while(1)
  57.     {
  58.         if(dato_completo==1)
  59.         {
  60.             Lcd_Out2(2,1,datos);
  61.             dato_completo = 0;
  62.         }
  63.     }
  64. }

En este caso recibo 16 caracteres y recien ahi los muestro. Antes no. Observa que la rutina del LCD se encuentra AFUERA de la interrupcion, ya que estas rutinas tardan demasiado y van a hacer que ocurran un error de sobreescritura del RCREG,


 

anything