首页 文章

在java中获取从Arduino发送的浮点数作为uint8

提问于
浏览
0

我正在创建一个应用程序,它将arduino(使用Xbee传输)的浮点值发送到Java中的应用程序(使用Xbee接收) . 问题是,当我用Java接收数据时,我无法将其转换为我存储在xbee数据包中的原始浮点数 .

这就是我的意思,

Arduino的:

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 . 所以似乎值正确存储 .

之后,我将数据发送到Xbee数据包中的Java,我在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)

我想知道如何从位置数据[7]和数据[8]中获取java中的值22.66 . 我尝试过一些事情:

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

但它没有用 .

任何人都知道如何做到这一点?

谢谢!

PS:如果它有帮助,我在java和arduino中使用以下xbee库:https://github.com/andrewrapp/xbee-api https://github.com/andrewrapp/xbee-arduino

2 回答

  • 0

    如果你还需要ir:

    在Arduino:

    #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);
    
    
            }
    
        }
    
  • 0

    这个对我有用

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

    根据你的float to uint_8转换方法使用ByteOrder.BIG_ENDIAN,ByteOrder.LITTLE_ENDIAN或ByteOrder.nativeOrder() .

相关问题