2015-03-09 5 views
0

Я кодирую приложение Android. У меня есть регистратор данных температуры SL13A, и я пытаюсь читать температуру у регистратора, но я действительно не знаю, как это сделать.Команды регистратора температуры NFC

Вот техническое описание: http://www.mouser.com/ds/2/588/AMS_SL13A_Datasheet_EN_v4-371531.pdf

Я использую команду Get Temperature (код команды 0xAD).

Мой код так:

   NfcV nfcvTag = NfcV.get(tag); 

       try { 
        nfcvTag.connect(); 
       } catch (IOException e) { 
        Toast.makeText(getApplicationContext(), "Could not open connection!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

       try { 

        byte[] comReadTemp = new byte[]{ 
          (byte) 0x00, // Flags 
          (byte) 0xAD, // Command: Get Temperature 
          (byte) 0xE0,(byte) 0x36,(byte) 0x04,(byte) 0xCA,(byte) 0x01,(byte) 0x3E,(byte) 0x12,(byte) 0x01, // UID - is this OK? 
        }; 


        byte[] userdata = nfcvTag.transceive(comReadTemp); 


        tvText.setText("DATA: " + userdata.length); 

       } catch (IOException e) { 
        Toast.makeText(getApplicationContext(), "An error occurred while reading!", Toast.LENGTH_SHORT).show(); 
        return; 
       } 

Я не уверен, что флаги, чтобы установить, и если я ставлю UID параметр в команде правильно.

А также мой вопрос: как мне получить температурные биты из командной реакции? В техническом описании показано, что первые 8 бит командного ответа являются флагами, следующие 16 бит - это температура, а последние 16 бит - это CRC. Но кажется, что я получаю только 3 байта в ответе (userdata.length равно 3).

Любая помощь будет оценена по достоинству.

ответ

1

Прежде всего (хотя вы все равно получаете правильный ответ), если вы хотите использовать адресную версию команды (то есть ту, которая содержит необязательное поле UID), вам нужно установить адресный бит в байт флагов. Поэтому флаги должны быть 0x20.

Как правило, вы можете создать команду, как это:

byte[] comReadTemp = new byte[]{ 
     (byte) 0x20, // Flags 
     (byte) 0xAD, // Command: Get Temperature 
     (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, comReadTemp, 2, 8); 

ответ, который вы получите от метода transceive() будет только полезной нагрузкой 15693 рамов ISO. Таким образом, вы получите байты флагов (1 байт) и значение температуры (2 байта). SOF, CRC и EOF автоматически делятся на стек NFC (так же, как они автоматически добавляются при отправке данных).

Так байты 1..2 из userdata содержит значение температуры:

int tempCode = ((0x003 & userdata[2]) << 8) | 
       ((0x0FF & userdata[1]) << 0); 
double tempValue = 0.169 * tempCode - 92.7 - 0.169 * 32; 

Если предположить, что смещение калибровки код 32. техническое описание не очень понятно, если это за чип значение калибровки или статическое значение для этот тип чипа.

+0

Благодарим вас за ответ. Я попробовал ваше решение, но температура (tempValue) неверна. Я получаю разные результаты каждый раз (например: -97.7620, -11.234, 32.02999 и некоторые другие). Я также не совсем понимаю, почему вы используете 0x003 в ((0x003 и userdata [1]) << 8). И да, я считаю, что код калибровки равен 32. – user1926550

+0

Я думаю, что правильный путь: int tempCode = ((0x003 & userdata [2]) << 8) | ((0x0FF & userdata [1]) << 0); – user1926550

+0

@ user1926550 Вы правы. userdata [2] должен быть MSB и userdata [1] LSB. –