Получить в java число с плавающей запятой, отправленное из Arduino как uint8

Я делаю приложение, которое отправляет значения с плавающей запятой из arduino (используя Xbee для передачи) в приложение на Java (используя Xbee для получения). Проблема в том, что когда я получаю данные на Java, я не могу преобразовать их в исходное число с плавающей запятой, которое я сохранил в пакете xbee.

Это то, что у меня есть,

Ардуино:

uint8_t* data;
float value = (voltage*100)/5;
data = (uint8_t*)(&value);
for(int i = 0; i<sizeof(data); i++) Serial.println(data[i]):
Serial.println(*((float*)(data)));

Здесь я беру значение с плавающей запятой и сохраняю его в массиве данных в виде байтов. Например, для значения 22,66 то, что я получаю в первой печати, — это значения 0 и 72 (размер данных равен 2 после сохранения значения с плавающей запятой). Второй отпечаток получает 22,66. Таким образом, кажется, что значение хранится правильно.

После этого я отправляю данные на Java в пакете Xbee и получаю такие данные на Java:

XBeeResponse response = xbee.getResponse(2000);
int[] data = response.getProcessedPacketBytes();
System.out.println(data[7] + " " + data[8]); //these positions contain the values stored in arduino -> data[7] = 0 and data[8] = 72)

Я хотел бы знать, как получить значение 22,66 в java из позиций данных [7] и данных [8]. Я пробовал некоторые вещи, такие как:

int value = (data[7]) | (data[8]<<8);
float valuef = Float.intBitsToFloat(value);

Но это не сработало.

Кто-нибудь знает, как я мог это сделать?

Спасибо!

PS: если это поможет, я использую следующие библиотеки xbee в java и arduino: https://github.com/andrewrapp/xbee-api https://github.com/andrewrapp/xbee-arduino< /а>


person Kzuyak    schedule 05.07.2016    source источник
comment
Вы должны использовать sizeof(value), который будет 4 байта.   -  person tomlogic    schedule 06.07.2016


Ответы (2)


Если вам еще нужен ир:

В Ардуино:

    #include "XBee.h"

    #define SensorAPin (2)
    #define SensorBPin (3)

    float fSensorA ;
    float fSensorB ;
    XBee xbee = XBee();

    uint8_t payload[8] = { 0, 0, 0, 0, 0, 0, 0, 0};

    union u_tag {
        uint8_t b[4];
        float fval;
    } u;


    // SH + SL Address of receiving XBee
    XBeeAddress64 addr64 = XBeeAddress64(0x0013a200, 0x40a300ee); 
    ZBTxRequest zbTx = ZBTxRequest(addr64, payload, sizeof(payload));
    ZBTxStatusResponse txStatus = ZBTxStatusResponse();

    void setup() { 

    Serial.begin(9600); 
    xbee.setSerial(Serial);

    }

    void loop() { 
    if (!isnan(fSensorA) && !isnan(fSensorB)) {

        u.fval = fSensorA;
        for (int i=0;i<4;i++){
          payload[i]=u.b[i];
        }
        u.fval = fSensorB;
        for (int i=0;i<4;i++){
          payload[i+4]=u.b[i];
        }

        xbee.send(zbTx);
      }
    }

В Java:

    import java.io.InputStream;
    import java.nio.ByteBuffer;
    import java.nio.ByteOrder;

    import com.digi.xbee.api.listeners.IDataReceiveListener;
    import com.digi.xbee.api.models.XBeeMessage;
    import com.digi.xbee.api.utils.HexUtils;
    import java.util.Arrays;

    public class MyDataReceiveListener implements IDataReceiveListener {
        /*
         * (non-Javadoc)
         * @see         com.digi.xbee.api.listeners.IDataReceiveListener#dataReceived(com.digi.xbee.api.models.XBeeMessage)
         */
        @Override
        public void dataReceived(XBeeMessage xbeeMessage) {
            System.out.format("From %s >> %s | %s%n", xbeeMessage.getDevice().get64BitAddress(), 
            HexUtils.prettyHexString(HexUtils.byteArrayToHexString(xbeeMessage.getData())), 
            new String(xbeeMessage.getData()));

            byte[] bytes = xbeeMessage.getData();
            byte[] byte_var1 = Arrays.copyOfRange(bytes,0,4); 
            byte[] byte_var2 = Arrays.copyOfRange(bytes,4,8); 
            float f_sensor1 = ByteBuffer.wrap(byte_var1).order(ByteOrder.nativeOrder()).getFloat();
            float f_sensor2 = ByteBuffer.wrap(byte_var2).order(ByteOrder.nativeOrder()).getFloat();
            System.out.println("variable 1: "+ f_var1);
            System.out.println("variable 2: "+ f_var2);


        }

    }
person Oriana    schedule 25.05.2017
comment
В arduino вы отправляете массив uint_8 byte[], поэтому в Java вам нужно прочитать этот байтовый массив и декодировать его в формат с плавающей запятой IBM, поэтому для разделения байтов, представляющих каждое число с плавающей запятой, отправленное из arduino, вы можете использовать Arrays.copyOfRange () для создания массива суббайтов каждого числа с плавающей запятой, затем вы можете использовать функцию bytebuffer для получения числа с плавающей точкой каждого массива суббайтов: ByteBuffer.wrap(byte_var1).order(ByteOrder.nativeOrder()).getFloat( ); - person Oriana; 25.05.2017

Этот работает для меня

float myFloat=ByteBuffer.wrap(yourByteArray).order(ByteOrder.BIG_ENDIAN).getFloat();

используйте порядок ByteOrder.BIG_ENDIAN, ByteOrder.LITTLE_ENDIAN или ByteOrder.nativeOrder() в соответствии с вашим методом преобразования float в uint_8.

person Sonia John Kavery    schedule 05.01.2019