View previous topic :: View next topic |
Author |
Message |
lankybits
Joined: 12 Nov 2009 Posts: 2
|
Strings and usb_cdc_putc() |
Posted: Thu Nov 12, 2009 4:15 pm |
|
|
Hi,
I'm new to CCS and PIC programming (but not to C programming) and was copying a co-worker's code for printing debugging strings in HyperTerminal over a USB link using usb_cdc_putc(). He is using the function to print a string (e.g., "usb_cdc_putc("Green LED is set here.\n\r");")
I want to print the value of a variable in my string, so I looked in usb_cdc.h to see if usb_cdc_putc() supports format specifiers (like %i) the way printf() does. I was very surprised to see that usb_cdc_putc() takes a character as its only argument... there is no mention anywhere of passing a string to it. I can't figure out how his code is working, and it's driving me crazy. Is it common usage to pass strings to usb_cdc_putc()? Is there a version that takes a string defined somewhere else, and I'm just looking at the wrong definition? I can't believe that the compiler doesn't even warn that there's a type mismatch, nevermind that it actually seems to work. If you can demystify this for me, I'd be grateful!
Thanks, _________________ Anthony |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Nov 12, 2009 4:35 pm |
|
|
See the CCS manual. It says:
Quote: |
A (non-standard) feature has been added to the compiler to help get
around the problems created by the fact that pointers cannot be created
to constant strings. A function that has one CHAR parameter will accept a
constant string where it is called. The compiler will generate a loop that
will call the function once for each character in the string.
|
Also see the manual on printf:
Quote: |
printf (fname, cstring, values...)
fname is a function name to be used for outputting
(default is putc if none is specified). |
Look at examples in the various USB example files:
Quote: |
printf(usb_cdc_putc, "\r\nNew value: ");
printf(usb_cdc_putc, "%2x ", read_eeprom( i*16+j ) );
|
|
|
![](templates/subSilver/images/spacer.gif) |
lankybits
Joined: 12 Nov 2009 Posts: 2
|
|
Posted: Fri Nov 13, 2009 9:08 am |
|
|
Thanks for the response, PCM programmer. I think I understand the need for it now... the PIC uses Harvard architecture, so string constants are stored in instruction memory. It's a nice feature to have, it's just weird that this usage isn't mentioned in the function's comments or in its entry in the help file. Then again, it's not really a property of the function itself, it's a special enhancement of the compiler. Sounds like the manual is the best source of info, and I should probably get my hands on one.
Thanks again! _________________ Anthony |
|
![](templates/subSilver/images/spacer.gif) |
gpsmikey
Joined: 16 Nov 2010 Posts: 588 Location: Kirkland, WA
|
|
Posted: Tue Nov 23, 2010 2:37 pm |
|
|
On the same topic, I have been playing with the FLEX_LCD driver and in there, I notice the same basic thing ... lcd_putc("some_string");
The question I have (I have looked at the man page for the printf() - is this an implied version of the printf(lcd_putc("some_string") ??? I could not find that documented (I was searching for the same answer when I found this thread - how do they pass a string to function that says it expects a char). I'm happy to play by the rules, I just need to know what they are :-)
mikey _________________ mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3 |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19375
|
|
Posted: Tue Nov 23, 2010 3:18 pm |
|
|
The 'rule' is in the manual section PCM programmer has posted.
_Any_ function that accepts a single char (or an int8), can be called with a constant string in CCS. What happens is the function is automatically called repeatedly with each character in turn. This applies to your functions, as well as CCS ones.
So:
Code: |
void demo(char c) {
static int8 ctr=1;
Printf("Char %d is %c\n\r",ctr++,c);
}
main {
demo("Demo string");
while (TRUE) ;
}
|
Obviously this needs an RS232 setup to output the values.....
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
gpsmikey
Joined: 16 Nov 2010 Posts: 588 Location: Kirkland, WA
|
|
Posted: Tue Nov 23, 2010 3:28 pm |
|
|
Ah, thanks - I had somehow missed reading that part of PCM's post. I have the pdf version of the manual, but my hard copy should be arriving tomorrow where I can put tabs on it :-) Last time I used the CCS compiler was back in 2000 or so with version 2.xxx for a cub scout project. New features !! Looks like it is pg 50 in the pdf manual dated "June 2010"
mikey _________________ mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3 |
|
![](templates/subSilver/images/spacer.gif) |
|