|
|
View previous topic :: View next topic |
Author |
Message |
sareehy
Joined: 03 May 2016 Posts: 20
|
problem in getting a set of characters from string?! |
Posted: Tue May 03, 2016 4:22 pm |
|
|
Hi ,
I need to set date & time of the real time clock connected to PIC.
I want to use a GSM in my project to control some devices also to set the real time clock with the correct time and date via sms
The first thing I did was write a program to get the time & date from the received sms.
The received string of the new message has the following form:
+CMT: "+00962780055097","+962788990088","16/04/30,18:42:37+08",20
CLOCK=16/05/03,19:50:00
I need to get the characters after '=' character which are represent the date and time to be set
But i faced a problem to get those characters. When I tried to print the string where i store the characters in i got garbage characters or some of characters before the '=' character.. OR NO CHARACTERS APPEARS ON THE TERMINAL ^_^
I am using
- compiler V5.056
- GSM type SM5100B
Code: |
#include <16F877a.h>
#include <string.h>
#include <stdlib.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7,STREAM=GSM,ERRORS)
#define buffer_size 96
#define NULL '\0'
#DEFINE CMTI 0
#DEFINE CLOCK 1
UNSIGNED char RECSTRING[buffer_size];
unsigned int8 CT=0;
UNSIGNED CHAR *STRINGS[]={"+CMT\0","CLOCK\0"};
CHAR *CLL;
void CLEAR_BUFFER()
{
memset(RECSTRING,NULL,buffer_size); // Set all elements to NULL
CT=0; // Reset index
}
#int_rda
void serial_isr() {
RECSTRING[CT]=Fgetc(GSM);
CT++;
if(CT==buffer_size){CT=0;}
}
int1 SEARCH_STRING(int8 index){
if(strstr(RECSTRING,STRINGS[index])!=NULL) return (1);
else return (0);
}
void main() {
CLEAR_BUFFER();
enable_interrupts(int_rda);
enable_interrupts(global);
Fprintf(GSM,"AT\r");
DELAY_MS(5000);
CLEAR_BUFFER();
Fprintf(GSM,"AT+CMGF=1\r");
DELAY_MS(3000);
CLEAR_BUFFER();
Fprintf(GSM,"%s","AT+CNMI=3,3,0,0\r");
DELAY_MS(3000);
CLEAR_BUFFER();
while(1){
WHILE(!SEARCH_STRING(CMTI));
if(SEARCH_STRING(CLOCK)){
CLL=strrchr(RECSTRING,'='); Fprintf(GSM,"%s",CLL);
CLEAR_BUFFER();}
}
}
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue May 03, 2016 5:56 pm |
|
|
1. You don't have any code in your #int_rda routine that looks at the
incoming bytes for an end-of-message marker. So how does your main()
code know when you have a complete string available to process ?
2. The next thing is, you're using string functions, but you don't put a
string terminator byte of 0x00 at the end of the received string. Without
that marker, string functions (like strstr, etc.) don't know when to quit.
However, this may not be a problem because you zero the receive buffer
and reset the index to 0 prior to a string coming in. But this is a band-aid.
It would be better if you explicitly put a 0x00 at the end of the string
after it's received.
3. Your string extraction problem itself is a pure code problem.
That means it can be totally inspected and solved with a test program
in MPLAB simulator. I used MPLAB vs. 8.92 simulator to do this.
A. I took your program and stripped out all the data acquisition code that
I just don't need. I substituted your sample string as hard-coded data
in the receive buffer. I wasn't sure about the 20 before the CLOCK.
Did you really mean a space ? Is there a space in there after the 20 ?
But it doesn't really matter for this test.
B. Next I put in marker messages (printf's) that tell me where I'm at
in the program.
Before the next step, I put in a printf() statement to display the hard-
coded received string in MPLAB simulator, just to make sure that I
did it correctly, with the escape sequences on the double-quotes, etc.
After looking at the displayed string, I comment out the first printf.
C. Then I compile and run the test program and I get this and it's working
just fine:
Quote: |
Next search string for CMD1:
Next search string for CLOCK:
=16/05/03,19:50:00
Done |
This means the problem is going to be items 1 or 2 above, or something else.
Test program.
Code: | #include <16F877a.h>
#include <string.h>
#include <stdlib.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STREAM=GSM, ERRORS)
#define buffer_size 96
//#define NULL '\0'
#DEFINE CMTI 0
#DEFINE CLOCK 1
UNSIGNED char RECSTRING[buffer_size] = "+CMT: \"+00962780055097\",\"+962788990088\",\"16/04/30,18:42:37+08\",20 CLOCK=16/05/03,19:50:00";
UNSIGNED CHAR *STRINGS[]={"+CMT\0","CLOCK\0"};
CHAR *CLL;
//====================================
int1 SEARCH_STRING(int8 index)
{
if(strstr(RECSTRING, STRINGS[index]) != NULL)
return (1);
else
return (0);
}
//======================================
void main()
{
//printf(recstring);
printf("Next search string for CMD1:\r");
WHILE(!SEARCH_STRING(CMTI));
printf("Next search string for CLOCK:\r");
if(SEARCH_STRING(CLOCK))
{
CLL = strrchr(RECSTRING,'=');
Fprintf(GSM,"%s",CLL);
}
printf("\rDone\r");
while(TRUE);
}
|
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9243 Location: Greensville,Ontario
|
|
Posted: Wed May 04, 2016 5:34 am |
|
|
OK, FIRST you MUST step back and get the HARDWARE correct !
You have a 5 volt PIC and a 3 volt GSM module, at least according to the Googling that found the SM5100B as a Sparkfun product.
Even proper code will not run right on incorrect hardware.
You also stand a good chance of destroying the GSM according to the datasheet when you force 5 volts to it!!
Always read and understand the 'electrical specification' chapter of the PIC and peripherals BEFORE wiring up and applying power.
With 99% of all 'peripherals' or 'modules' these days they are 3 volt devices, so choose a PIC with the 'L', like xxxLFyyyyy OR a PIC that does work at 3 volts like the 18F46K22.
Jay |
|
|
|
|
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
|