代码之家  ›  专栏  ›  技术社区  ›  user1926550

NFC温度记录器命令

  •  1
  • user1926550  · 技术社区  · 10 年前

    我正在编写Android应用程序。我有一个SL13A温度数据记录器,我正在尝试从记录器中读取温度,但我真的不知道如何读取。

    以下是数据表: http://www.mouser.com/ds/2/588/AMS_SL13A_Datasheet_EN_v4-371531.pdf

    我正在使用获取温度命令(命令代码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 回复  |  直到 10 年前
        1
  •  2
  •   Michael Roland    10 年前

    首先(尽管您似乎无论如何都得到了正确的响应),当您想要使用命令的寻址版本(即包含可选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() 方法将仅是ISO 15693帧的有效载荷。因此,您将获得标志字节(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。数据表不太清楚这是每个芯片的校准值还是该类型芯片的静态值。