NFC记录器电池电压
NFC logger battery voltage
我有一个数据记录器 (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; }
您的代码中似乎有两个问题:
您在接收到的字节值和整数值之间使用了不正确的转换。
Java 中的字节(以及整数)是有符号字节。不过,温度记录器将该字节视为无符号。因此,当您的字节值处于负数范围内(高位 = 1)时,当您将值分配给整数变量时,此符号位将被扩展。为了将字节值转换为其无符号整数表示,您必须截断扩展符号位:
int batCode = replyData[1] & 0x0FF;
第二个问题是您在公式中使用的单位。 6.32 是以毫伏为单位的值,而 1.62 是以伏特为单位的值。因此,你应该使用
double batLvl = (6.32d * batCode / 1000.0d) + 1.62d;
获取伏特值或
double batLvl = (6.32d * batCode) + 1620.0d;
获取以毫伏为单位的值。
我有一个数据记录器 (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; }
您的代码中似乎有两个问题:
您在接收到的字节值和整数值之间使用了不正确的转换。
Java 中的字节(以及整数)是有符号字节。不过,温度记录器将该字节视为无符号。因此,当您的字节值处于负数范围内(高位 = 1)时,当您将值分配给整数变量时,此符号位将被扩展。为了将字节值转换为其无符号整数表示,您必须截断扩展符号位:
int batCode = replyData[1] & 0x0FF;
第二个问题是您在公式中使用的单位。 6.32 是以毫伏为单位的值,而 1.62 是以伏特为单位的值。因此,你应该使用
double batLvl = (6.32d * batCode / 1000.0d) + 1.62d;
获取伏特值或
double batLvl = (6.32d * batCode) + 1620.0d;
获取以毫伏为单位的值。