TODOPIC

FORO TÉCNICO => Telefonía, GPS y Microcontroladores => Mensaje iniciado por: andy_andy en 16 de Abril de 2013, 15:00:45

Título: Recepcion de mensajes PIC16f876 y modulo SIM340
Publicado por: andy_andy en 16 de Abril de 2013, 15:00:45
Hola gente  :)
Estoy realizando un proyecto con el modulo SIM340DZ, que consiste en recibir un mensaje que contiene un numero de celular (vale aclarar que el mensaje es un numero de celular, y no me interesa por el momento el numero que envio el mensaje),  el numero de celular que recibo debo guardarlo en la memoria de contactos del SIM, estuve viendo varios proyectos y mas que todo me base en este hilo:
 http://www.todopic.com.ar/foros/index.php?topic=39570.0
Mi problema es que cuando quiero guardar el numero no guarda nada o guarda solo una parte del numero... Este es mi codigo:

void  procesa_SMS(void){
char  delimitante1[] = "\r\n";
char  delimitante2[] = ",:\n";
char  T[]="T";
char  N1[]="1";

 strcpy(AUX_buffer, USART_buffer);
 ptr = strtok(AUX_buffer, delimitante1);        
 ptr = strtok(NULL, delimitante1);
 strcpy(SMS_Buffer, ptr);
 ptr = strtok(SMS_buffer, delimitante2);
 if(strncmp(ptr,T,1)==0){
     ptr=strtok(NULL,delimitante2);
     if(strncmp(ptr,N1,1)==0){
          ptr=strtok(NULL,delimitante2);
          fprintf(SIM300,"AT+CPBW=,\"%s\",,\"numero1\"\n\r",ptr);
          delay_ms(500);
          responde_OK();
     }
 }
}

 
Lo demas es muy similar a lo que publico jonathanPIC888.
Estuve utilizando el pic16f876 ya que tengo varios pero la memoria ram es muy limitada asi que cambie al pic18f2550 ya que tenia algunos en casa, pense q ese era el problema pero sigue sin guardar adecuadamente el numero, me llega cortado y a veces no llega nada!
El formato de envio del mensaje seria:
T,1:XXXXXXXX  (en vez de XXXXXXXX escribimos el numero a guardar en la memoria SIM)

Si alguien podria darme una sugerencia de la posible falla estaria muy agradecida  :)

SALUDOS!!





                 
Título: Re: Recepcion de mensajes PIC16f876 y modulo SIM340
Publicado por: vdiazg en 01 de Mayo de 2013, 04:03:49
no puedo creer que el PIC16F876, te quede chico de ram, lo primero que debes hacer es crear 2 buffer de recepcion para los mensajes; al usar ese pic, el compilador te permitira maximo 80 bytes por cada cadena (con eso suficiente); al recibir el mensaje que lo guarde en la primera cadena, cuando se llene que continue en la 2da y listo, luego solo queda recuperar el mensaje que no pasara de esos 80 bytes. la funcion que uso para guardar es:

Código: [Seleccionar]
printf("AT+CPBW=,\"%s\",129,\"OK%s\"\r",new_tel,new_tel);    //AT+CPBW=,"123456789",129,"OK123456789"
es decir el numero que esta almacenado en new_tel, lo guardo como "OKxxxxxxxxx", en mi pais los moviles son de 9 digitos

intenta con eso, sino te paso mas partes del codigo para que puedas entender mejor





                 
[/quote]
Título: Re: Recepcion de mensajes PIC16f876 y modulo SIM340
Publicado por: vdiazg en 17 de Mayo de 2013, 16:36:18
parece que ya soluciono su problema, al menos comente como le fue Sr. Evo
Título: Re: Recepcion de mensajes PIC16f876 y modulo SIM340
Publicado por: Abner_emanuel en 23 de Enero de 2015, 09:35:51
Un saludo amigos ya hace tiempo le vengo dando vueltas al asunto de capturar el numero celular de una llamada entrante en el módem, yo utilizo el módem wavecom.

Con el comando AT+CLIP=1 en el módem me contesta lo siguiente cada vez que entra la llamada:

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

RING

+CLIP: "2464233991",129        // Los 10 números "1234567891" son los de un numero celular

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


Lo que yo e pretendido hacer es recortar solo el numero telefónico de esa llamada entrante de 10 dígitos (2464233991).

He visto que ustedes oponen algo similar pero para captura de mensajes, que supongo es similar para lo que yo requiero, sin embargo no e podido hacer esa captura del numero celular,
me podrían orientar en lo que necesito por favor.


Actualmente tengo implementado este código que captura la palabra RING de la llamada entrante y realiza una serie de cosas mas, pero como comento no e podido capturar el numero telefónico entrante.

Código: ActionScript
  1. #include <18F4550.h>
  2.          #device *=16
  3.          #priority rda  
  4.          #include <math.h>
  5.          #include <string.h>
  6.          #fuses PLL1,CPUDIV1,USBDIV,XTPLL,NOFCMEN,NOIESO,PUT,NOBROWNOUT,VREGEN,NOWDT,WDT32768,NOPBADEN,MCLR,NOSTVREN,NOLVP,NODEBUG,PROTECT,NOSTVREN,NOCPB,NOWRT      
  7.          #use delay(clock=48000000,RESTART_WDT)
  8.          #include <lcd4x20.c>
  9.          #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, PARITY=N, BITS =8, STOP=1, TIMEOUT=1000, ERRORS)
  10.          #byte porta = 0xF80 #byte portb = 0xF81 #byte portc = 0xf82 #byte portd = 0xf83 #byte porte = 0xf84
  11.          #define buffer_size 160    
  12.          #bit TRIS_RC0 = 0xF94.0
  13.          #bit LATC0    = 0xF8B.0                                           // Buffer size you can adjust this size
  14.          #define LED1 LATC0
  15.          
  16.          char  tel[11]="3331562606";
  17.          char buffer[buffer_size];                                         // Datos seriales
  18.          char c=0x00;                                                      // Last characters recived  
  19.          int  xbuff=0x00;                                                  // Buffer
  20.          int i,j;
  21.          unsigned int16 seg=0,min=0,hrs=0;
  22.          int1 desborde=0;  
  23.          char num[11];
  24.          void lee_sms(void);
  25.          void reloj(void);
  26.          void erase_buffer(void);
  27.          void init_sim900(void);
  28.          void iniciamensaje(void);
  29.  
  30.          #int_RDA
  31.          RDA_isr() {c=getc(); if (xbuff >= buffer_size) {xbuff=0;} else{  buffer[xbuff++]=c;} return 0;}
  32.        
  33.          #INT_RTCC                                    
  34.          void clock_isr() { set_timer0(19531); desborde=1; }        
  35.          
  36.          
  37.          void main(void)
  38.          {  lcd_init();
  39.          setup_adc_ports(NO_ANALOGS);
  40.          setup_adc(ADC_OFF);
  41.          setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256);
  42.          set_timer0(19531);        
  43.          enable_interrupts(INT_RTCC);
  44.          enable_interrupts(INT_RDA);
  45.          enable_interrupts(GLOBAL);
  46.          set_tris_a(0x00);  
  47.          output_a(0x00);
  48.          TRIS_RC0=0; desborde=0;
  49.          erase_buffer();  
  50.          init_sim900();
  51.          iniciamensaje();                                                  // Funcion para enviar sms                  
  52.          erase_buffer();
  53.          
  54.          
  55.          for(;;)
  56.          { if (buffer=='"'){j++;{num[(j++)-2]=buffer;}lcd_gotoxy(1,2); printf(lcd_putc,"%c",buffer);} reloj(); lee_sms(); }}
  57.  
  58. ////////////////////////////////////////////////////////////////////////////////
  59.  
  60.          void lee_sms(void)
  61.          {    
  62.          char *ptr;
  63.          char llamada[]="RING";
  64.          
  65.          ptr=strstr(buffer,llamada);
  66.          if(strncmp(ptr,llamada,4)==0) { output_high(PIN_A0); delay_ms(2000); output_low(PIN_A0); output_high(PIN_A1); delay_ms(3000); output_low(PIN_A1);
  67.          erase_buffer(); init_sim900(); erase_buffer(); }return; }
  68.                  
  69. ////////////////////////////////////////////////////////////////////////////////
  70.          
  71.          void erase_buffer(void)
  72.          { int i; for(i=0;i<buffer_size;i++) { buffer[i]=0x00; } xbuff=0x00; c=0x00; return; }
  73.          
  74.          
  75.          void init_sim900(void)
  76.          { int i; for (i=0;i<=95;i++) { LED1=~LED1; delay_ms(200); } LED1=0; delay_ms(800); return; }
  77.              
  78.              
  79.          void iniciamensaje(void)                                                  
  80.          { printf("AT+CMGS="); for(i=0;i<=9;i++) {putc(tel[i]);} printf("\r"); delay_ms(100);        
  81.            printf("¡ TARGETA GSM LISTA !...\r\n"); delay_ms(500); printf("\x1A"); return; }   // Mensaje a enviar, 26 en ascii es ctrl z = enter.
  82.          
  83.          
  84.          void reloj(void)
  85.          { if(desborde==1) {desborde=0; seg++;} if(seg>59){seg=0; min++;} if(min>59){hrs++; min=0;}
  86.            if(hrs==00 && min==02 && seg==00){hrs=0; min=0; seg=0; output_high(pin_a1); delay_ms(2000); output_low(pin_a1); erase_buffer();}}
  87.          
  88. /////////////////////////////////////