Напряжение аккумулятора регистратора NFC
У меня есть регистратор данных ( таблица данных), и я пытаюсь получить напряжение батареи с помощью команды Получить уровень заряда батареи (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 ответ
Кажется, в вашем коде есть две проблемы:
Вы используете неверное покрытие между полученным байтовым значением и целочисленным значением.
Байты (а также целые числа) в 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;
чтобы получить значение в милливольтах.