Hello everybody,
I am very new to C language. In my project I get data serially from a port pin. I want to save the first 8 bits to one variable, another to second & so on. In all I want to save 32 bits in 4 bytes. Can you suggest C code.
I know it in assembly by using RRC or RLC, but how to achieve it in C?
Thanks
Good lord, why use this indentation
if(DATA) { data_received =| ( 1 << bits_received ) ; // I always add a trailing space }
when you can do this
if (DATA) { data_received |= (1 << bits_received); // I always add a trailing space }
The horror, the horror...
Indentation is religion. There are no "right" indentation.
Consider unsigned long prefixes:
b3 = (data_received & 0xFF000000ul) >> 24;
Some compilers will complain about constants out of range if you don't tell they are long. Some compilers will complain about mixing of signed and unsigned if you don't tell that your constant is unsigned.
Some compilers will like shift befure and, just so they can pick up a byte directly instead of having an 8-bit processor doing a 32-bit and operation. Not sure if Keil C51 will detect and optimize. Or even go one step further and skip the shift too - just pick up the relevant byte directly from memory.
And you manage to fit 32 bits in the following variable?
unsigned int data_received;
sorry, was thinking in integer size in windows 32.
In terms of indentation religion I'm a pastafarian.
to split just do a byte *** operation
Hmmmmm.
Thank you christian crosa, Per Westermark.
I will try this. While searching for this I came across a solution which uses union
stackoverflow.com/.../how-do-i-split-up-a-long-value-32-bits-into-four-char-variables-8bits-using
union { unsigned long position; unsigned char bytes[4]; } CurrentPosition; CurrentPosition.position = 7654321;
The bytes can now be accessed as: CurrentPosition.bytes[0], ..., CurrentPosition.bytes[3]
Though I will be using your approach which seems very simple to me. Just asking for my knowledge, can union be used for this conversion?
yep, the use of the union should work too.
I came across a solution which uses union
Be careful with these things! Read about them here:
c-faq.com/.../index.html
In particular, see here:
c-faq.com/.../taggedunion.html
Be careful with these things! Read about them here: 'simple' unions like the long/char combo discussed here is nothing to be afraid of HOWEVER, I have seen unions made by the "I'll show them how smart I am" types that were sheer horror.
Erik
Thank you all of you. You people helped me a lot.
One more thing, as the 1st incoming bit should be MSB & last should be LSB, I changed the code to..
data_received |= ( 0x80000000 >> bits_received );
Is it ok?
Yep, that should work