![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
leevise
Joined: 05 Aug 2010 Posts: 89
|
TC35I Receive question---use the txt message control LED |
Posted: Thu Oct 27, 2011 7:11 pm |
|
|
hello guys
I use the TC35I receive a txt message to control LED.
But when my code use the printf "AT", the buffer can't receive the "OK". Please help me check it, and where am I wrong in my code?
My code as follow:
Code: |
#include <18f452.h>
#include <string.h>
#fuses HS,NOWDT,PUT,NOPROTECT
#use delay (clock = 20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)
#zero_ram
#define PORTA 0xF80
#define PORTB 0xF81
#define PORTC 0xF82
#define PORTD 0XF83
#bit col8=PORTC.0 //Matrix LED common
#bit LED1=PORTD.0 //
#bit LED2=PORTD.1 //
#bit LED3=PORTD.2 //
#bit LED4=PORTD.3 //
#bit IGT =PORTD.4 //
#bit LED5=PORTD.5 //
#bit LED6=PORTD.6 //
#bit LED7=PORTD.7 //
#define Buf_Max 200 //buffer length200
#define NOT_FOUND (NULL)
unsigned char num[]="OK";
unsigned char i = 0; //
unsigned char Rec_Buf[Buf_Max]; //
unsigned char N_MS[]="+CMTI";
unsigned char Command1[]="led3";
unsigned char Command2[]="unled3";
unsigned char Command3[]="led4";
unsigned char Command4[]="unled4";
void CLR_Buf(void); //clear the buffer
int1 Hand(unsigned char *a);
//*******************************************
#int_RDA
void RDA_isr()
{
Rec_Buf[i]=getc();
i++;
if(i>200)
{
i = 0;
}
}
/***************main******************************/
void main()
{
set_tris_d(0x00);
set_tris_c(0x80); [b]// it set the RC_PIN7 input mode[/b]
output_d(0x00);
col8=1;
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
delay_ms(1000); //
CLR_Buf(); //
delay_ms(6000); //
while(!Hand(num)) //
{
printf("AT\r\n");
delay_ms(6000); //
LED7=1;
}
CLR_Buf(); //
LED1 = 0; //get "ok" ==my code can't carry out this step!
delay_ms(3000);
printf("AT+CPMS=\"MT\",\"MT\",\"MT\"\r\n
delay_ms(3000); //
while(!Hand(num)); //
CLR_Buf(); //
LED2 = 0; //
delay_ms(3000); //
printf("AT+CNMI=2,1\r\n");//new msm come in
delay_ms(3000); //
while(!Hand(num)); //
CLR_Buf(); //
delay_ms(3000); //
printf("AT+CMGF=1\r\n");set TEXT mode
delay_ms(3000); //
while(!Hand(num)); //
CLR_Buf(); //
delay_ms(3000); /
printf("AT+CMGD=1\r\n");//delete this msm
delay_ms(3000); //
while(!Hand(num)); //
CLR_Buf(); //
LED1 = 0; //successful
while(true)
{
if(strstr(Rec_Buf,N_MS)!=NULL) //
{
CLR_Buf(); //
delay_ms(3000); //
printf("AT+CMGR=1\r\n");//
delay_ms(3000); //
while(!Hand(num)); //
if(strstr(Rec_Buf,Command1)!=NULL) //if the msm is the"open1"
LED3 = 0; //the turn on the LED7
else if(strstr(Rec_Buf,Command2)!=NULL) //if the msm is the"close1"
LED3 = 1; /Turn off LED7
else if(strstr(Rec_Buf,Command3)!=NULL) //if the msm is the"open2"
LED4 = 0; //the turn on the LED4
else if(strstr(Rec_Buf,Command4)!=NULL) //if the msm is the"close2"
LED4 = 1; //the turn off the LED4
CLR_Buf(); //
delay_ms(3000); //
printf("AT+CMGD=1\r\n");//delete the readed msm
delay_ms(3000); //
while(!Hand(num)); //
CLR_Buf(); //
}
}
}
/*************************/
/************************/
void CLR_Buf(void)
{
unsigned char k;
for(k=0;k<Buf_Max;k++) //
{
Rec_Buf[k] = 0;
}
i = 0;
}
/***********************************************/
int1 Hand(unsigned char *a)
{
if(strstr(Rec_Buf,a)!=NULL)
return (1);
else
return (0);
}
|
Last edited by leevise on Sun Nov 06, 2011 10:54 am; edited 1 time in total |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Oct 27, 2011 10:23 pm |
|
|
I don't think this method of array initialization works in CCS:
Quote: |
unsigned char *num="OK";
unsigned char i = 0; //
unsigned char Rec_Buf[Buf_Max]; //
unsigned char *N_MS="+CMTI";
unsigned char *Command1="led3";
unsigned char *Command2="unled3";
unsigned char *Command3="led4";
unsigned char *Command4="unled4";
|
Change all the array declarations to a more traditional K&R method, like this:
Code: |
unsigned char num[]="OK";
|
CCS follows K&R (mostly), and that's how the K&R book says to initialize
an array. (Page 83 of K&R 1st Edition, 1978). |
|
![](templates/subSilver/images/spacer.gif) |
leevise
Joined: 05 Aug 2010 Posts: 89
|
|
Posted: Thu Oct 27, 2011 10:41 pm |
|
|
PCM programmer wrote: | I don't think this method of array initialization works in CCS:
Quote: |
unsigned char *num="OK";
unsigned char i = 0; //
unsigned char Rec_Buf[Buf_Max]; //
unsigned char *N_MS="+CMTI";
unsigned char *Command1="led3";
unsigned char *Command2="unled3";
unsigned char *Command3="led4";
unsigned char *Command4="unled4";
|
Change all the array declarations to a more traditional K&R method, like this:
Code: |
unsigned char num[]="OK";
|
CCS follows K&R (mostly), and that's how the K&R book says to initialize
an array. (Page 83 of K&R 1st Edition, 1978). |
Thank you for your advice!
I modified my code
Code: |
unsigned char num[]="OK";
unsigned char i = 0;
unsigned char Rec_Buf[Buf_Max];
unsigned char N_MS[]="+CMTI";
unsigned char Command1[]="led3";
unsigned char Command2[]="unled3";
unsigned char Command3[]="led4";
unsigned char Command4[]="unled4";
|
BUt it doesn't running normal, the buffer can't receive the"OK",and the LED1 light. |
|
![](templates/subSilver/images/spacer.gif) |
Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
|
Posted: Fri Oct 28, 2011 6:52 am |
|
|
hi,
check this out:
http://www.ccsinfo.com/forum/viewtopic.php?t=42527
it does what you want... for 4 LEDs.
used a different phone... you might need to modify it a bit to work with yours.
BUT, first things first... you must know 100% that your COM between pic and Cell is working...
i recommend you make a spliced cable where you can see the serial from the phone on your PC as well...
that way you know if your pic is actually making the phone respond.
next up, make a simple program that sends an AT command to the phone and checks for reception of "OK"...
once you got that.... its all down hill... its just a matter of reading the AT command list for your phone and sending the right commands from the PIC....
G _________________ CCS PCM 5.078 & CCS PCH 5.093 |
|
![](templates/subSilver/images/spacer.gif) |
temtronic
Joined: 01 Jul 2010 Posts: 9170 Location: Greensville,Ontario
|
|
Posted: Fri Oct 28, 2011 7:59 am |
|
|
from a quick look...
Add 'errors' to the rs232(....) options ! Otherwise the UART will stop after 2 bytes from the phone. |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Oct 28, 2011 3:55 pm |
|
|
Instead of acting helpless, learn how to trouble-shoot a program.
You have a problem. The program doesn't find "OK" in the modem
response. You are checking for "OK" with the strstr() function.
It requires two strings.
How do you know for a fact what is in those two strings ?
You don't.
So, put in some diagnostic printf statements at the start of your Hand()
function so you can see the contents of the two arrays. Add the lines
shown in bold below:
Quote: |
int1 Hand(unsigned char *a)
{
printf("Num = %s \r\n", a);
printf("Rec_Buf = %s \r\n", Rec_Buf);
printf("\n\r");
if(strstr(Rec_Buf,a)!=NULL)
return (1);
else
return (0);
}
|
The Num array should contain "OK", and the Rec_Buf array should also
(you hope) contain "OK". If one or both of them do not have "OK", then
you need to investigate and do more trouble-shooting of the code for that
array, and look in other parts of the program for the problem.
What I want you to do is to stop acting helpless, and to start trouble-
shooting your own code. |
|
![](templates/subSilver/images/spacer.gif) |
leevise
Joined: 05 Aug 2010 Posts: 89
|
Re: TC35I Receive question---use the txt message control LED |
Posted: Sun Nov 06, 2011 9:17 am |
|
|
leevise wrote: | Code: |
/***************main******************************/
void main()
{
set_tris_d(0x00);
[b]set_tris_c(0x00);[/b]
output_d(0x00);
|
|
I found the wrong that I forgot set the C7 input mode ,the code is setted as follow:
My code is OK,when I modified this code! |
|
![](templates/subSilver/images/spacer.gif) |
leevise
Joined: 05 Aug 2010 Posts: 89
|
Re: TC35I Receive question---use the txt message control LED |
Posted: Sun Nov 06, 2011 10:56 am |
|
|
hello guys
I am success, it works good . it is the code as follow :
leevise wrote: | hello guys
I use the TC35I receive a txt message to control LED.
But when my code use the printf "AT", the buffer can't receive the "OK". Please help me check it, and where am I wrong in my code?
My code as follow:
Code: |
#include <18f452.h>
#include <string.h>
#fuses HS,NOWDT,PUT,NOPROTECT
#use delay (clock = 20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)
#zero_ram
#define PORTA 0xF80
#define PORTB 0xF81
#define PORTC 0xF82
#define PORTD 0XF83
#bit col8=PORTC.0 //Matrix LED common
#bit LED1=PORTD.0 //
#bit LED2=PORTD.1 //
#bit LED3=PORTD.2 //
#bit LED4=PORTD.3 //
#bit IGT =PORTD.4 //
#bit LED5=PORTD.5 //
#bit LED6=PORTD.6 //
#bit LED7=PORTD.7 //
#define Buf_Max 200 //buffer length200
#define NOT_FOUND (NULL)
unsigned char num[]="OK";
unsigned char i = 0; //
unsigned char Rec_Buf[Buf_Max]; //
unsigned char N_MS[]="+CMTI";
unsigned char Command1[]="led3";
unsigned char Command2[]="unled3";
unsigned char Command3[]="led4";
unsigned char Command4[]="unled4";
void CLR_Buf(void); //clear the buffer
int1 Hand(unsigned char *a);
//*******************************************
#int_RDA
void RDA_isr()
{
Rec_Buf[i]=getc();
i++;
if(i>200)
{
i = 0;
}
}
/***************main******************************/
void main()
{
set_tris_d(0x00);
set_tris_c(0x80); [b]// it set the RC_PIN7 input mode[/b]
output_d(0x00);
col8=1;
enable_interrupts(int_rda);
enable_interrupts(GLOBAL);
delay_ms(1000); //
CLR_Buf(); //
delay_ms(6000); //
while(!Hand(num)) //
{
printf("AT\r\n");
delay_ms(6000); //
LED7=1;
}
CLR_Buf(); //
LED1 = 0; //get "ok" ==my code can't carry out this step!
delay_ms(3000);
printf("AT+CPMS=\"MT\",\"MT\",\"MT\"\r\n
delay_ms(3000); //
while(!Hand(num)); //
CLR_Buf(); //
LED2 = 0; //
delay_ms(3000); //
printf("AT+CNMI=2,1\r\n");//new msm come in
delay_ms(3000); //
while(!Hand(num)); //
CLR_Buf(); //
delay_ms(3000); //
printf("AT+CMGF=1\r\n");set TEXT mode
delay_ms(3000); //
while(!Hand(num)); //
CLR_Buf(); //
delay_ms(3000); /
printf("AT+CMGD=1\r\n");//delete this msm
delay_ms(3000); //
while(!Hand(num)); //
CLR_Buf(); //
LED1 = 0; //successful
while(true)
{
if(strstr(Rec_Buf,N_MS)!=NULL) //
{
CLR_Buf(); //
delay_ms(3000); //
printf("AT+CMGR=1\r\n");//
delay_ms(3000); //
while(!Hand(num)); //
if(strstr(Rec_Buf,Command1)!=NULL) //if the msm is the"open1"
LED3 = 0; //the turn on the LED7
else if(strstr(Rec_Buf,Command2)!=NULL) //if the msm is the"close1"
LED3 = 1; /Turn off LED7
else if(strstr(Rec_Buf,Command3)!=NULL) //if the msm is the"open2"
LED4 = 0; //the turn on the LED4
else if(strstr(Rec_Buf,Command4)!=NULL) //if the msm is the"close2"
LED4 = 1; //the turn off the LED4
CLR_Buf(); //
delay_ms(3000); //
printf("AT+CMGD=1\r\n");//delete the readed msm
delay_ms(3000); //
while(!Hand(num)); //
CLR_Buf(); //
}
}
}
/*************************/
/************************/
void CLR_Buf(void)
{
unsigned char k;
for(k=0;k<Buf_Max;k++) //
{
Rec_Buf[k] = 0;
}
i = 0;
}
/***********************************************/
int1 Hand(unsigned char *a)
{
if(strstr(Rec_Buf,a)!=NULL)
return (1);
else
return (0);
}
|
|
|
|
![](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
|