Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

single dimensional array data in a single variable in c

Status
Not open for further replies.

hirenn

Full Member level 1
Joined
Jul 12, 2014
Messages
96
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
703
Hello Everyone !!!!

I'm writing code to get data from sensor having ascii Value as input , i have get it from UART to buffer (buffer is single dimensional array having 4)..

im using C.

now i want to get this array data into a single variable.
how could i do this .. please help me :)
 

betwixt

Super Moderator
Staff member
Joined
Jul 4, 2009
Messages
15,169
Helped
4,948
Reputation
9,917
Reaction score
4,764
Trophy points
1,393
Location
Aberdyfi, West Wales, UK
Activity points
128,853
It depends on the format of the four bytes. For example if the ASCII bytes are '1234' and they represent that numeric value in decimal, you could use:
Code:
int Total;
Total = (data[3] - '0') * 1000;
Total += (data[2] - '0') * 100;
Total += (data[1] - '0') * 10;
Total += (data[0] - '0');

Subtracting '0' (character zero) converts the ascii value to it's decimal value, for example '7' = D'37' so subtracting '0' makes it 7.
If the values are in a different radix, choose appropriate multipliers instead of decimal.

Brian.
 
  • Like
Reactions: hirenn

    hirenn

    Points: 2
    Helpful Answer Positive Rating

hirenn

Full Member level 1
Joined
Jul 12, 2014
Messages
96
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
703
hello !!
Thanks for you kind reply , but there is problem

what data is i.m getting is varied from 0 to 1200 in decimal

how could i get with this in single variable from array
 

KlausST

Super Moderator
Staff member
Joined
Apr 17, 2014
Messages
20,556
Helped
4,463
Reputation
8,935
Reaction score
4,500
Trophy points
1,393
Activity points
135,880
Hi,

Where EXACTELY do you see a problem?

From what I see now Brian´s solution is correct.

****

"decimal"...there is no dedicated "decimal" data format for computers, it´s more a human format.
* ASCII--> Brian
* binary? signed, unsigned?
* BCD?
* float?

***
1234 in decimal can be represented as 4 bytes:
* as ASCII string 0x 31 32 33 34 = "1234"
* as binary (signed and unsigned) = 0b 00000000 000000000 00000100 11010010
* as HEX (signed and unsigned) = 0x00 00 04 D2
* as BCD: 0b 00000000 00000000 00010010 00110100 = 0x 00 00 12 34
* as float: 0b 01000100 10011010 01000000 00000000 = 0x 44 9a 40 00
(I added some spaces to divide the bytes)

Klaus
 

BradtheRad

Super Moderator
Staff member
Joined
Apr 1, 2011
Messages
14,187
Helped
2,808
Reputation
5,624
Reaction score
2,747
Trophy points
1,393
Location
Minneapolis, Minnesota, USA
Activity points
105,830
varied from 0 to 1200 in decimal

Does this mean you can receive 1 or 2 or 3 or 4 ascii values? Then you might need to wait until all data arrive, before you start to calculate a total value.

Is there a keyword you can call in your programming language, which converts a string to a numeric variable? That could be an easy way to do it.

Example: x = VAL ( a$)
 

KlausST

Super Moderator
Staff member
Joined
Apr 17, 2014
Messages
20,556
Helped
4,463
Reputation
8,935
Reaction score
4,500
Trophy points
1,393
Activity points
135,880
Hi,

Independent of how many bytes are received....the array is 4 bytes wide.

Then the question is what is the initial value of the array?

Klaus
 

hirenn

Full Member level 1
Joined
Jul 12, 2014
Messages
96
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
703
Hello !!
how to get array ascii data like 1000.100 in single value??
can i use same method betwixt >???
 

KlausST

Super Moderator
Staff member
Joined
Apr 17, 2014
Messages
20,556
Helped
4,463
Reputation
8,935
Reaction score
4,500
Trophy points
1,393
Activity points
135,880
Hi,

first define your dataformat. Else we have to guess.

"1000.100" does that mean ALWAYS 8 bytes?
* or is "1000.1" allowed, too?
* is "0" allowed?
* is "12345678" allowed?
* is "123.4567" allowed?

Generally Brian´s method is good, but you need to take care of all (allowed) special cases.

Klaus

*****
You want us to help. So please be so kind to answer our questions, or at least give some feedback.
 

hirenn

Full Member level 1
Joined
Jul 12, 2014
Messages
96
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
703
hello !!

actually, i'm getting weight from weight scale who gives values in format of "3 digits . 2 digits"
could i use Brian's method ???
Thanks a lot
 

KlausST

Super Moderator
Staff member
Joined
Apr 17, 2014
Messages
20,556
Helped
4,463
Reputation
8,935
Reaction score
4,500
Trophy points
1,393
Activity points
135,880
Hi,

First there were 4 bytes, ..then we requested the data format...
then there were 4 bytes integer and 3 bytes fractional
now there are 3 bytes integer and 2 bytes fractional

Are you kidding us?

Klaus
 

hirenn

Full Member level 1
Joined
Jul 12, 2014
Messages
96
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
703
my first post and last one are different ...

the last post is ascii format which one is just example
 

betwixt

Super Moderator
Staff member
Joined
Jul 4, 2009
Messages
15,169
Helped
4,948
Reputation
9,917
Reaction score
4,764
Trophy points
1,393
Location
Aberdyfi, West Wales, UK
Activity points
128,853
You can use the same method but as everyone pointed out, you need to know the format of the ASCII data first. If the decimal place is fixed, it wouldn't normally be sent over a serial link, there would be no point if it never changed but then you would have to be careful how you segregated the integer and fraction parts. You can use fractional multipliers like this for example: (based on my previous code)
Code:
float Total;
Total = (data[5] - '0') * 1000;
Total += (data[4] - '0') * 100;
Total += (data[3] - '0') * 10;
Total += (data[2] - '0');
Total += (data[1] - '0') * 0.1;
Total += (data[0] - '0') *0.01;

Note the final result 'Total' has to be a float type rather than integer. In that code "123456" would convert to 1234.56 in decimal.

Brian.
 
  • Like
Reactions: hirenn

    hirenn

    Points: 2
    Helpful Answer Positive Rating

hirenn

Full Member level 1
Joined
Jul 12, 2014
Messages
96
Helped
0
Reputation
0
Reaction score
0
Trophy points
6
Activity points
703
Hello Brian
thanks for reply,
what to do if the point "." is variable in data for example,.. 123.56 or 1234. 56 or 12.56

Thanks !!
 

FvM

Super Moderator
Staff member
Joined
Jan 22, 2008
Messages
48,956
Helped
14,344
Reputation
28,952
Reaction score
13,086
Trophy points
1,393
Location
Bochum, Germany
Activity points
282,435
what to do if the point "." is variable in data for example,.. 123.56 or 1234. 56 or 12.56
Your code becomes variable, too. E.g. using an iteration loop and if () statements.
 

KlausST

Super Moderator
Staff member
Joined
Apr 17, 2014
Messages
20,556
Helped
4,463
Reputation
8,935
Reaction score
4,500
Trophy points
1,393
Activity points
135,880
Hi,

what to do if the point "." is variable in data for example,.. 123.56 or 1234. 56 or 12.56
Maybe we forgot to say:

Therefore a software engineer needs a specification of the data format...before starting to write code.
Giving such informations afterwards and piece by piece is annoying and demotivating.

Klaus
 

betwixt

Super Moderator
Staff member
Joined
Jul 4, 2009
Messages
15,169
Helped
4,948
Reputation
9,917
Reaction score
4,764
Trophy points
1,393
Location
Aberdyfi, West Wales, UK
Activity points
128,853
Agreed, but there is a different method if the character may contain a decimal point and it's position might vary according to the value. Instead of treating the array as individual digits, treat it as a whole ASCII string and use scanf functions to do the conversion. Note that adding scanf functions might significantly increase program size because they cater for several different formats.

The method is to ensure there is a NULL (binary zero) character at the end of the array so you might have to make it one location bigger if there isn't enough space. Then use:

Code:
float Total;
sscanf(data,"%f",&Total);

Brian.
 
  • Like
Reactions: hirenn

    hirenn

    Points: 2
    Helpful Answer Positive Rating
Status
Not open for further replies.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top