TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: smxabi en 22 de Abril de 2006, 17:34:37
-
Me dirijo a los expertos, ya que estoy empezando con el C para PIC. Mi problema es el siguiente: un modem GSM envía la siguiente secuencia en hexa: (lo veo con el hyperterminal)
07914306090969F5040B914336793446F800006020410135924009416650DA0C829E4E
Estoy tratando de averiguar si en esa secuencia se encuentra el string siguiente: 416650DA0C829E4E (si se encuentra y al final). Son formatos PDU de un SMS
Para ello:
include <16F876.h>
#include <string.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#define buffer_size 64
char buffer[buffer_size];
int next_in = 0;
int si_find=0;
char alarma_on[9] = {0x41,0x66,0x50,0xDA,0x0C,0x82,0x9E,0x4E,0x00}; Es preciamente el string que se busca
...
capturo el buffer
#int_rda
void serial_isr() {
int t;
buffer[next_in]=getc();
t=next_in;
next_in=(next_in+1) % buffer_size;
if(next_in==0 )
next_in=t;
y ahora em main() busco el string
si_find= strstr(buffer,alarma_on);
if (si_find != 0)
{
puts("Encontrado");
Pero resulta que no lo encuentra. ¿ Que estoy haciendo mal ?
Gracias adelantadas
-
Fijate que el string que recibes del modem GSM son caracteres ASCII. Debes agrupar 2 caracteres , convertirlos en HEXA para luego recien obtener el dato que deseas leer.
Por ejemplo 41 , no es 0x41. Es un '4' y un '1', debes hacer una rutina que te permita hacer la conversion.
Sino, al comparar siempre te dará que son diferentes.
La otra opcion es que directamente compares con el string "410135924009416650DA0C829E4E".
Saludos
-
Gracias Maunix por tu ayuda.
Pero sigo muy confuso. En VB logré que todo el tinglao que tengo montado funcionara. Para ello lo que recibía del modem entraba en un buffer de string. El string a comparar lo hacía así:
alarma_on = Chr$(65) & Chr$(102) & Chr$(80) & Chr$(218) & Chr$(12) & Chr$(130) & Chr$(158) & Chr$(78) en donde cada caracter hexa 0x41 lo convertía a decimal y luego a string mediante la función chr$. Luego hacia una inspección del buffer con alarma_on
Pero con C no veo como hacerlo.
Si defino
char alarma_on[17] = "416650DA0C829E4E" // por lo visto el nº de caracteres del array hay que aumentarlo en 1 para el 0x00
¿Puedo hacer directamente la busqueda en buffer?
Estoy utilizando ccs c y no puedo hacer tracer del programa. Por eso mi confusión. He encargado a USA, a CCS una tarjeta para hacer el debugging del programa. Sin eso estoy ciego
Gracias adelantadas desde Asturias - España
-
Si defines un array de char. y cada char es una letra no hace falta que incrementes en 1 el 0x00.
Y si podrias comparar byte a byte y listo, asunto solucionado ;)
-
Me ha sido muy util tu ayuda. El error fundamental era un puntero y que los caracteres que recibia del modem eran un string (no hexa). Me estaba confundiendo con otro proyecto que hice con NOKIA F-BUS en VB6
Ahora me queda así y si funciona (al menos en VC++)
char str[] = "416650DA0C829E4E";
char string[] = "07914306090969F5040B914336793446F800006020410135924009416650DA0C829E4E";
int main( void )
{
char *puntero;
puntero = strstr( string, str );
if ( puntero != NULL )
puts( "Encontrado" );
}
Muy agradecido
Javier
-
A veces un problema muy simple se manifiesta como algo grave y eso nos hace pensar que estamos haciendo todo mal! :) pero como viste era solo algo sencillo.
Me alegro lo hayas solucionado.
Saludos