2016-07-05 66 views
0

我正在制作一个应用程序,它将从Arduino(使用Xbee发送)的浮点值发送到Java应用程序(使用Xbee接收)。 问题是,当我在Java中接收数据时,我无法将其转换为存储在xbee数据包中的原始浮点数。在Java中获取从Arduino发送的浮点数作为uint8

这就是我,

的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。所以看起来这个值是正确存储的。

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

我想知道如何从位置获得Java中的值22.66数据[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

+0

你应该使用'sizeof(value)',它将是4个字节。 – tomlogic

回答

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

在arduino中,您发送的是uint_8 byte []数组,因此在Java中,您必须读取该字节数组并解码为IBM浮点格式,因此要分隔表示从arduino发送的每个浮点数的字节,可以使用Arrays。 copyOfRange()创建每个float的子字节数组,然后你可以使用bytebuffer函数获取每个子字节数组的浮点数:ByteBuffer.wrap(byte_var1).order(ByteOrder.nativeOrder())。getFloat (); – Oriana