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

Need to combine multiple chars to string then float

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



Joined: 23 Jun 2006
Posts: 2
Location: Canton, MS

View user's profile Send private message

Need to combine multiple chars to string then float
PostPosted: Fri Jun 23, 2006 3:00 pm     Reply with quote

I have a program that reads in data from a digital protractor via serial. I already have the receive functions setup and working properly. The protractor sends the angle one 'number' at a time, i.e. 123.45 degrees is sent as a 1, then a 2, then a 3, then a ".", then 4, then 5, and I have each number assigned to a variable, ang_hun_bit, ang_ten_bit, and so on.

What I need to do is convert these chars to a useable number to average and check.

I know there is the atof() function to convert a string to a float, but I can't get the chars combined to one string. Here is my code so far:

[/code]
float parse(char *hun, char *ten, char *one, char *tenth, char *hundth)
{
char data_string[8];
float runner;
char *ptr;

// ptr = data_string;

ptr = strcpy(data_string, hun);
ptr = strcat(data_string, ten);
ptr = strcat(data_string, one);
ptr = strcat(data_string, decimal);
ptr = strcat(data_string, tenth);
ptr = strcat(data_string, hundth);

lcd_gotoxy(1,2);
printf(lcd_putc,"%6s", ptr);

runner = atof(ptr);

// lcd_gotoxy(1,2);
// printf(lcd_putc,"%f", runner);

average += runner;

avg_counter++;

return runner;
}[/code]

I am passing all of the individual numbers of the measurement sent by the protractor into this function. The pointers are working correctly as I can print each indiviudally via printf(lcd_putc, "%c%c%c.%c%c", [variable list].

Thanks for your help[/code]
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Jun 23, 2006 3:49 pm     Reply with quote

You're treating each incoming character as if it's a separate string.
I really doubt that this is how the instrument sends the data.
Can you post a link to the unit's manual, which describes the protocol
in detail ?
epideath



Joined: 07 Jun 2006
Posts: 47

View user's profile Send private message

PostPosted: Fri Jun 23, 2006 3:59 pm     Reply with quote

One way that you could accomplish this, if you always get charaters for each digit sould be to do something like this:

Code:


char data_string[8] = "       ";  // 7 spaces allowing 1 for the 0x00

data_string[0] =  hun;
data_string[1] =  ten;
data_string[2] =  one;
data_string[3] =  '.';
data_string[4] =  teth;
data_string[5] =  hundrth;
data_string[6] =  0x00;

runner = atof(data_string);

but this would be better if you did it in the function where you are actually reading the data in.

you could do something like:
Code:

   for(i=0; i<6; i++)
        data_string[i] = read_char();
   data_string[6] = 0x00;


There are many other ways to accomplish this using the strcpy and strcat functions also.

hope this helps
Humberto



Joined: 08 Sep 2003
Posts: 1215
Location: Buenos Aires, La Reina del Plata

View user's profile Send private message

PostPosted: Fri Jun 23, 2006 9:37 pm     Reply with quote

Once I had a similar problem with a magnetic compass. The problem was that the output
string doesn´t keep the same size, instead it depends of the value.
Typical output string format was as follow:
Code:

<sign>  XXX.XX  <CR> <LF>
  +     123.40  <CR> <LF>
  -      12.30  <CR> <LF>
  +       5.45  <CR> <LF>


Normally to cover the full 360 degree, the range and the readout is between -180 deg. and +180 deg.
You must store the incoming chars in a buffer, then in main the first task is to know the "size" of
the incoming value, I solved it looking where was stored the delimiter 'point', (I mean in wich buffer position.)
Also you can use the atof() function to convert a string to a float, to compare if it generate a shorter code,
but this is your job.
NOTE: Following code not tested, just to show you how I did it.

Code:

#define point '.'
#define plus   '+'
#define minus '-'

int8  hun, ten, one, teth, hundrth;
char start_of_string;
float Ftotal;

 start_of_string = FALSE;

 if((data[0] == plus) || (data[0] == minus))
   {
    sign = (data[0]; // always the first char is the sign
 
    if(data[4] == point)
     {
      hun = (data[1] & 0x0F) * 100 ; // max expected value is 100
      ten  = (data[2] & 0x0F) * 10;
      one = (data[3] & 0x0F);
      total_integer = (hun + ten + one);
      teth = (data[5] & 0x0F);
      (float) teth = (float) teth / 10.0; 
      hundrth = (data[6]  & 0x0F);
      (float) hundrth = (float) hundrth / 100.0;
     }
   
    if(data[3] == point)
     {
      ten  = (data[1] & 0x0F) * 10;
      one = (data[2] & 0x0F);
      total_integer = ( ten + one);
      teth = (data[4] & 0x0F);
      (float) teth = (float) teth / 10.0; 
      hundrth = (data[5]  & 0x0F);
      (float) hundrth = (float) hundrth / 100.0;
     }
 
   if(data[2] == point)
     {
      one = (data[1] & 0x0F);
      total_integer =  one;
      teth = (data[3] & 0x0F);
      (float) teth = (float) teth / 10.0; 
      hundrth = (data[4]  & 0x0F);
      (float) hundrth = (float) hundrth / 100.0;
     }
   
    (float) Ftotal = ( (float) total_integer + (float) hundrth + (float) teth);
   }



Hope you understand the idea.

Humberto
Channing



Joined: 23 Jun 2006
Posts: 2
Location: Canton, MS

View user's profile Send private message

Thanks guys
PostPosted: Mon Jun 26, 2006 8:34 am     Reply with quote

I just simply assigned the individual pointers to each element of the array, and now I have 100% precision (or as close as I am going to attempt to get).

As they always say, sometimes is just take a second opinion on code, to step away and come back.

Thanks again guys for the help. I am sure I will be back for more help with future projects.
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