![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
ILLIAS28
Joined: 11 Jan 2011 Posts: 42
|
sms read from gsm module |
Posted: Sun Feb 25, 2018 11:46 am |
|
|
Could you please help me ?
I am interfacing a gsm module sim800l with pic18f252 in order to receive sms, read it, decode it and control some devices. Everything is ok for short messages, but it doesn't work for long messages. Here is the message i want to receive
[img]https://ibb.co/h5WDnc [/img]
I have tried to read it and parse it but I only get the first 212 characters. Can someone help me to resolve this problem? Here is the code i have written to read and display on a 2x16 lcd, line by line (16 characters at a time).
Thank you very much.
Code: |
#include <18F252.h>
#device PASS_STRINGS=IN_RAM
#fuses HS,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG
#use delay(clock=16000000)
#use rs232(baud=57600,UART1,BITS=8,XMIT=PIN_C6,RCV=PIN_C7,PARITY=N,STOP=1,ERRORS)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define use_portb_lcd TRUE
#include <lcd.c>
#byte PortA = getenv("SFR:PORTA")
#byte Portc = getenv("SFR:PORTC")
int ndxint,a,poussoir;
char *reponse , buffer[694],test[18],stTemp[2],buf[695];
unsigned char ndxcar=0;
long i,j,k;
#INT_RDA
void SerialInt()
{
buffer[i]=getchar();
i++;
}
//!//initialisation et configuration gsm
//__________________________________________________________________
void main()
{
i=0;
j=1;
k=0;
a=0;
SET_TRIS_A(0x00);
SET_TRIS_B(0x00);
SET_TRIS_C(0xFF);
PORTA=0x00;
DELAY_ms(1000);
lcd_init();
lcd_putc('\f');
printf(lcd_putc,"salut");
DELAY_ms(1000);
i=0;
reponse=NULL;
memset(buffer,NULL,694);
memset(buf,NULL,694);
ENABLE_INTERRUPTS(GLOBAL); // Enable Interrupts
ENABLE_INTERRUPTS(INT_RDA);
DELAY_ms(3000);
reponse=NULL;
lcd_putc('\f');
printf(lcd_putc,"connecting...");
DELAY_ms(1000);
do {
printf("at\r");
DELAY_ms(200);
reponse=strstr(buffer,"OK");//test if gsm is responding
}while (reponse == NULL);
memset(buffer,NULL,694);
lcd_putc('\f');
printf(lcd_putc,"configuring GSM"); //if response is "ok" display "configuring gsm" on lcd and configure gsm
DELAY_ms(1000);
printf("AT+CMGF=1\r");
DELAY_ms(5000);
memset(buffer,NULL,694);
printf("AT+CPMS=\"SM\",\"SM\",\"SM\"\r");
DELAY_ms(5000);
memset(buffer,NULL,694);
printf("AT+CMGD=1,4\r");
DELAY_ms(5000);
printf("AT+CMGDA\r");
DELAY_ms(7000);
memset(buffer,NULL,694);
printf("AT+CNMI=2,1,0,0,0\r");
DELAY_ms(7000);
memset(buffer,NULL,694);
i=0;
reponse=NULL;
memset(buffer,NULL,694);
memset(buf,NULL,694);
//attente sms
//__________________________________________________________________________
for(;;)
{
lcd_putc('\f');
printf(lcd_putc,"WAITING FOR SMS");
DELAY_ms(2000);
do
{
reponse=strstr(buffer,"+CMTI");//detect reception message
}while(reponse == NULL);
lcd_putc('\f');
printf(lcd_putc,"%li",i);
DELAY_ms(5000);
strncpy(test,reponse,13);
test[13]='\0';
lcd_putc('\f');
printf(lcd_putc,test); //display reponse a la reception sms on lcd(+CMTI:"sm",1)
DELAY_ms(2000);
//extraire index sms
//___________________________________________________________________________
ndxcar=test[12];
sprintf(stTemp,"%c",ndxcar);
ndxint = atoi(stTemp);
lcd_putc('\f');
lcd_putc(ndxCAR);
DELAY_ms(2000);
i=0;
memset(buffer,NULL,694);
DELAY_ms(1000);
DELAY_ms(1000);
//read and display sms
//_____________________________________________________________________________
lcd_putc('\f');
printf(lcd_putc,"reading sms");
printf("AT+CMGR=%d\r",ndxint);
DELAY_ms(10000);
lcd_putc('\f');
printf(lcd_putc,"%li",i);
DELAY_ms(5000);
do
{
reponse=strstr(buffer,"(25");//detect begin of message
}while(reponse == NULL);
strncpy(buf,reponse,520);
buf[521]='\0';
lcd_putc('\f');
for(j=1;j<=520;j++)
{
if(j%3==0)
j++;
test[a]=buf[j];
a++;
if(a==16)
{
printf(lcd_putc,test);
do
{
poussoir=(portc & 0x01);
DELAY_ms(300);
}while (poussoir==0);
a=0;
k++;
if(k==2)
{
lcd_putc('\f');
k=0;
}
else{lcd_putc('\n');}
}
}
j=1;
a=0;
//!//effacer sms
//!//_____________________________________________________________________________
i=0;
lcd_putc('\f');
printf(lcd_putc,"erasing sms" );
printf("AT+CMGD=%d\r",ndxint);
DELAY_ms(6000);
reponse='\0';
memset(buffer,NULL,694);
memset(buf,NULL,694);
DELAY_ms(1000);
i=0;
}
} |
_________________ i am newbe |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19369
|
|
Posted: Sun Feb 25, 2018 12:07 pm |
|
|
It's probably not totally your code (use the code buttons...).
What is the limit on length for an SMS message?. It varies with IP's, but used to be 160 characters, anything longer was sent as multiple messages of 153 characters. This was why Twitter had the limit at 140 characters (they use 20). It has now been extended, but it is unwise to actually rely on a message being longer than this.
However your serial interrupt code is flawed. I'm surprised it works at all. |
|
![](templates/subSilver/images/spacer.gif) |
ILLIAS28
Joined: 11 Jan 2011 Posts: 42
|
|
Posted: Sun Feb 25, 2018 1:16 pm |
|
|
thank you for your response Ttelmah,
i didn't understand what do you mean with"use the code buttons".
but why i receive the full message on my smartphone?
is there a solution for this problem?
thank you once again
++++++++++++++
Code block added.
- Forum Moderator
++++++++++++++ _________________ i am newbe |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19369
|
|
Posted: Sun Feb 25, 2018 1:19 pm |
|
|
When posting code, use the Code button before the code, and then the button again afterwards. Otherwise it becomes almost unreadable.
Your phone will automatically assemble the multiple messages. You are going to have to do the same. |
|
![](templates/subSilver/images/spacer.gif) |
ILLIAS28
Joined: 11 Jan 2011 Posts: 42
|
|
Posted: Sun Feb 25, 2018 3:57 pm |
|
|
ok i have understand, and thank you very much _________________ i am newbe |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Feb 25, 2018 4:43 pm |
|
|
Another way to do code blocks is to highlight all your code with the
mouse. Hold down your left mouse button and sweep your mouse
over your code to highlight it. Then press the code button once.
This will put the Code and /Code markers at the start and end of the block. |
|
![](templates/subSilver/images/spacer.gif) |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|