Передача float в Processing
- Войдите на сайт для отправки комментариев
Пт, 03/11/2017 - 17:38
В 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б.
Все таки что то не так, цифры не совпадают.
float val = 158.7632040
val= 158.7631988525
value = 158.7631988525
В результате 158.7632
В 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
p.s. Пока писал нашел решение - у Arduino и Processing разные понимания байта. Заменил byte[] outData=new byte[4]; на int [] outData=new byte[4];
Вы только никому это решение не показывайте. Обвинят ещё в умышленном нанесении ущерба сельскому хозяйству :)))