134.2KHZ低频动物耳标面板式读卡器|读写器HX-L8160是一款远距离ISO11784/11785电子标签阅读器,该阅读器可对134.2KHZ的电子标签使用读取距离大于40cm,广泛应用于动物养殖,食品追溯,生产自动化管理,仓库管理,水电管理,身份识别,资产管理,医疗管理,物流追踪,物业管理,停车场管理等。
一、串口配置(8位数据位):(出厂默认配置,用户可以用上位机软件自行修改)
波特率 |
19200 |
校验 |
1位偶校验 |
停止位 |
1位 |
注:建议用电压稳定的、1A的线性电源;
二、系统可配置内容:(16进制通信)
主机发送命令 |
配置内容 |
读卡器返回 |
备注 |
02 06 00 00 00 02 08 38 |
天线开,主从模式 |
02 06 00 00 00 02 08 38 |
|
02 06 00 00 00 00 89 f9 |
天线关,主从模式 |
02 06 00 00 00 00 89 f9 |
|
02 06 00 00 00 03 c9 f8 |
天线开,从机主动发送 |
02 06 00 00 00 03 c9 f8 |
通常应用在一主一从的通信中 |
02 06 00 00 00 01 48 39 |
天线关,从机主动发送 |
02 06 00 00 00 01 48 39 |
|
解析:操作寄存器地址:0x0000 ;配置内容:高字节0x00,低字节如下表:
|
数据 |
位地址 |
描述 |
主从模式 |
0x01 |
0 |
1:从机主动发送;0:主从模式 |
天线开关 |
0x02 |
1 |
1:开;0:关 |
主机发送命令 |
配置内容 |
读卡器返回 |
备注 |
02 06 00 00 02 ff c8 d9 |
将模块地址修改为02;范围1-250 |
02 06 00 00 02 ff c8 d9 |
将设备地址修改为02 |
主机发送命令 |
配置内容 |
读卡器返回 |
备注 |
02 03 00 01 00 04 15 fa |
读取读卡器的地址和相关版本信息 |
02 03 08 02 22 b1 aa 22 1b 00 00 60 ce |
地址为02,版本信息为 b1 aa 22 1b 00 00 |
02 03 00 40 00 02 c5 ec |
读取产品UID |
02 03 04 ff ff ff ff c8 a7 |
产品UID为 ff ff ff ff |
02 03 00 00 00 01 84 39 |
回读0x00地址信息 |
02 03 02 00 06 7c 46 |
天线开,主从模式,蜂鸣器开,说明请参照表1-1 |
02 03 00 05 00 11 95 f4 |
回读0x05-0x0D地址信息 |
02 03 22 02 56 59 5a 5b 5b 5a 58 55 50 4c 48 45 41 3e 3b 39 35 34 32 30 2f 2e 2c 2b 29 29 28 27 26 26 25 24 03 f2 08 |
系统调谐状态信息,用于查看模块工作状态,平常不用读取 |
HDX数据(0x16开始) |
||||||
|
超时时间(1B) |
信号强度(1B) |
国家代号(2B) |
卡号数据(5B) |
备注 |
|
寄存器地址 |
22(0x16)高字节 |
22(0x16)低字节 |
23(0x17) |
0x18-0x1a(高B) |
0x1a(低B) |
|
|
0-255(*20mS) |
RSSI |
低10位有效 |
卡号数据 |
无意义 |
|
FDX数据(0x1b开始) |
||||||
|
超时时间(1B) |
信号强度(1B) |
国家代号(2B) |
卡号数据(5B) |
备注 |
|
寄存器地址 |
27(0x1b)高字节 |
28(0x1b)低字节 |
29(0x1c) |
0x1d-0x1f(高B) |
0x1f(低B) |
|
|
0-255(*20mS) |
RSSI |
低10位有效 |
卡号数据 |
无意义 |
|
4.1,读取所有标签数据(16进制通信)
主机发送命令 |
配置内容 |
读卡器返回 |
备注 |
02 03 00 16 00 0a 24 3a |
回读0x16-0x20地址信息,长度为0x0a |
02 03 14 ff 57 83 e7 00 6b 96 1d 5d 00 ff 10 43 e6 1c be 99 1a 15 df 5d 31 |
读取到卡号等卡片信息 |
发送命令分析(02 03 00 16 00 0a 24 3a)
02: 从机地址;
03: 读取功能(MODBUS-RTU);
00 16:读取寄存器地址;
00 0a:读取数据长度(10个字20Bytes);
24 3a:前面所有数据(02 03 00 16 00 0a)的CRC检验值,低字节先发。
接收信息分析:02 03 14 ff 57 83 e7 00 6b 96 1d 5d 00 ff 10 43 e6 1c be 99 1a 15 df 5d 31
从机设备地址:0x02;
功能码:0x03;
数据长度:0x14(十进制20)个字节;
HDX超时时间:0xff,此数据是255*0.02=5.12S,证明是5秒前更新的,如果卡一直在里面的话这个数据一般小于5(0.1s更新的);
HDX当前信号强度:0x57;
HDX标签国家代号:0x83 e7:高4位无意义,所以为0x03e7 = 999
HDX标签卡号:0x00 6b 96 1d 5d:转为10进制 1805000029
无意义数据:0x00:MODBUS传输需要字传输,这个是随意补的;
FDX超时时间:0xff,此数据是255*0.02=5.12S,证明是5秒前更新的,如果卡一直在里面的话这个数据一般小于5(0.1s更新的);
FDX当前信号强度:0x10;
FDX标签国家代号:0x43 e6:高4位无意义,所以为0x03 e6 = 998
FDX标签卡号:0x1c be 99 1a 15:转为10进制 123456789013
无意义数据:0x df:MODBUS传输需要字传输,这个是随意补的;
CRC校验:5d 31
4.2,只读取HDX卡号
主机发送命令 |
配置内容 |
读卡器返回 |
备注 |
02 03 00 16 00 05 64 3e |
回读0x16-0x1b地址信息,长度为0x05 |
02 03 0a ff 57 83 e7 00 6b 96 1d 5d 00 b1 19 |
长度为0a,时间为ff,强度为57 国家号为:03e7,卡号为00 6b 96 1d 5d |
发送命令分析(02 03 00 16 00 05 64 3e)
02: 从机地址;
03: 读取功能(MODBUS-RTU);
00 16:读取寄存器地址;
00 05:读取数据长度(5个字10Bytes);
64 3e:前面所有数据(02 03 00 16 00 05)的CRC检验值,低字节先发。
接收信息分析:02 03 0a ff 57 83 e7 00 6b 96 1d 5d 00 b1 19
从机设备地址:0x02;
功能码:0x03;
数据长度:0x0a(十进制10)个字节;
HDX超时时间:0xff,此数据是255*0.02=5.12S,证明是5秒前更新的,如果卡一直在里面的话这个数据一般小于5(0.1s更新的);
HDX当前信号强度:0x57;
HDX标签国家代号:0x83 e7:高4位无意义,所以为0x03e7 = 999
HDX标签卡号:0x00 6b 96 1d 5d:转为10进制 1805000029
无意义数据:0x00:MODBUS传输需要字传输,这个是随意补的;
CRC校验:b1 19
4.3,读取FDX卡号
主机发送命令 |
配置内容 |
读卡器返回 |
备注 |
02 03 00 1b 00 05 f5 fd |
回读0x1b-0x20地址信息,长度为0x05 |
02 03 0a ff 10 43 e6 1c be 99 1a 15 df 70 b9 |
长度为0a,时间为ff,强度为10国家号为:03e6,卡号为1c be 99 1a 15 |
发送命令分析(02 03 00 1b 00 05 f5 fd)
02: 从机地址;
03: 读取功能(MODBUS-RTU);
00 1b:读取寄存器地址;
00 05:读取数据长度(5个字10Bytes);
f5 fd:前面所有数据(02 03 00 1b 00 05)的CRC检验值,低字节先发。
接收信息分析:02 03 0a ff 10 43 e6 1c be 99 1a 15 df 70 b9
从机设备地址:0x02;
功能码:0x03;
数据长度:0x0a(十进制10)个字节;
FDX超时时间:0xff,此数据是255*0.02=5.12S,证明是5秒前更新的,如果卡一直在里面的话这个数据一般小于5(0.1s更新的);
FDX当前信号强度:0x10;
FDX标签国家代号:0x43 e6:高4位无意义,所以为0x03 e6 = 998
FDX标签卡号:0x1c be 99 1a 15:转为10进制 123456789013
无意义数据:0x df:MODBUS传输需要字传输,这个是随意补的;
CRC校验:70 b9
CRC校验函数:
unsigned int CRC16_MB(unsigned char *cBuffer, unsigned int iBufLen)
{
unsigned int i, j;
unsigned int wPolynom = 0xa001;
unsigned int wCrc = 0xffff;
for (i = 0; i < iBufLen; i++)
{
wCrc ^= cBuffer[i];
for (j = 0; j < 8; j++)
{
if (wCrc &0x0001)
{
wCrc = (wCrc >> 1) ^ wPolynom;
}
else
{
wCrc = wCrc >> 1;
}
}
}
return wCrc;
}