Напряжение аккумулятора регистратора 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 ответ

Решение

Кажется, в вашем коде есть две проблемы:

  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;
    

    чтобы получить значение в милливольтах.

Другие вопросы по тегам