...
char *PRxdata;
char *Pconst;
const char mas = '+';
PRxdata = Rxdata;
Pconst = &mas;
WriteCmdXLCD(0b00000001); // Clear LCD
SetDDRamAddr(0x00);
putrsXLCD("Dato Recibido");
while(i<300){
if(*PRxdata == *Pconst){
//Acción a realizar
}
PRxdata++;
i++;
}
WriteCmdXLCD(0b00000001); // Clear LCD
SetDDRamAddr(0x00);
putrsXLCD("Comparación Hecha");
......
for(i=0;i<5;i++) // 6 elementos del array menos el ultimo que es el caracter nulo.
{
if( dato[i] != buffer[i] )
{
resultado = 0; // Si entro aca es porque es distinto, por lo tanto cargo que es distinto y salgo
break;
}
}......
while(Busy2USART());
while(DataRdy2USART()==0){};
Rxdata[0] = Read2USART(); //Recieve 1 byte
if(Rxdata[0]=='K'){}
while(Busy2USART());
while(DataRdy2USART()==0){break;}
Rxdata[1] = Read2USART();
if(Rxdata[1]=='K'){break;}
...Otro dato que quizás sirva es que la recepción de datos de la USART la debo hacer caracter a caracter, como muestro en el siguiente código:
En tu primer codigo, estas seguro que i es de 16 bits ?...
Ese codigo donde lo tenes puesto? En una interrupcion? No me parece correcto el codigo, ademas el ultimo break del if no se que for/while/do..while estaras intentando salir, ya que del if no sale.
...
while(condicion)
{
while(Busy2USART());
while(DataRdy2USART()==0){};
Rxdata[0] = Read2USART();
if(Rxdata[0]=='K'){break;}
while(Busy2USART());
while(DataRdy2USART()==0){};
Rxdata[1] = Read2USART();
if(Rxdata[1]=='K'){break;}
...
...
...
while(Busy2USART());
while(DataRdy2USART()==0){};
Rxdata[298] = Read2USART();
if(Rxdata[298]=='K'){break;}
while(Busy2USART());
while(DataRdy2USART()==0){};
Rxdata[299] = Read2USART();
condición cumplida;
}
char *PRxdata;
char *Pconst;
const char mas = '+';
PRxdata = Rxdata;
Pconst = &mas;
WriteCmdXLCD(0b00000001); // Clear LCD
SetDDRamAddr(0x00);
putrsXLCD("Dato Recibido");
while(i<300){
if(*PRxdata == *Pconst){
//Acción a realizar
}
PRxdata++;
i++;
}
WriteCmdXLCD(0b00000001); // Clear LCD
SetDDRamAddr(0x00);
putrsXLCD("Comparación Hecha");
...
Primero que 300 es MUCHISIMO!, lo bajaria a 200...
...
Lo podrias haber realizado asi:Código: C...
for(i =0; i<200; i++) { while(Busy2USART()); while(!DataRdy2USART()); Rxdata[i] = Read2USART(); if(Rxdata[i]=='K'){break;} }
Pero es absurdo esperar SI o SI una 'K', el problema es que si no responde una K, eso se queda para siempre ahi. Por lo cual vas a tener que implementar un Timeout. O creo que devuelve \r\n el comando, es decir "OK\r\n", de eso no estoy muy seguro, pero estaria bueno si podes averiguarlo. De esa forma esperas un \n y se simplifica mucho mas la operacion.
Por la otra parte, no nos compliquemos demasiado. No hay ninguna necesidad de usar punteros en ese caso.
Cabe aclarar que en un principio intenté realizar la comparación de manera mas sencilla como KILLERJC lo mostró:Es por ello que estoy bastante perdido.Código: [Seleccionar]...
for(i=0;i<5;i++) // 6 elementos del array menos el ultimo que es el caracter nulo.
{
if( dato[i] != buffer[i] )
{
resultado = 0; // Si entro aca es porque es distinto, por lo tanto cargo que es distinto y salgo
break;
}
}...
y tampoco funciono.
La parte de la recepción de los datos funciona bien de la manera que la estoy realizando.
Lo intenté de esa manera, no funcionó. Por ello lo hice de la forma que mostré.
De todas formas, puede ser que al manipular un arreglo de esa magnitud (300), el compilador entre en conflicto?
El tema es que puedo llegar a recibir hasta 300 caracteres.
Lo que hiciste... con lo hecho con el for es lo mismo, debería funcionar correctamente...
Hasta ahora el unico problema que puede suceder con el codigo pasado ( no se las demas partes), es que no estas recibiendo por una interrupcion, lo cual podes tener un error de overrun al llegar 2 caracteres mientras estas haciendo otra cosa....
Desde la parte del bluetooth imagino ( datos ) , Y espero que los datos recibidos ninguno tenga una 'K', sino seria un problema.
Todo codigo que pase deberia funcionar correctamente.
¿Están las optimizaciones encendidas?.
Sí. Click derecho en el proyecto ==>> propiedades ==>> XC8 ==>> Xc8-gcc (o el compilador que sea) ==>>optimization ==>optimization level.
Si no está a '0' es que están encendidas. Eso puede dar lugar a que el compilador "desordene" algunas instrucciones...
You have compiled in FREE mode.
Using Omnicient Code Generation that is available in PRO mode,
you could have produced up to 60% smaller and 400% faster code.
See http://www.microchip.com/MPLABXCcompilers for more information.
// CONFIG1L
#pragma config WDTEN = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on SWDTEN bit))
#pragma config PLLDIV = 1 // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly))
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable bit (Reset on stack overflow/underflow enabled)
#pragma config XINST = ON // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode enabled)
// CONFIG1H
#pragma config CPUDIV = OSC1 // CPU System Clock Postscaler (No CPU system clock divide)
#pragma config CP0 = OFF // Code Protection bit (Program memory is not code-protected)
// CONFIG2L
#pragma config FOSC = ECPLL // Oscillator Selection bits (EC Oscillator with PLL, CLKO on RA6, ECPLL used by USB)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = ON // Two-Speed Start-up (Internal/External Oscillator Switchover) Control bit (Two-Speed Start-up enabled)
// CONFIG2H
#pragma config WDTPS = 32768 // Watchdog Timer Postscaler Select bits (1:32768)
// CONFIG3L
// CONFIG3H
#pragma config CCP2MX = DEFAULT // ECCP2 MUX bit (ECCP2/P2A is multiplexed with RC1)
#pragma config MSSPMSK = MSK7 // MSSP Address Masking Mode Select bit (7-Bit Address Masking mode enable)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
//Variables
unsigned char Rxdata[] = {"+INQ:9000:4E:EA6EC7,3E010C,7FFF,+OK"};
unsigned int NewLineIndex[9],i=0,j=0;#include <stdio.h>
#include <stdlib.h>
#include <pic18f67j50.h>
#include <xc.h>
#include "fuses.h"
#include "delays.h"
#include <xlcd.h>
#define _XTAL_FREQ 8000000
#define UP PORTDbits.RD0
void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);
int main(int argc, char** argv){
//Oscilator configuration
OSCCONbits.IDLEN = 0;
OSCCONbits.IRCF = 0b111;
OSCCONbits.OSTS = 0;
OSCCONbits.SCS = 0b00;
//Pin configuration
TRISDbits.RD0=1; //Superior
TRISDbits.RD3=1; //Inferior
//LCD Configuration
OpenXLCD(FOUR_BIT & LINES_5X7); // A 4 bit o I/O y a 5x7
while(BusyXLCD()); // Esperamso a que el Lcd este disponible
/* Table of LCD's posittion
* ===============================================
* |00|01|02|03|04|05|06|07|08|09|0A|0B|0C|0D|0E|0F|
* ===============================================
* |40|41|42|42|44|45|46|47|48|49|4A|4B|4C|4D|4E|4F|
* ===============================================
*/ WriteCmdXLCD(0b00000001); // Clear LCD
SetDDRamAddr(0x00); // Address 04
putrsXLCD("USART v4.4");
SetDDRamAddr(0x40); // Address 04
putrsXLCD("RSSIDataBase");
WriteCmdXLCD(0b00000001); // Clear LCD
SetDDRamAddr(0x00);
putrsXLCD("Presione el");
SetDDRamAddr(0x40);
putrsXLCD("superior");
while(1){
if(UP == 1){
while(UP == 1){};
WriteCmdXLCD(0b00000001); // Clear LCD
SetDDRamAddr(0x00);
putrsXLCD("PELOTUDO");
while(i<40){
if(Rxdata[i] == '+'){
NewLineIndex[j]=i;
j++;
}
i++;
}
WriteCmdXLCD(0b00000001); // Clear LCD
SetDDRamAddr(0x00);
putrsXLCD("Comparacion Hech");
}
}
return (EXIT_SUCCESS);
}
// Delays for LCD's driver
void DelayFor18TCY(void)
{
Delay10TCYx(120);
}
void DelayPORXLCD(void)
{
Delay1KTCYx(180);
return;
}
void DelayXLCD(void)
{
Delay1KTCYx(60);
return;
}
#pragma config XINST = ON // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode enabled)SOLUCIONADOO!!!!
Estimado KILERJC, al desactivar el set extendido de instrucciones el problema se solucionó. La verdad no tengo mucho conocimiento sobre que es eso, pero me voy a poner a investigar... Desde ya, muchísimas gracias. Me has dado una ayuda enorme!