|
|
View previous topic :: View next topic |
Author |
Message |
leevise
Joined: 05 Aug 2010 Posts: 89
|
Strange problem help me !!!--solved |
Posted: Wed Oct 26, 2011 6:24 am |
|
|
I use a test code, detail as follow.
I wished it can make LED1 and printf work when used "strstr()" function to search char "OK", but my code is just the opposite.
Code: |
#include <18f452.h>
//#Device PASS_STRINGS=IN_RAM
#include <string.h>
#fuses HS,NOWDT,PUT,NOPROTECT
#use delay (clock = 20000000)
//#use rs232(baud=19200,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8,stream=GSM)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8)
//#use i2c(MASTER,SDA=PIN_C4,SCL=PIN_C3,ADDRESS=0X9A,FORCE_HW)//I2C
#zero_ram
#define PORTA 0xF80
#define PORTB 0xF81
#define PORTC 0xF82
#define PORTD 0XF83
#bit A1=PORTA.1 //
#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 //Test
#bit LED6=PORTD.6 //SWO
#bit LED7=PORTD.7 //SW1
char num="OK";
char Rec_Buf[]="123";
int1 Hand(unsigned char *a)
{
if(strstr(Rec_Buf,a)!=NULL)
{ return (1);}
else
return (0);
}
void main()
{
set_tris_d(0x00);
set_tris_c(0x00);
set_tris_a(0x11);
set_tris_b(0xff);
output_d(0x00);
port_b_pullups(TRUE);
A1=1;
col8=1;
LED5=1;
delay_ms(100);
while(true)
{
while(!Hand(num))
{
printf("AT\r\n");
delay_ms(500);
LED1=1;
}
LED2=1;
}
LED3=1;
LED4=1;
}
|
Last edited by leevise on Thu Oct 27, 2011 7:57 pm; edited 1 time in total |
|
|
leevise
Joined: 05 Aug 2010 Posts: 89
|
|
Posted: Wed Oct 26, 2011 8:05 am |
|
|
Maybe I don' t express my question.
I want to use the "strstr(str1,str2)" function to query if str1 has "OK" .
If it has not "OK", the LED1 light and printf output ,
other, it is has "OK", the LED2 light.
But this code make a opposite running, I can't find my fault in this code, so please help me and analyse it. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Wed Oct 26, 2011 8:39 am |
|
|
I posted earlier, but the forum seems to have had a hiccup.
_Simplify_. Use defined names, (TRUE/FALSE), rather than 0/1, and avoid logical negations if possible.
Now, think about what happens:
'strstr', returns the location of a 'found' string.
So why not code as:
Code: |
#define NOT_FOUND (NULL)
int1 Hand(unsigned char *a) {
if(strstr(Rec_Buf,a)==NOT_FOUND)
return(FALSE); //Not found
return(TRUE); //only get here if test if FALSE
}
|
This now makes the operation much simpler to understand if the string is 'not found' the code returns FALSE.
There is a glaring problem with the declaration of 'num'. It is currently a char, while it needs to be a char array or pointer....
There are then some other problems
Add ERRORS to the RS232 declaration. Otherwise if more than two characters arrive while you are sitting in the delay, the RS232 _will_ become completely hung. ERRORS should _always_ be present when using the hardware UART, unless _you_ explicitly handle error conditions yourself.
Then consider using interrupt driven serial (EX_SISR.C), or you _will_ lose characters if anything arrives during the 500mSec.
How is anything ever going to get into Rec_Buf ?. Currently it is "123'. As posted the code will sit forever printing AT...
Best Wishes |
|
|
leevise
Joined: 05 Aug 2010 Posts: 89
|
|
Posted: Wed Oct 26, 2011 7:42 pm |
|
|
Ttelmah wrote: | I posted earlier, but the forum seems to have had a hiccup.
_Simplify_. Use defined names, (TRUE/FALSE), rather than 0/1, and avoid logical negations if possible.
Now, think about what happens:
'strstr', returns the location of a 'found' string.
So why not code as:
Code: |
#define NOT_FOUND (NULL)
int1 Hand(unsigned char *a) {
if(strstr(Rec_Buf,a)==NOT_FOUND)
return(FALSE); //Not found
return(TRUE); //only get here if test if FALSE
}
|
|
First thank you very much for your advice.
But i don't make it work normal, it also acted reversed.
And you said to me about the "num" should be an array or pointer, I think my code that Hand() function set the "a" to pointer.
Is this function parameter wrong? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19496
|
|
Posted: Thu Oct 27, 2011 7:02 am |
|
|
No.
Your 'hand' function, expects to receive a pointer to an array of characters.
However 'num', is _not_ declared as such a pointer. it is declared as a _character_. In fact the character 'O' (0x4F). Hand then treats this as a pointer, resulting in completely indeterminate behaviour (will depend on what is in location '4F' in memory....). The functions behaviour is not 'reversed'. It is doing what you are telling it, but you are _not_ giving it the right values....
Best Wishes |
|
|
leevise
Joined: 05 Aug 2010 Posts: 89
|
|
Posted: Thu Oct 27, 2011 7:07 pm |
|
|
Ttelmah wrote: | No.
Your 'hand' function, expects to receive a pointer to an array of characters.
However 'num', is _not_ declared as such a pointer. it is declared as a _character_. In fact the character 'O' (0x4F). Hand then treats this as a pointer, resulting in completely indeterminate behaviour (will depend on what is in location '4F' in memory....). The functions behaviour is not 'reversed'. It is doing what you are telling it, but you are _not_ giving it the right values....
Best Wishes |
Thank you very much!
I solved it ,my code is modified ,or .
then the code running is normal! |
|
|
|
|
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
|