Autor Tema: Ayuda Funsión UART_Read_Text  (Leído 3393 veces)

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

Desconectado avumadden

  • PIC10
  • *
  • Mensajes: 3
Ayuda Funsión UART_Read_Text
« en: 25 de Febrero de 2015, 21:47:21 »
Hola me gustaría saber si alguien ayuda a utilizar esta función. He intentado muchos métodos y no puedo encontrar una solución.
Estaría muy agradecido si alguien me da un ejemplo.
Pretendo comparar la línea de texto introducida con el valor de una variable y después realizar cualquier sentencia cuando esta se cumpla.

Código: [Seleccionar]
void UART_Init(const long int baudrate){
    unsigned int br;
    br = (_XTAL_FREQ/(16*baudrate))-1;

    TX1STAbits.TXEN = 1;
    TX1STAbits.BRGH = 1;
    RC1STAbits.SPEN = 1;
    RC1STAbits.CREN = 1;

    // configure I/O pins
    ANSELCbits.ANSC5 = 0;
    TRISCbits.TRISC5 = 1;
    TRISCbits.TRISC4 = 1;

    SP1BRGL = br;
    PIE1bits.RCIE = 1;
}

/****Reception Functions****/
char UART_Data_Ready(){
    return PIR1bits.RCIF;
}

char UART_Read(){
    while(!PIR1bits.RCIF);
    return RCREG;
}

void UART_Read_Text(char *Output, unsigned int length){
    unsigned int i;
    for(int i=0;i<length;i++)
    Output[i] = UART_Read();

Gracias :), Espero puedan ayudarme.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda Funsión UART_Read_Text
« Respuesta #1 en: 25 de Febrero de 2015, 22:05:38 »
UART_Init(baudrate)
Configura el UART a el baudrate que le pones Ejemplo : UART_Init(9600);
Tambien configura los pines para eso, si te fijas usa el puerto C



UART_Data_Ready()

Indica si se recibio algun dato.. si se recibio un dato esa fucnion te devuelve un 1..

uint8_t recibido = UART_Data_Ready();

o podes ponerlo en un if

if (UART_Data_Ready()) { //Aca hago algo }



UART_Read() devuelve el valor que llego.. es de notar que si no existe nada, la funcion se queda esperando que llegue algo ( por lo que si no llega nada se queda colgado ahi )

Ej: Recibi una "A", entonces en la variable recibido se alamcenaria esa "A"
char recibido = UART_Read()


UART_Read_Text(char *Output, unsigned int length)

Es para recibir todo un string, a comparacion del anterior que era una sola letra, ahi especificas el vector donde lo guardas y el largo del string que esperas. Es de notar que usa la anterior funcion por lo tanto si pones que reciba 20 caracteres y envias 10, se va a quedar esperando mas.

char recibido[10]

UART_Read_Text(recibido, 10);
o
UART_Read_Text(&recibido[0], 10);



De todas formas esto es muy simple tanto en la programacion C como en lo que es respecto a la UART ( flag de interrupcion / registros ) y si lo copiaste y pegaste pueda que los registros no sean los mismos o tengas que configurar otras cosas en UART_Init()
« Última modificación: 25 de Febrero de 2015, 22:23:41 por KILLERJC »

Desconectado avumadden

  • PIC10
  • *
  • Mensajes: 3
Re: Ayuda Funsión UART_Read_Text
« Respuesta #2 en: 26 de Febrero de 2015, 00:10:18 »

UART_Read_Text(char *Output, unsigned int length)

Es para recibir todo un string, a comparacion del anterior que era una sola letra, ahi especificas el vector donde lo guardas y el largo del string que esperas. Es de notar que usa la anterior funcion por lo tanto si pones que reciba 20 caracteres y envias 10, se va a quedar esperando mas.

char recibido[10]

UART_Read_Text(recibido, 10);
o
UART_Read_Text(&recibido[0], 10);



Muchas gracias amigo, otra duda: para comparar una string ya definida con  la de entrada, cómo podría hacerla citando "char recibido[10]" como la variable de entrada a comparar?

Código: [Seleccionar]
char recibido[10];
char compara[10]={"1234567890"};

-Cuerpo del programa-

void UART_Text_Read(compara, 10);

if(compara[10] == recibido[10]){
-Haz algo-
}


No se si sea correcto el uso de los arrays de esa manera, ya que casi no tengo experiencia con ellos.
Muchas gracias de antemano KILLERJC
« Última modificación: 26 de Febrero de 2015, 00:29:20 por avumadden »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda Funsión UART_Read_Text
« Respuesta #3 en: 26 de Febrero de 2015, 00:46:12 »
Código: [Seleccionar]
char recibido[10];
char compara[10]="1234567890";

-Cuerpo del programa-

UART_Text_Read(recibido, 10);

//Aqui lo que llego se guarda en "recibido" luego lo comparas... un string son varios caracteres, o usas strcmp() de stdio.h o te haces tu propia funcion

if(ComparaString(compara,recibido,10)){
-Haz algo-
}

Este seria masomenos el codigo del comparar ( lo hice al aire peude que tenga errores )

Código: [Seleccionar]
int ComparaString(char *Array1,char *Array2, uint8_t largo)
{
 for(i=0;i<largo;i++)
  {
   if(Array1[i]!=Array2[i]) { return 0; }
  }
  return 1
}

Basicamente ese codigo pasa por cada una de las letras y las compara, de encontrar una diferencia directamente retorna un 0.
« Última modificación: 26 de Febrero de 2015, 04:45:20 por KILLERJC »