admin 管理员组

文章数量: 1087139


2024年3月9日发(作者:linuz另起一个shell执行命令)

RFID

实验七 UHF 900MHz ISO 18000-6识别标签号

5.1 UHF 900MHz ISO 18000-6识别标签号

5.1.1

协议原理

1.ISO/IEC 18000-6国际标准协议第六部分协议要求

ISO/IEC18000-6《信息技术—针对物品管理的射频识别(RFID)第六部分:针对频率为860~930MHz无接触通信空气接口参数》的阅读器与应答器之间的物理接口、协议和命令以及防冲突判断机制。

Type A协议的通信机制是基于一种“阅读器先发言”的,即基于阅读器的命令与应答器的回答之间交替发送的机制。整个通信中的数据信号定义为“0”、“1”、“SOF”和“EOF”4种。

通信中的数据信号的编码和调制方法定义如下。

(1)阅读器到应答器之间的通信传输:阅读器发送的数据采用ASK(调制载波幅度)进行调制,调制深度是30%(误差不超过3%);数据编码采用脉冲宽度编码(PIE)来编码数据,即通过定义下降沿之间的不同宽度来表示不同数据信号。

(2)应答器到阅读器之间的传输连接:应答器通过反向散射给阅读器来传输信息;数据编码采用FMO编码,数据速率是40kbps。

(3)防冲突采用时隙ALOHA算法。

2.数据命令解析

上位机向下位机发送命令格式如下:

SOF

1

LEN

EBV

CMD

1

PAYLOAD

-

*CRC16

2

EOF

1

下位机对上位机响应命令格式如下:

SOF

1

LEN

EBV

CMD

1

STATUS

1

PAYLOAD

-

*CRC16

2

EOF

1

数据命令解析如下(长度的单位均为字节)。

SOF:0xAA。

LEN:SOF~EOF之间数据长度,即LEN+CMD+PAYLOAD+CRC16。

CMD位说明如下:

7

0:数据包没有CRC校验

1:数据包为CRC校验

6~0

模块命令

STATUS:发送命令中没有Status字段,只存在响应数据包中。高四位是通用响应标志,低四位是各命令特有的响应标志。

Status位说明如下:

7

0:执行命令失败

6

1:CRC校验失败

5

保留

4

保留

3~0

各命令状态见命令表

1:执行命令成功 0:CRC校验成功

PAYLOAD:各命令需要传送的实际数据,数据长度在各命令格式中定义,最长512字节。

CRC16:对LEN CMD PAYLOAD部分计算的CRC16值,当上位机的命令的CRC16校验失败时,返回固定格式的响应,且STATUS值为0xC0。

EOF:0x55标识一帧结束。

3.具体发送的命令

本节内容主要为寻卡操作与设计,寻单卡操作上位机向下位机发送的数据命令为“AA

02 10 55”(02代表“02 10”共两个字节,10代表识别单标签命令)。

寻多卡操作上位机向下位机发送的数据命令为“AA 03 11 03 55”(03代表“02 10 03”共三个字节,11代表识别多标签命令)。

5.1.2

操作步骤

(1)如果连接设备使用的是USB口转串口线,先安装USB转UART驱动。

(2)打开 RFID

原理机的电源,建立通信连接,将计算机设备与超高频UHF 900MHz读写器模块通过串口线(或USB口转串口线)连接,打开UHF实验软件,进行实验。

实验软件界面如图5-4所示。

如果没有连接上串口,打开串口就会失败。

波特率默认为“57600”,如果选择其他波特率,就可能会打开串口失败。

如果启动实验软件后,在串口栏未显示串口号,请检查串口连接是否正常,再单击“刷新”按钮,对串口进行刷新操作,获取到串口号。

关闭串口后,串口将被关闭,所有操作、指令都将无法正常执行。

(3)打开与关闭串口操作。

在正确建立通信后,打开/关闭串口成功返回如图5-5所示的信息。

图5-4

软件界面

图5-5

打开与关闭串口

(4)识别标签号操作。

在进行识别标签号操作之前,必须将串口打开。在串口打开成功后才能进行识别标签号操作,否则会提示出错。

将卡片放到识别区(如果连接了外接天线,将卡片放置在天线旁边。)单击“寻卡”按钮,执行寻卡操作。寻卡操作过程如图5-6所示。

图5-6

寻卡操作过程

寻卡成功返回如图5-7所示的信息。

图5-7

寻卡操作

(5)识别多标签号操作。

当“防碰撞”复选框被选中时,“识别标签”操作为“防碰撞识别”操作,启动标签识别循环和启动防碰撞功能,对多张标签进行识别时使用该命令。发送命令时需指定防碰撞识别的“初始Q”值。“初始Q”值范围为0~15,使用默认“初始Q”值为3(也可更改为其他适当的值)。该命令的响应方式与单标签循环识别命令一致(射频识别系统中UHF阶段的Q值防碰撞算法,利用参数Q值的变化动态地改变识别帧中的时隙数,以获得更高的识别效率)。

执行寻多卡前需要选中“防碰撞”复选框,寻多卡成功返回如图5-8所示的信息。

如未选中“防碰撞”复选框,将多个标签放入寻卡区进行寻卡操作,将可能导致识别标签失败。识别标签失败返回如图5-9所示的信息。

图5-8

寻多卡成功

图5-9

寻卡失败

(6)自动识别标签操作。

自动执行识别标签操作,就是让读写器不断地进行标签识别,读写器将识别到的标签号返回给上位机程序。在进行自动识别标签时建议选中“防碰撞”复选框,因为在自动识别标签时有可能会有多个标签在读写区,如果未选中时,在寻卡区有多个标签存在,将可能导致寻卡失败。自动寻卡命令如图5-10所示。

图5-10

自动寻卡

单击“自动”按钮后,按钮将变成“停止”按钮,再次单击将停止自动识别标签操作,自动识别标签操作成功返回如图5-11所示的信息。

图5-11

自动寻卡操作

5.1.3

程序设计:识别标签号功能的实现

1.设计内容

在Microsoft Visual Studio 2010开发环境上创建C#窗体应用程序;编写代码,实现识别标签号功能。主要目的是了解Microsoft Visual Studio 2010开发环境及窗体应用程序建立;掌握程序通过串口与RFID实验系统平台建立连接并通信的原理和方法;了解RFID实验平台COM协议并实现识别标签号功能。

本设计所需设备如下。

(1)硬件:PC(Pentium 500以上,硬盘80GB以上,内存大于1GB,Windows操作系统),ISO 18000-6(超高频900MHz)900M模块

,ISO 18000-6卡片,串口线,USB转串口线。

(2)软件:Microsoft Visual Studio 2010。

本设计主要原理:上位机应用程序采用C#语言开发,遵守C#编程规范,识别标签号功能根据RFID超高频模块COM协议实现,使用串口线和USB转串口线将PC与RFID超高频模块连接;上位机程序根据RFID超高频模块COM协议通过串口与RFID超高频模块进行通信,最终完成识别标签号的功能。

2.设计步骤

第一步:创建C#窗体应用程序。

启动Microsoft Visual Studio 2010开发平台,创建一个如图5-12所示的C# Windows窗体应用程序,命名为“UHF ISO18000-6”。

图5-12

新建窗体

第二步:设计功能界面。

(1)选中新建的窗体,右击界面,在弹出的快捷菜单中选择“属性”选项,将Text属性改为“UHF ISO 18000-6”。

(2)打开工具箱,拖出一个GroupBox,将Text属性改为“串口操作”;拖出两个ComboBox放到串口操作的GroupBox中,将其Text属性分别改为“串口号”与“波特率”,并将ComboBox与“串口号”对应的Name属性改为“cmb_UHF_PortName”;将ComboBox与“波特率”对应的Name属性改为“cmb_UHF_BaudRate”,并将Items属性设置为“9600、19200、57600、115200”,如图5-13所示。

图5-13

字符串集合编辑器

拖出三个Button放到GroupBox中,分别将其Text属性设置为“打开”、“关闭”、“刷新”,Name属性分别对应为“btn_UHF_Open”、“btn_UHF_Close”、“btn_UHF_Refresh”。

(3)拖出一个GroupBox,将其Text属性改为“寻卡命令”;拖出一个CheckBox放在寻卡操作的GroupBox中,将Text属性设置为“防碰撞”及Name属性设置为“chk_UHF_Anticoll”;再拖入一个Label,将其Text属性设为“初始Q”;拖入一个ComboBox,将Name属性设置为“cmb_UHF_IntQ”;拖入两个Button,将Text属性分别设置为“寻卡”和“自动寻卡”,Name属性分别设置为“btn_UHF_Inv”和“btn_UHF_Inventory”;最后拖入一个ComboBox,将Name属性设置为“cmb_UHF_UII”及Text属性设置为“请选择一个标签”。

(4)在窗体的右方拖入一个ListBox,将Name属性设置为“lst_UHF_Info”,并在其右下方拖入一个Button,将Text属性设置为“清空”及Name属性设为“btn_UHFlist_Clear”。

最后设计好的界面如图5-14所示。

图5-14

寻卡功能界面设计

第三步:加入动态链接库资源。

找到新建工程的路径,将M900_文件复制到UHF ISO 18000-6UHF ISO 18000-6

binDebug目录下,如图5-15所示。

图5-15

加入动态链接库资源

第四步:编写代码实现功能(此处只附主要代码)。

UHF寻卡功能执行过程如图5-16所示。

图5-16 UHF寻卡功能执行过程

部分代码解析如下:

//寻卡按钮事件

private void btn_UHF_Inv_Click(object sender, EventArgs e)

{

if (!UHF_IsOpen) //判断串口是否已经打开

{

AddUHFList("错误:串口尚未打开,不能操作!");

return; //串口若未打开,则跳出,不再往下执行

}

if ((chk_UHF_d) && (cmb_UHF_edIndex < 0))

{

cmb_UHF_edIndex = 3;//如果选中“防碰撞”复选框,则选择默认“初始Q”为3

}

Byte FlagAnti = (Byte)((chk_UHF_d) ? 0x01 : 0x00);

//如果选中“防碰撞”复选框,就为字节型变量FlagAnti赋值0x01,否则赋值0x00

Byte InitQ=(Byte)((chk_UHF_d)?cmb_UHF_edIndex : 0x00);

//初始Q

Int32 value = M900Inventory(hCom, FlagAnti, InitQ, 0);

//函数功能:该函数启动 M900

的识别循环。

//函数参数:HANDLE hCom:通信端口句柄

//UCHAR flagAnti:是否使用防碰撞识别功能。1:防碰撞识别;0:单标签识别

//UCHAR initQ:防碰撞识别过程的初始 Q

值,flagAnti

为 1

时有效

//UCHAR flagCrc:1:使用CRC功能;0:不使用 CRC

功能

//返回值:1:成功启动 M900

的识别循环

//其他:启动 M900

的识别循环失败

if (value != 1) //判断函数返回是否等于1,如果不等于1就为寻卡命令执行失败

{

AddUHFList(("寻卡命令执行失败!"));

return;

}

AddUHFList(("寻卡命令执行成功!"));

UHF_TagUIIs = new ArrayList(); //新建集合

Byte[] uLenUii = new Byte[1]; //新建一个长度的字节数组,用于保存标签长度

Byte[] uUii = new Byte[255]; //标签 UII

String strUii; //字符串,用于提取标签号

value = M900GetReceived(hCom, uLenUii, uUii); //该函数读取 M900

返回的标签 UII。

//函数原型

//int WINAPI M900GetReceived (HANDLE hCom, UCHAR* uLenUii, UCHAR* uUii);

//返回值value:1:成功读取标签的 UII;其他:读取标签的 UII

失败。

//输入参数

//'HANDLE hCom:通信端口句柄。

//'UCHAR* uLenUii:标签UII的长度,1个字节。

//'UCHAR* uData:标签UII,至少66个字节。

while (value == 1) //当alue值为1时则进入循环,获取标签号并显示

{

strUii = "";

Int32 length = uLenUii[0]; //获取标签UII的长度

for (Int32 i = 0; i < length; i++)

{

strUii += ("{0:X2}", uUii[i]); //取得标签号

}

if (UHF_f((object)strUii) < 0)

{

UHF_(strUii);

AddUHFList(("读取到卡片,卡号为:{0};", strUii)); //显示卡号

value = M900GetReceived(hCom, uLenUii, uUii); //再次获取value值

}

else

{

value = 0;

}

}

cmb_UHF_(); //清空标签号显示下拉框

if (UHF_ > 0)

{

foreach (String struii in UHF_TagUIIs)

{

cmb_UHF_(struii); //在标签显示下拉框显示标签号

}

cmb_UHF_ = "请选择一个卡片";

}

else

{

AddUHFList("接收数据命令执行失败,没有读取到有效的卡片。");

AddUHFList("请将电子标签置于天线辐射场内!");

}

value = M900StopGet(hCom, 0); //停止 M900

的识别循环。

//返回值 1:成功停止识别。其他:停止识别失败。

//输入参数 HANDLE hCom:通信端口句柄。

//UCHAR flagCrc:1:0:是否使用 CRC16

验证功能,使用CRC功能;不使用 CRC

功能。

}

第五步:编译生成程序运行。

单次寻卡操作过程如图5-17所示。

图5-17

单次寻卡

自动寻卡操作过程如图5-18所示。

图5-18

自动寻卡


本文标签: 标签 识别 命令 操作 串口