VBA如何指向/获取字节数组变量的整数值

时间:2015-05-18 21:31:39

标签: arrays vba pointers byte rfid

我有问题要获取变量的整数十六进制值。 我有2个RFID标签,其中TID是:E2 00 68 06 73 D5 E2 1F和E2 00 68 06 73 D5 E0 16

每个下一个标签都标有E2 00 68 06 73 .. .. ..并且最后3位正在改变,以便为每个RFID标签提供唯一ID。

我正在使用带有SDK的RFID阅读器。我有开放端口的功能,并在读卡器范围内读取RFID的TID。函数声明如下:

Private Declare Function Inventory_G2 Lib “ZK_RFID105.dll” (ByRef ConAddr As Byte, ByVal AdrTID As Byte, ByVal LenTID As Byte, ByVal TIDFlag As Byte, EPClenandEPC As double/BYTE, ByRef Totallen As Long/BYTE, ByRef CardNum As Long, ByVal PortHandle As Long) As Integer

当我调用函数时,结果我收到EPClenandEPC和Totallen。

我正在调用函数:

k = Inventory_G2(0, 0, 4, 1, EPClenandEPC, Totallen, CardNum, 3)

0,0,4,1,是输入(没关系)。功能读取RFID标签并返回: Totallen - 已加入的字节数 - 9 EPClenandEPC - 可变的TID值。

不幸的是,当我想获得TID的值时,它应该是:E2 00 68 06 73 D5 E2 1F用于第一个带RFID的RFID标签我收到 08 E2 00 68 06 73 D5 E2 这意味着结果的长度(8位)。我想得到最后一点,应该是 1F

我做错了什么?如何读取结果变量EPClenandEPC的整个值?我不希望这个第一个08字节我想拥有整个最后一位1F的实例。

调用函数后我用来读取EPClenandEPC的代码:

dblVar=EPClenandEPC

MsgBox Mem_ReadHex(VarPtr(DBLVAR),9)

功能memreadhex:

    Public Function Mem_ReadHex(ByVal Ptr As LongPtr, ByVal Length As Long) As String
    Dim bBuffer() As Byte, strBytes() As String, I As Long, ub As Long, b As Byte
    ub = Length - 1
    ReDim bBuffer(ub)
    ReDim strBytes(ub)
    RtlMoveMemory bBuffer(0), ByVal Ptr, Length
    For I = 0 To ub
        b = bBuffer(I)
        strBytes(I) = IIf(b < 16, "0", "") & Hex$(b)
    Next
    Mem_ReadHex = Join(strBytes, "")
End Function

和VarPtr声明/ rtlmovememory:

Private Declare PtrSafe Function VarPtrArray Lib "VBE7" Alias _
"VarPtr" (ByRef Var() As Any) As LongPtr

Private Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)

DLL inventory_g2函数结果描述:EPClenandEPC:输出,指向存储库存结果的数组。它是标签阅读器读取的EPC数据。阵列的单位包括1字节EPCLen和N(EPCLen的值)字节EPC。它是每个标签的EPC中的前高字,低字。它是每个字中的前一个高字节,低字节。 感谢您的支持

1 个答案:

答案 0 :(得分:0)

我发现第一位的EPClenandEPC包含ist结果位数量。 TID具有8位值,因此最后一位是不可读的,因为第一位总是&#34; 08&#34;。 VBA可以保存货币数据类型最多8位。 由于RFID标签的制造商,因为TID的第一位总是相同的,所以我决定改变读取地址而不是6位TID。

大胆改变:Inventory_G2(0, 1 3 ,1,EPClenandEPC,Totallen,CardNum,3)

现在我有每个TID的最后6位。我不需要前两个。

谢谢。