|
|
View previous topic :: View next topic |
Author |
Message |
L.Belanger Guest
|
Compare string ?? return always false !! |
Posted: Thu Sep 20, 2007 2:57 am |
|
|
Dear CCS members,
I'm currently testing USB stuff ... just to start a simple program that i've made ... there's a problem with the get_string_usb() function...
Code: |
#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use standard_io(A)
#include <usb_cdc.h>
#int_rda
char string[4];
void flash()
{
disable_interrupts(INT_RDA);
printf(usb_cdc_putc,"Starting Flashing\r\n");
delay_ms(1000);
Output_High(PIN_A1);
delay_ms(1000);
output_low(PIN_A1);
printf(usb_cdc_putc,"Stopping Flashing\r\n");
enable_interrupts(INT_RDA);
}
void main(void) {
usb_cdc_init();
usb_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while (TRUE) {
usb_task();
if (usb_cdc_kbhit())
{
get_string_usb(string,4);
if (string == "1")
{
flash();
}
else{
printf(usb_cdc_putc,"You entered:%s\r\n",string);}
}
}
}
|
the problem is that , if i wrote 1 in the hypertermina,, it always jump to ELSE statement ,,, tried get_int_usb function (to try grabbing a integer) and i got a not defined error ... i'm clueless ,,, how to get the led flashing in reponse to a commands from hyperterminal throught CCS USB to UART driver.
I'm using CCS 4.049
thx ! |
|
|
Ttelmah Guest
|
|
Posted: Thu Sep 20, 2007 3:07 am |
|
|
Several comments.
1) You are enabling INT_RDA. Why?.
2) With this interrupt enabled, you have a supposed 'handler' header, but no code. If anything is received on the serial interrupt, this will hang the PIC.
3) You are trying to do a numeric compare, on a string. As it stands, you are comparing the low byte of the address of the string, with the value '1'... This is _not_ C syntax for a string compare. Look at the 'strcmp' function.
4) You are assigning 4 characters of storage for the 'string'. This is not enough. A 4 character 'string', requires _5_ characters of storage (one extra for the terminating '\0'). This will result in overflows.
'3', is the one that is catching you at present, but the others are waiting to get you.
Best Wishes |
|
|
L.Belanger Guest
|
|
Posted: Thu Sep 20, 2007 3:16 am |
|
|
1. Friend recommended to use interrupts (also clueless about interrupts ,, based on what i've saw on CCS forum)
2.same above
3. how the hell do you compare to a constant string ?? i mean you can't do if string = "yes" { do things} i use it often in php which is the same pratical syntax as C ... ?? i need clarification here
4.thx for the info ,, i've noted that ,, i though that only \r\n are the 2 caracters send after a caracter entered in a terminal (windows)
thx Roger |
|
|
SET
Joined: 15 Nov 2005 Posts: 161 Location: Glasgow, UK
|
|
Posted: Thu Sep 20, 2007 7:24 am |
|
|
Quote: | 3. how the hell do you compare to a constant string ?? i mean you can't do if string = "yes" { do things} i use it often in php which is the same pratical syntax as C ... ?? i need clarification here |
No, php is 'C-like' - of course in C++ you could use =
Anyway, strcmp is easy enough to use.. |
|
|
Ttelmah Guest
|
|
Posted: Thu Sep 20, 2007 8:42 am |
|
|
Interrupts are _already_ being used. The USB handler, is completely interrupt based, and enables the ones it needs. INT_RDA, is for the hardware serial UART, which you are not using. You are enabling the interrupt for this, and if this interrupt triggers, it will only ever 'clear', if the character is read from the UART. You do not read such a character, so the chip would hang. Fortunately, since you don't have a #use RS232 statement, the UART does not get enabled. However it is an 'accident waiting to happen'...
The storage, is not to do with what is sent, but with what is _stored_. In 'C', a string is a simple sequence of bytes, _terminated with a 'zero'_. Now you are allowing 4 charaters to arrive, and the receive routine (since you are using a string receive routine), will _add_ the terminating zero, to make the stored data 'into' a string. With four characters received, the 'string' needs five characters.
You can compare in two ways:
First, manually compare the individual bytes. Simply:
if (string[0]=='1')
Here a ASCII character inside single inverted commas, is converted into the binary 'value' (in this case 0b00110001), and this is copared with te binary value stored in the first byte of the 'string'. Since this is a single character numeric comparison, this is fine.
The second way is to use the strcmp function, which is designed to compare whole strings.
Best Wishes |
|
|
L.Belanger Guest
|
|
Posted: Thu Sep 20, 2007 3:01 pm |
|
|
wow thanks for your replies,
everything work fine :D
+1 Ttelmah
just curious ,, if my string was declared as char string instead of string[6] (kinda like an array) i guess if (string =='nice') would work since its not splitted in 6 chars ... strcmp is used to compare a string which have been splitter in pieces hence string[6] compared to 'nice' ..
all strcmp does its splitting nice and comparing
a DOT denote a byte into string N. [0] I. [1] C. [2] E. [3]
ex: does N.I.C.E (4 individual char for string[6]) == 'N.I.C.E' (which i have entered 'nice' in strcmp ?
thank you |
|
|
L.Belanger Guest
|
|
Posted: Thu Sep 20, 2007 3:04 pm |
|
|
or in a simpler way to understand strcmp ...
if ( (string[0]=='n') && (string[1]=='i') && (string[2]=='c') && (string[3]=='e') )
{do things}
strcmp save us all the code above right ? |
|
|
Ttelmah Guest
|
|
Posted: Thu Sep 20, 2007 3:35 pm |
|
|
Yes.
It is just a simple 'loop', walking through the string, till it sees the terminator character, and comparing character by character as it goes.
The source code, is actually in string.h, so you can see exactly how it works. It uses pointers, rather than array indexes (but these are functionally the same in C), and does the 'bonus', of returning -1, or +1, if the strings are less than, or greater than each other.
Best Wishes |
|
|
L.Belanger Guest
|
|
Posted: Thu Sep 20, 2007 4:20 pm |
|
|
thank you for the explanation ...
Best Wishes you too :P
L.Belanger |
|
|
|
|
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
|