NFC记录器电池电压

时间:2015-03-17 15:46:42

标签: android tags nfc rfid iso-15693

我有一个数据记录器(datasheet),我试图使用获取电池电量命令(0xAA)获得电池电压,但结果不正确(负数)。谁知道什么似乎有问题?

我的源代码:

public static double cmdGetBatteryLevel(Tag tag, NfcV nfcvTag) throws IOException {
    byte[] comGetBatLvl = new byte[]{
        (byte) 0x20, // Flags - addressed
        (byte) 0xAA, // Command: Get Battery Level
        (byte) 0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,  // placeholder for tag UID
    };

    System.arraycopy(tag.getId(), 0, comGetBatLvl, 2, 8);

    byte[] replyData = nfcvTag.transceive(comGetBatLvl);
    int batCode = replyData[1];  

    //3V battery
    double batLvl = (batCode*6.32) + 1.62;

    // 1.5V battery
    //double batLvl = (batCode*3.35) + 860;

    return batLvl;  }

1 个答案:

答案 0 :(得分:0)

您的代码中似乎存在两个问题:

  1. 您在接收的字节值和整数值之间使用了错误的转换。

    Java中的字节(以及整数)是带符号的字节。温度记录器将字节视为无符号。因此,当您的字节值处于负范围(高位= 1)时,当您将值赋给整数变量时,此符号位将被扩展。为了将字节值转换为无符号整数表示,您必须截断扩展符号位:

    int batCode = replyData[1] & 0x0FF;
    
  2. 第二个问题是您在公式中使用的单位。 6.32是以毫伏为单位的值,而1.62是以伏特为单位的值。因此,你应该使用

    double batLvl = (6.32d * batCode / 1000.0d) + 1.62d;
    

    以伏特或

    获取值
    double batLvl = (6.32d * batCode) + 1620.0d;
    

    以毫伏为单位获取值。