Передача float в Processing

ata3d
Offline
Зарегистрирован: 24.05.2017

В Arduino преобразую float в byte и назад

float val = 158.7632040;

union u_tag {
   byte x[4];
   float fval;
} u;

void setup() {
  Serial.begin(9600);
  Serial.print("val= ");
  Serial.println(val, DEC);
//float to byte  
  byte *x = (byte *)&val;
  for (int i=0; i<4; i++) {
    Serial.println(x[i], DEC);
   }
 //byte to float
u.x[0] = 97;
u.x[1] = 195;
u.x[2] = 30;
u.x[3] = 67;

val = u.fval;
  Serial.print("value = ");
  Serial.print(val, DEC);
}

void loop() {
}

Все работает, данные такие

val= 158.7631988525
97
195
30
67
value = 158.7631988525

вставляю данные {97,195,30,67} в Processing и он начинает ругаться на 195.

p.s. Пока писал нашел решение  - у Arduino и Processing разные понимания байта. Заменил byte[] outData=new byte[4]; на int [] outData=new byte[4];

float y;
  int[] outData= {97,195,30,67};
           int asInt = (outData[0] & 0xFF) 
            | ((outData[1] & 0xFF) << 8) 
            | ((outData[2] & 0xFF) << 16) 
            | ((outData[3] & 0xFF) << 24);
   y = Float.intBitsToFloat(asInt);
   println(y);

В результате получил с округлением 158.7632б.
 

ata3d
Offline
Зарегистрирован: 24.05.2017

Все таки что то не так, цифры не совпадают.

float val = 158.7632040

val= 158.7631988525
value = 158.7631988525

В результате  158.7632

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ata3d пишет:

В Arduino преобразую float в byte и назад

float val = 158.7632040;

union u_tag {
   byte x[4];
   float fval;
} u;

вставляю данные {97,195,30,67} в Processing и он начинает ругаться на 195.

ну, ругается-то понятно почему, там видимо byte знаковый и 195 не помещается.

Определите нормально, должно работать

float val = 158.7632040;

union u_tag {
   unsigned char x[sizeof(float)];
   float fval;
} u;

и вообще, везде вместо byte поставьте unsigned char

ata3d пишет:

p.s. Пока писал нашел решение  - у Arduino и Processing разные понимания байта. Заменил byte[] outData=new byte[4]; на int [] outData=new byte[4];

Вы только никому это решение не показывайте. Обвинят ещё в умышленном нанесении ущерба сельскому хозяйству :)))