I am trying to send & receive data between Raspberry Pi (using C programming) & Arduino (using Arduino IDE).
Based on what I can find on the internet, it points to me that both are in little endian format.
I am sending integers between them using a serial communication (RS232) with the library "RS-232 for Linux and Windows" at teuniz.net/RS-232
Based on my knowledge, if both are in little endian format, I do not need to do any shifting on the bits. However, in my case with the codes below, there is a need for me to shift the bits read in by Arduino. I am not sure why I need to perform the bit shifting when both are little endian (in order to get the correct data). Without further ado....
C Code:
unsigned char buf[4];
int g = 100;
memcpy(buf, (char*)&g, sizeof(int));
// port 24 for ttyACM0
if(RS232_SendBuf(24, buf, sizeof(int)) == -1)
{
// error processing here
}
Arduino Code:
long a[4];
long value = 0;
void loop(){
if(Serial.available()>=4){
for(int i = 0; i < 4 ; i++){
a[i] = Serial.read();
}
// Over here i need to shift the LSB of the byte received to the MSB of the long var until the MSB of byte becomes LSB of long var
// i do not have the code which is faulty right now as its already past midnight and my group mates are already asleep so I will post again in the morning
value += a[0];
value += a[1] << 8;
value += a[2] << 16;
value += a[3] << 24;
Serial.println(value); // now it prints out 100 correctly
value = 0;
}
}
Would appreciate all help! Sorry still new to C and endian!
UPDATE: I think i know why the above is happening! Please comment below to let me know if my assumption is right/wrong!
I am sending an int value of 170 in C. 170 is 0x000000aa in HEX. When i memcpy (this is where little endian comes in), it is stored as aa 00 00 00 (LSB to MSB). So when i get the value in arduino, i will definitely need to do the shifting as an integer is read from MSB to LSB (and because there is no memory copy/read in arduino, i do not care any endian problem here).
However, as Arduino is slow in processing (it has a lot of other stuffs to calculate!!), can i make my C code such that:
int g = 170;
unsigned char buf[4];
// below line not needed anymore??
//memcpy(buf, (char*)&g, sizeof(long));
if(RS232_SendBuf(24, (char *)&g, sizeof(int)) == -1)
{ ... }
Would like to hear more so I can learn more! Looks like I got my basics wrong at the beginning when I asked this question!
Your code looks fine to me (I haven't run it).
0xaabbccdd.dd, cc, bb, aa. They would be sent down the wire in that order.a would also contain dd, cc, bb, aa.value as (dd << 0) + (cc << 8) + (bb << 16) + (aa << 24), giving 0xaabbccdd.You are parsing a 32 bit little endian value, not a big endian value. The first byte ends up in the least significant bits; the last byte ends up in the most significant bytes.
If you were converting a buffer which contained a big endian value, the code would look like:
uint8_t a[4];
int value = 0;
for ( int i = 0; i < 4; ++i )
{
value << 8 * i; // shift everything over one byte
value += a[ i ]; // add the next byte to the LSByte
}
You see the difference?
User contributions licensed under CC BY-SA 3.0