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

9 vues (au cours des 30 derniers jours)
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.

Réponse acceptée

Walter Roberson
Walter Roberson le 23 Nov 2019
double( swapbytes(typecast(uint8(sensorData), 'int16')) ) / SFacc
  4 commentaires
Walter Roberson
Walter Roberson le 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.
Swapnil Sayan Saha
Swapnil Sayan Saha le 23 Nov 2019
The concatenation indeed follows little endian (as per the datasheet of the IMU).

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Tags

Produits


Version

R2019b

Community Treasure Hunt

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

Start Hunting!

Translated by