protected ReadCardInfo HandleReadCardFrame(byte[] frame) { ReadCardInfo info = new ReadCardInfo(frame); ReturnMessage returnCode = CheckFrame(info); if (returnCode != ReturnMessage.Success) { info.ReturnValue = returnCode; return(info); } int len = frame.Length - 6; info.Data = new byte[len]; Array.Copy(frame, 4, info.Data, 0, info.Data.Length); //拷贝数据 info.ReturnValue = ReturnMessage.Success; return(info); }
/// <summary> /// 这个命令读取标签的保留区、EPC存储区、TID存储区或用户存储区中的数据。从指定的地址开始读,以字为单位。 /// </summary> /// <param name="ENum">EPC号长度,以字为单位。EPC的长度在15个字以内,可以为0。超出范围,将返回参数错误信息。</param> /// <param name="EPC">要读取数据的标签的EPC号。长度根据所给的EPC号决定,EPC号以字为单位,且必须是整数个长度。高字在前,每个字的高字节在前。这里要求给出的是完整的EPC号。</param> /// <param name="Mem">一个字节。选择要读取的存储区。0x00:保留区;0x01:EPC存储区;0x02:TID存储区;0x03:用户存储区。其他值保留。若命令中出现了其它值,将返回参数出错的消息。</param> /// <param name="WordPtr">一个字节。指定要读取的字起始地址。0x00 表示从第一个字(第一个16位存储区)开始读,0x01表示从第2个字开始读,依次类推。</param> /// <param name="Num">一个字节。要读取的字的个数。不能设置为0x00,否则将返回参数错误信息。Num不能超过120,即最多读取120个字。若Num设置为0或者超过了120,将返回参数出错的消息。</param> /// <param name="Pwd">四个字节,这四个字节是访问密码。32位的访问密码的最高位在Pwd的第一字节(从左往右)的最高位,访问密码最低位在Pwd第四字节的最低位,Pwd的前两个字节放置访问密码的高字。只有当读保留区,并且相应存储区设置为密码锁、且标签的访问密码为非0的时候,才需要使用正确的访问密码。在其他情况下,Pwd为零或正确的访问密码。</param> /// <param name="MaskAdr">一个字节,掩模EPC号的起始字节地址。0x00表示从EPC号的最高字节开始掩模,0x01表示从EPC号的第二字节开始掩模,以此类推。</param> /// <param name="MaskLen">一个字节,掩模的字节数。掩模起始字节地址+掩模字节数不能大于EPC号字节长度,否则返回参数错误信息。</param> /// <returns></returns> public async Task <ReadCardInfo> ReadCardAsync(byte ENum, byte[] EPC, MemoryArea Mem, byte WordPtr, byte Num, byte[] Pwd, byte MaskAdr, byte MaskLen) { byte[] frame = CreateReadCardFrame(ENum, EPC, Mem, WordPtr, Num, Pwd, MaskAdr, MaskLen); CommunicationReturnInfo cri = await com.SendAsync(frame); if (cri.ReturnValue != ReturnMessage.Success) { ReadCardInfo rci = new ReadCardInfo(); rci.SendByte = frame; rci.ReturnValue = cri.ReturnValue; rci.ExceptionMessage = cri.ExceptionMessage; return(rci); } ReadCardInfo info = HandleReadCardFrame(cri.RecvByte); info.SendByte = frame; return(info); }