View previous topic :: View next topic |
Author |
Message |
ILLIAS28
Joined: 11 Jan 2011 Posts: 42
|
can't detect that an sms is received by gsm |
Posted: Sun Mar 30, 2014 9:11 am |
|
|
Hi everybody,
I am using a pic16f876 with a gsm (old Siemens mc60 cell phone) to make an sms controller. I can now send AT commands, send and receive sms. But the problem is i can't detect the reception of sms even though i have configured the gsm with the AT command "at+cnmi=1,1". I tested with my pc and hyperterminal and it's ok, when i receive an sms, i get this on the screen:
"+cmti: "ME",4
But when i connect the gsm with my pic nothing happens. Here is the code for testing that. Could you please help me?
Code: |
#include <16F876.h>
#device PASS_STRINGS=IN_RAM
#fuses XT NOWDT NOPUT NOPROTECT BROWNOUT NOLVP NOCPD NOWRT NODEBUG
#use delay(clock=4000000) // you must use this line because the LCD.C use //the delay_us() functions
#use rs232(baud=9600,UART1, ERRORS)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define use_portb_lcd TRUE
#include <lcd.c>
void main()
{
int i;
char *reponse , buffer[86],test[14];
unsigned char rec_data;
//int lon;
SET_TRIS_A( 0xFF );
lcd_init();
lcd_putc('\f');
printf(lcd_putc,"hallo");
DELAY_ms(3000);
reponse=NULL;
lcd_putc('\f');
printf(lcd_putc,"initialisation..");
DELAY_ms(3000);
printf("at\r"); //send AT command
i=0;
do
{
rec_data=getc();
}
while(rec_data!='\n');
do
{
rec_data=getc();
buffer[i]=rec_data; //save response in a string
i++;
}while(rec_data!='K');
buffer[i]='\o';
reponse=strstr(buffer,"OK");//test if response is OK
if (reponse == NULL)
{
lcd_putc('\f');
printf(lcd_putc,"error");
DELAY_ms(3000);
}
else {
i=0;
lcd_putc('\f');
printf(lcd_putc,"ready"); //if response is "ok" display "ready" on lcd and configure gsm
DELAY_ms(3000);
printf("ate0\r");
DELAY_ms(300);
printf("at+cpms=""ME""\r");
DELAY_ms(300);
printf("at+cnmi=1,1\r");
DELAY_ms(300);
}
lcd_putc('\f');
printf(lcd_putc,"waiting for sms");
DELAY_ms(3000);
for(;;)
{
if(kbhit()) //if sms received by gsm
{
i=0;
do
{
rec_data=getc();
buffer[i]=rec_data; //save response in a string
i++;
}
while(i!=20);
buffer[i]='\0';
reponse=strstr(buffer,"+C");
strncpy(test,reponse,13);
test[13]='\0';
lcd_putc('\f');
printf(lcd_putc,test); //dislay AT command response on lcd
DELAY_ms(3000);
rec_data=test[12];
lcd_putc('\f');
lcd_putc(rec_data);
DELAY_ms(2000);
}
lcd_putc('\f');
printf(lcd_putc,"waiting for sms");
}
} |
_________________ i am newbe |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19366
|
|
Posted: Sun Mar 30, 2014 9:27 am |
|
|
In C, you escape a double quote as \", not as "". |
|
![](templates/subSilver/images/spacer.gif) |
ILLIAS28
Joined: 11 Jan 2011 Posts: 42
|
|
Posted: Sun Mar 30, 2014 9:41 am |
|
|
Thanks Ttelmah,
I have corrected this error, but the problem is always the same. Should I use the #INT_RDA interruption or kbhit() ?
Many thanks. _________________ i am newbe |
|
![](templates/subSilver/images/spacer.gif) |
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sun Mar 30, 2014 5:02 pm |
|
|
#int RDA has several advantages over the use from kbhit(). Most important advantage is that you can receive a lot more data while the processor is doing other things like delay_ms for the display. With kbhit() you only have the 2 or 3 characters in the hardware buffer. Have a look at the example program ex_sisr.c, this uses a circular buffer approach.
One error I noticed in line 50:Here you use letter 'o' instead of number '0'. |
|
![](templates/subSilver/images/spacer.gif) |
ILLIAS28
Joined: 11 Jan 2011 Posts: 42
|
|
Posted: Sun Mar 30, 2014 5:48 pm |
|
|
Thank you ckielstra,
You are right, it was a o and not a 0. I have used #int_rda and it's working good. _________________ i am newbe |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19366
|
|
Posted: Mon Mar 31, 2014 12:45 am |
|
|
At least you move forward with hints.
Everyone will make this sort of error. Especially if you switch between languages (the "" escape is common in some others). Key thing is to learn to be really 'suspicious' when things don't work, and look three times. Often even better, 'go away' and do something else (not to do with computing), and then come back and read the code again, and try to 'think' as you read, whether you are sure about the syntax. I find 'physical' things, like log chopping, or a bike ride, are the best debugging tool there is!....
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
temtronic
Joined: 01 Jul 2010 Posts: 9173 Location: Greensville,Ontario
|
|
Posted: Mon Mar 31, 2014 5:21 am |
|
|
I agree with Mr. T's comments though I'm really, really tired of 'debugging using a snow shovel'!
I would like to add that you should put a 'delay_ms(500);' just before the 'lcd_init();'
This allows the LCD module to power up/get organized before the PIC tries to access it. It's been reported here that different modules take longer than others and might no work as expected. The delay might only need to be 100-250ms, but I've always used 500ms and never had an LCD issue.
Another hint is to have incremental backups of your code. Every time you make a change, copy the old program to a new program, make changes in the new one, save the new one.This way you can go back to what was working code. Making a few changes to the same program can cause hair pulling problems. A simple misspelling, a : instead of a ;, etc' can be hard to track down. We've all done it.
cheers
Jay |
|
![](templates/subSilver/images/spacer.gif) |
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Wed May 14, 2014 8:59 am |
|
|
That response is telling you where the sms is located.
I did not see in your code you giving any commands to read the SMS:
for that command you need to provide an address which would be in this case "4".
G _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|
![](templates/subSilver/images/spacer.gif) |
ILLIAS28
Joined: 11 Jan 2011 Posts: 42
|
|
Posted: Tue May 27, 2014 10:10 am |
|
|
many thank's to all of you for your help _________________ i am newbe |
|
![](templates/subSilver/images/spacer.gif) |
|