Probably, you are looking for something like:
The Codes:
uint8_t serialBytes[] = //arbitrary data in 2's complement form
{
0xC0, 0x00, 0x00, //header 3-byte
0xFF, 0x60, 0xAD, //Ch-1 //FF60AD = -40787.00
0x12, 0x34, 0x56, //Ch-2 //123456 = 1193046.00
0x78, 0x9A, 0xAB, //Ch-3 //789AAB = 7903915.00
0xCD, 0xEF, 0xF0, //Ch-4 //CDEFF0 = -3280912.00
0x80, 0x83, 0x98, //Ch-5 //808398 = -8354920.00
0xCC, 0xBD, 0x1C, //Ch-6 //CCBD1C = -3359460.00
0x3B, 0xEF, 0xFE, //Ch-7 //3BEFFE = 3928062.00
0x45, 0xDC, 0x57 //Ch-7 //45DC57 = 4578391.00
};
float storeVoltage[8]; //save Ch0-Ch7 values as decimal numbers
uint32_t myData[8] = {0}; //save 8-Channel data as bits
void setup()
{
Serial.begin(9600);
}
void loop()
{
for (int i = 1, j = 0; i <= 8, j < 8; i++, j++) //form binary bits
{
myData[j] = (uint32_t)(serialBytes[3 * i]) << 16 |
(uint32_t)(serialBytes[3 * i + 1]) << 8 |
(uint32_t)(serialBytes[3 * i + 2]);
}
Serial.print("Arbitrary Channel Data in 2's Complenet Form:");
for (int j = 0; j < 8; j++)
{
Serial.print((myData[j]& 0x00FFFFFF), HEX); Serial.print(" ");
}
Serial.println();
Serial.println("-------------------------------------------------------");
findVoltage(); //save above binary bits as decimal values (Ch0-Ch7)
delay(5000);
Serial.println("============================================================================");
}
void findVoltage()
{
for (int i = 0; i < 8; i++)
{
bool n = bitRead(myData[i], 23); //reading bit-27 for 0 (+ve) or 1(-ve)
float x1 = -n * pow(2, 23); //getting: -1*2^23
Serial.print("Ch-"); Serial.print(i);
Serial.print(":Magnitude of MSB: ");
Serial.print(x1, 2); //-8388608.00
Serial.print("\t");
uint32_t x2 = myData[i] & 0x007FFFFF;
float x3 = (float)x2;
// Serial.println(x3, 2); //+8347821.00 = 7F60AD
storeVoltage[i] = (x1 + x3);
Serial.print("Final Value of Channel Volatge: ");
Serial.println(storeVoltage[i], 2);//(x1 + x3), 2); //-40787.00 = FF60AD (2's complement form)
}
}
