【问题标题】:Get in java a float number sent from Arduino as uint8在java中获取从Arduino发送的浮点数作为uint8
【发布时间】:2016-07-05 19:47:07
【问题描述】:

我正在制作一个应用程序,它将浮点值从 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。所以看起来值存储正确。

之后,我将数据以 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)

我想知道如何从位置 data[7] 和 data[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

【问题讨论】:

  • 你应该使用sizeof(value),这将是4个字节。

标签: java arduino xbee uint8t


【解决方案1】:

如果您还需要 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);


        }

    }

【讨论】:

  • 在 arduino 中,您正在发送一个 uint_8 byte[] 数组,因此在 Java 中,您必须读取该字节数组并解码为 IBM 浮点格式,以便分离代表从发送的每个浮点数的字节arduino,您可以使用 Arrays.copyOfRange() 创建每个浮点数的子字节数组,然后可以使用 bytebuffer 函数获取每个子字节数组的浮点数: ByteBuffer.wrap(byte_var1).order(ByteOrder .nativeOrder()).getFloat();
【解决方案2】:

这个对我有用

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

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

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2021-05-11
    • 1970-01-01
    相关资源
    最近更新 更多