Converting two decimal numbers into binary, concatenating the resulting 8 bit integers to get 16 bit signed integer and converting to signed float (IMU)

16 visualizzazioni (ultimi 30 giorni)
So I have this 6DOF IMU that spits out data packets as follows:
sensorData = [85 13 109 85 12 147 12 0 156 0 71 255 229 10 144 252];
The acceleration in x axis for example, would be found by converting 12 and 147 to 8 bit binary numbers, concatenating them to get signed 16 bit binary number and converting them to signed floating point number.
I am not sure how to properly write the code to do the job. Here's my code for example, which doesn't work as expected:
sensorData = read(characteristic(b, "FF06", "FF08"));
z(i,1) = (typecast(uint16(bin2dec(strcat(dec2bin(sensorData(5),8), dec2bin(sensorData(6),8)))),'int16'))/SFacc; %SFacc = 8192 LSB/ms^-2
Am I doing something wrong? The values I receive are not what I am expecting.

Risposta accettata

Walter Roberson
Walter Roberson il 23 Nov 2019
double( swapbytes(typecast(uint8(sensorData), 'int16')) ) / SFacc
  4 Commenti
Walter Roberson
Walter Roberson il 23 Nov 2019
Yes, it takes groups of two uint8 to form the int16.
All supported versions of MATLAB for a number of years have been on Intel architecture, which is "little endian". For little endian, the byte pair A, B when bundled together into a single 16 bit entity, are mathematically A + 256*B not 256*A + B . The swapbytes() reorders the byte pairs within the 16 bit numbers.

Accedi per commentare.

Più risposte (0)

Tag

Prodotti


Release

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by