/// <summary> /// 这个命令可以设定保留区为无保护下的可读可写、永远可读可写、带密码可读可 /// 写、永远不可读不可写;可以分别设定EPC存储区、用户存储区为无保护下的可 /// 写、永远可写、带密码可写、永远不可写;TID存储区是只读的,永远都不可写。 /// EPC存储区、TID存储区和用户存储区是永远可读的。 /// 标签的保留区一旦设置为永远可读写或永远不可读写,则以后不能再更改其读写 /// 保护设定。标签的EPC存储区、TID存储区或用户存储区若是设置为永远可写或永 /// 远不可写,则以后不能再更改其读写保护设定。如果强行发命令欲改变以上几种 /// 状态,则电子标签将返回错误代码。 /// 在把某个存储区设置为带密码可读写、带密码可写或把带密码锁状态设置为其它 /// 非密码锁状态时,必须给出访问密码,所以,在进行此操作前,必须确保电子标 /// 签已设置了访问密码。 /// </summary> /// <param name="ENum">EPC号长度,以字为单位。EPC的长度在15个字以内,可以为0,否则返回参数错误信息。</param> /// <param name="EPC">要写入数据的标签的EPC号。长度由所给的EPC号决定,EPC号以字为单位,且必须是整数个长度。高字在前,每个字的高字节在前。这里要求给出的是完整的EPC号。</param> /// <param name="Select">一个字节。定义如下: /// Select为0x00时,控制Kill密码读写保护设定。 /// Select为0x01时,控制访问密码读写保护设定。 /// Select为0x02时,控制EPC存储区读写保护设定。 /// Select为0x03时,控制TID存储区读写保护设定。 /// Select为0x04时,控制用户存储区读写保护设定。 /// 其它值保留,若读写器接收到了其他值,将返回参数出错的消息,并且不执行命令。</param> /// <param name="SetProtect">SetProtect的值根据Select的值而确定。 /// 当Select为0x00或0x01,即当设置Kill密码区或访问密码区的时候,SetProtect的值代表的意义如下: /// 0x00:设置为无保护下的可读可写 /// 0x01:设置为永远可读可写 /// 0x02:设置为带密码可读可写 /// 0x03:设置为永远不可读不可写 /// 当Select与SetProtect出现了其他值的时候,将返回参数出错的消息,并且不执行命令。</param> /// <param name="Pwd">4个字节的访问密码。32位的访问密码的最高位在Pwd的第一字节(从左往右)的最高位,访问密码最低位在Pwd第四字节的最低位,Pwd的前两个字节放置访问密码的高字。必须给出正确的访问密码。</param> /// <param name="MaskAdr">一个字节,掩模EPC号的起始字节地址。0x00表示从EPC号的最高字节开始掩模,0x01表示从EPC号的第二字节开始掩模,以此类推。</param> /// <param name="MaskLen">一个字节,掩模的字节数。掩模起始字节地址+掩模字节数不能大于EPC号字节长度,否则返回参数错误信息。</param> /// <returns></returns> public async Task <InfoBase> SetCardProtectAsync(byte ENum, byte[] EPC, ProtectArea Select, byte SetProtect, byte[] Pwd, byte MaskAdr, byte MaskLen) { byte[] frame = CreateSetCardProtectFrame(ENum, EPC, Select, SetProtect, Pwd, MaskAdr, MaskLen); CommunicationReturnInfo cri = await com.SendAsync(frame); if (cri.ReturnValue != ReturnMessage.Success) { InfoBase ib = new InfoBase(); ib.SendByte = frame; ib.ReturnValue = cri.ReturnValue; ib.ExceptionMessage = cri.ExceptionMessage; return(ib); } InfoBase info = HandleBaseFrame(cri.RecvByte); info.SendByte = frame; return(info); }
protected byte[] CreateSetCardProtectFrame(byte ENum, byte[] EPC, ProtectArea Select, byte SetProtect, byte[] Pwd, byte MaskAdr, byte MaskLen) { byte len = (byte)(13 + ENum * 2); FrameBase frame = new FrameBase(len, Com_adr); byte[] db = frame.DataBlock; db[2] = I180006CCmd.SetCardProtect; db[3] = ENum; EPC.CopyTo(db, 4); int index = 4 + ENum * 2; db[index++] = (byte)Select; db[index++] = SetProtect; Pwd.CopyTo(db, index); index += 4; db[index++] = MaskAdr; db[index] = MaskLen; frame.PushCRC(); return(db); }