Autor Tema: Ayuda con msj bluetooth  (Leído 2391 veces)

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

Desconectado BINS

  • PIC10
  • *
  • Mensajes: 5
Ayuda con msj bluetooth
« en: 21 de Agosto de 2016, 20:59:44 »
Hola desde ya muchas gracias por leer mi consulta.. Estoy teniendo problemas para recibir un string por la USART del pic que se lo envio desde una aplicacion en android a traves de bluetooth... Estoy usando la funcion gets(string) pero no he tenido suerte para hacerlo funcionar. he agregado desde app inventor la caracteristica de enviar al final de mi texto , el numero 13, haciendo referencia al retorno de carro, nose si eso sirve, tmb prove enviando al final del texto un '0' pero tmp tuve suerte, tambien agrego desde app inventor la caracteristica de que me envie la longitud de mi texto en la primera posicion del string, para luego utilizar ese dato.. en el codigo de ccs trabajo por medio de interrupcion RDA. del pic 16f886.
Tmb para comprobar lo que envia el modulo bluetooth al pic estoy usando un convertidor de rs232 a USB para ver a traves de octoplus.. y todo indica que lo que yo mando desde mi aplicacion (pasa por el bluetooth y de ahi al pic) le llega bien al pic, solo que recibo o leeo mal..
EJ: si mando HOLA desde mi aplicacion , lo que recibo siguiendo lo que explique en las caracteristicas de mi aplicacion es..
4HOLA13....si alguien me puede dar una mano se lo voy agradecer, hace dias q reniego con esto...

Adjunto el codigo q estoy usando

#include <16F886.h>
#use delay(clock=8000000)

#include <string.h>
#include <stdio.h>
#include <stdlib.h>


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
//#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOIESO                   //Internal External Switch Over mode disabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected                    //Master Clear pin enabled

#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use rs232(baud=38400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

int L,i,c;
char cadena[6];
char segunda[6];


#int_rda
void bluetooth(){
    gets(cadena);
    L=cadena[0];
             for(i=1;i<(L+1);i++){
                segunda[i-1]=cadena;
            }
}

void main() {
    set_tris_b(0x00);                             
    set_tris_a(0x00);
    set_tris_c(0x00);
    output_b(0x00);                                 
    output_a(0x00);
    output_c(0x00);
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_RDA);
 L=3;
   
    while(TRUE){

         if(L==2){

                            output_high(PIN_A1);
                            delay_ms(150);
                            output_low(PIN_A1);
                            delay_ms(150);
          }
         if(L==3){
                        output_high(PIN_B1);
                        delay_ms(400);
                        output_low(PIN_B1);
                        delay_ms(400);
         }
}
}


L seria la longitud de lo que envio , siguiendo el ejemplo seria 4.. Este codigo esta en bese a L pero lo que necesito en realidad es el texto.. osea el "HOLA"

Desde ya muchas gracias por su tiempo.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda con msj bluetooth
« Respuesta #1 en: 21 de Agosto de 2016, 22:24:50 »
El gets() se queda esperando encerrado ahi hasta que llegue un 13 como decis, pero OJO, no un numero 13 ( que serian un '1' y un '3' ) sino el numero 13 decimal o si lo queres en hexa 0xD

Lo correcto seria : '4','H','O','L','A',0xD

Voy a nombrar varias cosas que para mi estan mal:

En una interrupcion no deberias tener un loop infinito como es gets(); , deberias tomar el dato con getch y salir, cuando detectas el 0xD realizas la copia. Algo asi (hecho rapidamente no se si esta bien y tal ves rebuscado):


Código: C
  1. int8 indice = 0xFF;
  2.  
  3. #int_rda
  4. void bluetooth(void)
  5. {
  6.         // Me aprovecho del overflow asi de 0xFF pasa a 0x00
  7.         // Y no tengo que complicarla
  8.  
  9.         indice++;
  10.  
  11.         // Guardo
  12.         cadena[indice] = getch();
  13.  
  14.         //  Reviso si llego el final
  15.         if(cadena[indice] == 0xD)
  16.         {
  17.                 // Cierro el string
  18.                 cadena[indice] = 0x0;
  19.                 // Copio al segundo, no uso el dato de longitud
  20.                 for(i = 1; i < 6; i++ )
  21.                 {
  22.                         segunda[i-1] = cadena[i];
  23.                 }
  24.                 // Indice con valor 0xFF, asi la proxima ves que entra ese 0x00
  25.                 indice = 0xFF;
  26.         }
  27.  
  28.         // Proteccion contra buffer overflow
  29.         if(indice >= 6 && indice != 0xFF)
  30.         {
  31.                 indice = 0xFF;
  32.         }
  33. }


Observa unas cosas, proteccion contra overflow, es decir si el array tiene 6 lugares (de 0 a 5) no deberia pasar de eso,

La otra en el for que vos usas la L, aca tenes 2 errores, Suponer un que '4' es 4, lo cual no lo es , sino que es 0x34 o 52 en decimal. A no ser que enviaste 0x4 y no '4'.
Y la otra es esperar que L este dentro de los valores del array (0 a 5), si en algun momento llega un valor como 20 estarias escribiendo lugares que no deberias.

En tu main luego ahces L == 2, pero no se si es L == '2'.

Todo esto suponiendo que realmente estes recibiendo algo.

----------------------------------------------------------------------------

Para verificar que el PIC recibe correctamente podes hacer que TODO lo que reciba lo envie de vuelta, de esa forma en tu aplicacion deberias recibir el mismo texto.

#int_rda
void bluetooth(){
    putc(getc());
}

De esa forma sabes si lo que llego es correcto


 

anything