| 
	
	|  |  |  
	
		| 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
 |  |  
		|  |  
		| 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).
 |  |  
		|  |  
		| 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.
 |  |  
		|  |  
		| Gabriel 
 
 
 Joined: 03 Aug 2009
 Posts: 1074
 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
 |  |  
		|  |  
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9589
 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.
 |  |  
		|  |  
		| 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.
 |  |  
		|  |  
		| 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!
 |  |  
		|  |  
		| 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);
 
 }
 
 | 
 | 
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |