CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Trying to fprint an int16 with 18 characters

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
cap110874



Joined: 31 Aug 2011
Posts: 1

View user's profile Send private message

Trying to fprint an int16 with 18 characters
PostPosted: Wed Aug 31, 2011 2:42 pm     Reply with quote

Hi Folks - Please bear with me if this sounds a bit stupid -

I am trying to print an int16 with 18 characters.
ie:
int16 PT_IR_pulse_pattern_up = 0b1110100100010110;

I want it to look exactly the same when it fprints to my rs232 terminal but I have tried nearly every combination of %x, %ld ect ect ect and it always comes out different.
This is what i am currently trying:
fprintf(COM_A, "%lx \r\n", PT_IR_pulse_pattern_up);
and in the RS232 terminal it is showing as:
e916

ANY wise words of advice as to where I am going wrong would be greatly appreciated
newguy



Joined: 24 Jun 2004
Posts: 1903

View user's profile Send private message

PostPosted: Wed Aug 31, 2011 2:52 pm     Reply with quote

Code:
signed int8 i;
printf(COM_A, "0b");
for (i = 15; i >= 0; i--) {
   if (bit_test(PT_IR_pulse_pattern_up, i)) {
      printf(COM_A, "1");
   }
   else {
      printf(COM_A, "0");
   }
}
printf(COM_A, " \r\n");


Edit: Thanks TTelmah, bonehead mistake fixed.


Last edited by newguy on Thu Sep 01, 2011 7:26 am; edited 1 time in total
Ttelmah



Joined: 11 Mar 2010
Posts: 19328

View user's profile Send private message

PostPosted: Thu Sep 01, 2011 2:46 am     Reply with quote

Ongoing to this:
1) The key point is that the standard printf function does not provide a '%b' output, which is why you couldn't find a way of doing it directly. It is a rare output now, with hex being much more common, because of it's bulk.
2) Newguy's code shows a simple but quite efficient way of doing it, but as written, the 'wrong way round' - counter needs to go from 15 to 0, not 0 to 15.
3) A search online, will find dozens of other routes, varying in speed, and code size.
As an alternative, the internal function itoa (part of stdlib.h), can canvert a value to it's binary string representation directly.
Another 'natty' route, is a simple lookup table, based upon hex:
Code:

char hex_bin[16][5] = {"0000","0001","0010","0011","0100","0101","0110","0111", \
"1000","1001","1010","1011","1100","1101","1110","1111"};

void ophex_bin(int8 digit) {
   if (digit>'9') {
      if (digit>'F') digit-=0x20;
      digit-=55;
   }
   else digit-='0';
   fprintf(COM_A,"%s",&hex_bin[digit][0]);
}

////........

   int16 PT_IR_pulse_pattern_up = 0b1110100100010110;

   fprintf(COM_A,"0b"); 
   printf(ophex_bin,"%04lx",PT_IR_pulse_pattern_up);
   fprintf(COM_A,"\n\r");

Which converts the individual hex digits, to four character text representations (adds the '0b' text as well).

There are about as many solutions to this, as days in a year!....

Best Wishes
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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