comportamiento extraño de la función strstr en PIC18F

0

Estoy usando el compilador PIC18F2520 y C18 . Estoy tratando de comunicarme con SIM900. Estoy usando la interrupción para recibir datos. Entonces, cuando estoy enviando AT+CMGF? SIM900 respuesta con +CMGF=1 . Estoy almacenando estos datos en un búfer dentro de ISR y luego llamo a una función para verificar.

void rx_handler(void)
{
  Rx[k] = ReadUSART();   //read byte and save it in Rx


  if(Rx[k]=='\r')        //if carriage return is received, stop reading
  {
     LATCbits.LATC2=1;   // turn on led to indicate we have received everything

     process();         // call function to check the received data
  }
  k++;                   //increment k
}

void process()
{
  if(strstr(Rx,"+CMGF:") != NULL)  //if rx data contains +CMGF 
  {
     UARTSend("Data Match");
  }
  else
  {
    UARTSend("Data not found");
  }

  memset(Rx,0,sizeof(Rx);    //clear Rx
}

El problema al que me estoy enfrentando es que no coincide con los datos. Pero cuando detengo el depurador y veo el contenido de Rx , muestra +CMGF: 1 . No sé por qué la función strstr no funciona. También puedo verificar cada byte uno por uno, pero sería un proceso muy largo. ¿Alguien puede por favor decirme el error. Por favor ayuda.

    
pregunta S Andrew

4 respuestas

1

Como todo el mundo ya ha respondido la pregunta correcta. Me gustaría añadir un punto más. Encontré esto extraño al tratar con C18 Compiler

Si la función no funciona como se esperaba, intente incluir const far rom char

strstrrampgm(Rx,(const far rom char *)"+CMGF:") !=NULL);

Me gusta para sprintf

sprintf(data,(const far rom char *)"Hello %s",str);
    
respondido por el Aircraft
1

Quizás este es el problema:

Rx[k] = ReadUSART();   //read byte and save it in Rx
k++;                   //increment k

if(Rx[k]=='\r')        //if carriage return is received, stop reading

Cuando llegas a la declaración if , ya has incrementado k , por lo que no estás verificando el carácter que acabas de leer, pero la basura está en el búfer desde la última vez.

    
respondido por el Roger Rowland
1

Como puede ver en el monitor de serie, "+ CMGF" está precedido por "\ r \ n". Ahora imagine que su código encuentra primero '\ r' y luego llama a process (), que a su vez borra el búfer con memset (independientemente del resultado de strstr). Pero no restablece la variable de índice 'k', por lo que el próximo carácter recibido no se colocará al inicio del búfer, sino en algún lugar en el medio donde estaba k. Esto lleva a que el búfer tenga cero como 1er carácter, es una cadena vacía y es por eso que strstr "no funciona" (@DoxyLover señaló eso).

La adición de k=0; después de memset solucionará esto.

También después de Rx[k] = ReadUSART(); agregue Rx[k+1] = 0; para que la cadena termine correctamente. También se deben agregar controles de desbordamiento de búfer.

    
respondido por el Flanker
0

Agregue una terminación nula después de que obtenga '\ r' y vuelva a verificar. Si eso tampoco funciona, intente escribir su propia implementación para verificar si es un problema con la biblioteca. He tenido funciones de biblioteca de experiencia similares en MPLAB mientras uso strstr. Escribir mi propia implementación resolvió el problema.

    
respondido por el agnishant

Lea otras preguntas en las etiquetas