张春 发表于 2025-1-23 09:16:38

【CPH系列】RFID标签读取模块,开发阐明文档(包罗重要内容和BUG)

总览

1.基本概念&&模块参数简介
2.基本命令格式阐明
3.查询命令
4.设置命令
一、基本概念简介

1.读写器 属性简介

1.射频功率(RF-Power)
读写器在工作时射频功率的巨细,在其他变量控制不变的前提下,RF-Power 越大,读取间隔 越远。
2.盘货(Inventory)
盘货其实就是指读取操纵,只不过是不间断的读取操纵。
3.读(read)
读取标签中的数据内容。
实测最远读卡间隔:810mm,0.81米(无遮挡,正向)
型号:CPH-305
最大功率设定:官方给出 15-30 dbm,但是实测使用上位机只能 0-20 dbm,>=20则向下取到20。
https://i-blog.csdnimg.cn/direct/6a9fbb3388e64fb6b3ac0115c0485444.png
4.写(write)
向标签中写入数据。
2.RFID标签 属性简介

1.锁定
锁定指的是,假如标签被锁定之后,就没有办法再改变标签存储的数据,除非进行解锁操纵。
2.灭活
标签被灭活之后,不会再对读写器的任何命令做出任何回应,数据无法被读取。
3.标签内存阐明
https://i-blog.csdnimg.cn/direct/a0c243b6d61f423d824ebc71fe03f324.png
4.读卡间隔变近的缘故起因
· 标签与人体皮肤接触
· 标签与金属接触
· 标签在高湿度情况中
· 标签与读卡器之间有高密度物体遮挡
3.通信 属性简介

1.RS232 / RS485
尽管 RS232 是全双工模式,但是它仍旧比 485 要慢。
https://i-blog.csdnimg.cn/direct/6212992a09fe4322badf612807eb992c.png
二、上位机参数设置

1.工作参数页面

https://i-blog.csdnimg.cn/direct/5d42cdd984e94af1b720ae81f35ad5e1.png
工作模式:

分为主动模式、被动模式、触发模式。
https://i-blog.csdnimg.cn/direct/822bb181478b40a3b99e21ee1dc9d27c.png
标签过滤时间:

白话说,就是,假如设置为 60,那么:
假如如今扫描到了 A 标签,那么 60秒 内,不会再重复对 A标签 进行扫描。
但是并不影响扫描 B、C 标签等等…
读卡间隔时间:

给处理器处理数据留出时间。
一样平常设置为 3(30ms)即可。
触发延伸时间:

假如设置读取的模式为 “触发模式”,那么:
假如设置为 5,那么在发送读取命令后的 5秒 内,模块都会持续进行射频扫描。
直到读取到标签,大概 5秒 已颠末去但没有读取到。才会制止。
读卡区域:

标签上一样平常有这几个区域:
EPC、TID、USER。
https://i-blog.csdnimg.cn/direct/577dff1ca32b4328a15a6b3662fd9340.png
1.工作参数:



2.传输参数:

3.射频参数:

https://i-blog.csdnimg.cn/direct/bfd186116ed24eed8a9c7dcb06318d36.png
https://i-blog.csdnimg.cn/direct/c074d6e3db464458bf5374ed6a500f60.png
https://i-blog.csdnimg.cn/direct/1ccc73e8bdf84fdfbbb923f565bdbaf8.png
https://i-blog.csdnimg.cn/direct/466b9b32b2fd4327a1df693f347f1781.png
关于 RSSI 阈值的阐明:

RSSI,代表了信号强度,在第一个页面中,我们看到的信息栏目中,就有 RSSI 参数,代表当前标签的信号强度。
https://i-blog.csdnimg.cn/direct/ebfe4f069a1740d9a9ce8e5e4343aa91.png
https://i-blog.csdnimg.cn/direct/256e202f757d4cde84ca1332dea160b8.png
关于 Session 的阐明:
https://i-blog.csdnimg.cn/direct/563c836ca4f24c75a85358090a520dd2.png
https://i-blog.csdnimg.cn/direct/e2617990ebe240de874a1ac8988f7ab0.png
二、基本命令格式阐明

1.帧 && 此RFID读写器模块的帧

帧,是上位机和 RFID读写器 传输数据的最小单元。
所有的交互都以帧为一个单位(最小单位)
https://i-blog.csdnimg.cn/direct/e5c479bd83a9423bbb1bf74b50607f0c.png
在此 RFID读写器模块 中,帧的各项属性界说是这样的:
Header:数据帧的起始标志
由字符’R’和字符’F’组成。(R 和 F 的 ASCII 分别为:0x52、0x46)
Frame type:帧的类型(1 byte)
区分、指明这个数据帧是命令,响应大概是关照类型的数据帧。
· 命令帧:value == 0
上位机 发送给 RFID读写器模块的命令。
· 响应帧:value == 1
RFID读写器模块 实行完 上位机 的命令后,告知上位机实行结果而返回的报文。
· 关照帧:value == 2
RFID读写器模块 在没有吸收到 上位机 命令的情况下,主动发送给主机的数据。例如RFID读写器主动读卡模式下读到数据后自动上传给主机。
Address:RFID的装备地点(2 byte)
由2个字节组成,MSB在帧的前面,LSB在帧的后面。
作为装备的一种标识,命令帧中只有地点和RFID读写器装备内的地点同等时装备才会响应。
否则地点不同等的情况下RFID读写器不会实行主机的命令 。
Frame Code:帧的辨认码(1 byte)
指明发送的是什么命令;
或指明此条帧是对什么命令的回复。
Param Length:帧的参数长度(2 byte)(N bytes的中的 N)
由 2 个字节组成,
MSB(1 byte)在帧的前面,
LSB(1 byte)在帧的后面。
Parameters:数据帧的参数(N byte)
参数的数据类型均以 TLV 的格式来表现。
TLV:标签(Tag),长度(Length),值(Value)
除了底子的 TLV,其余的 TLV 均可嵌套。
TLV 的嵌套非常灵活,请看下面例子:
https://i-blog.csdnimg.cn/direct/43fe1d3b40224c1c8b85b429d2caccf9.png
Checksum:帧的校验码
包管数据帧的完整性。
数据在传输过程中大概会因为干扰、信号衰减等缘故起因导致部门字节被修改,
Checksum 可以用来检测这种错误。
checksum 的盘算方式如下:
RFID_UINT8 caculate_checksum(RFID_UINT8 *buff_ptr,RFID_UINT8 len)
{
    RFID_UINT8 index = 0;
    RFID_UINT8 check_sum = 0;
    for (index = 0; index < len ; index++)
    {
      check_sum += buff_ptr;
    }
    check_sum = ~check_sum + 1;
    return check_sum;
}
为了方便各人,写了一个 python 脚本,用于方便盘算 checksum,只需要输入内容,自动盘算出 checksum
通过网盘分享的文件:checksum_calcu.python
链接: https://pan.baidu.com/s/1Wcg19Y9fqG7o-zCkZZn2mg?pwd=7uvu
提取码: 7uvu
使用方法:放在你想要放在的目录下,然后使用 python 运行它。
比如,cd 进入目录后,运行命令:
python checksum_calcu.python
固然,前提是,你已经在电脑中安装了 python 程序。
运行结果图:
https://i-blog.csdnimg.cn/direct/44f43a7dcd9949e3b500d6254f88aa52.png
2.关于16进制

为什么写成 0x52、0x46 而不是 52、46 呢?
因为需要区别,“ 0x ”只是一个前缀,
它代表了“这个数是一个 16进制 而非其他(比如说 10进制)

三、查询命令 && 设置命令

1.查询命令 - 装备软件版本等信息(0x40)

查询命令:
52 46 00 00 00 40 00 00 28
https://i-blog.csdnimg.cn/direct/205f475449c8433cad3f82203b37b123.png
1.1 写 帧 的 Header:‘R’、‘F’ == 52 46
1.2 因为,这个 帧 是 上位机 发送给 RFID读写器模块 的内容,所以:Frame Type == 00(0x00)
1.3 然后是 Address,默认的 MSB 和 LSB 都是 1 byte 的 0x00,所以 Address == 00 00
1.4 Frame Code,帧的辨认码。0x40 代表了:“我们要查询装备的版本号” 这个命令。
1.5 Param Lenght(MSB LSB):MSB 是数据的高字节(靠左),LSB 是数据的低字节(靠右)。
Param Lenght 一共包罗 2 byte,举例:0x000B(转换成10进制,则 == 11)
MSB == 00、LSB == 0B
所以说,Param Lenght = 00 0B 的意思是,后面的 TLV Param 的总长度(包罗嵌套)= 11
当我们实际去看的时候,也确实发现 TLV Param 的 Length == 11:
07 01 00
20 03
02 02 08 21 01
06
https://i-blog.csdnimg.cn/direct/11c250ec0112410b862d3ce34b720339.png
在上面的图中,返回的数据帧,我们解析:
发送帧:52 46 00 00 00 40 00 00 28

返回帧:52 46 01 00 00 40 00 0B 07 01 00
20 03 02 02 08 21 01 06 BD
起首拆解 返回帧:
Header:52 46
Frame type:01(代表返回帧特性)
Address(MSB LSB):00 00(默认地点)
Frame Code:40(代表这个帧要 → 查询版本号)
Param Length:00 0B
2.设置命令 - 开始盘存标签(0x21)

开始盘存标签的串口命令:
52 46 00 00 00 21 00 00 47
开始盘存,此中有效信息 TLV == 07 01 00

https://i-blog.csdnimg.cn/direct/633f0e80c74a4c1788199621cc3f32b4.png
https://i-blog.csdnimg.cn/direct/e4f56db76a0a4324bc5780f7c08cc73b.png
3.设置命令 - 主动盘存标签模式(0x22)

命令:
52 46 00 00 00 22 00 00 46
发送命令后,设置 RFID读取器模块 的 读取逻辑 为 “主动读取”,
且立即进行 1次 主动读取 操纵。(仅读取 1 次)
(若命令发出瞬间,没有读取到信息,那么则读取失败不返回任何值)
https://i-blog.csdnimg.cn/direct/3625322f4b7747e58d5caaed1bd0308a.png
https://i-blog.csdnimg.cn/direct/f1d066ccf4804233858892e43ea69982.png
3.1 发送给 RFID读取器模块,若 没有读取到任何 RFID 标签 返回值如图:
https://i-blog.csdnimg.cn/direct/1536e18c1845472f977b58c431809bf4.png
我们查看一下返回值,和返回值 的 相应格式进行一下对比:
52 46 01 00 00 22 00 03 07 01 50 EA
Header:52 46
Frame type:01(0x01)
Address:00 00(default)
Frame Code:22(0x22,因为响应的操纵 “主动盘存标签” 的代码是0x22)
Param Length:00 03(长度 = 3,包罗 07 01 50)
TLV:07 01 50(Tag:07,Length:01,StateCode:50。这个 TLV 的 StateCode 是 0x50,代表 “读取失败”)
https://i-blog.csdnimg.cn/direct/9f7bdbe3846648a09885bfbe764c9727.png
3.2 发送给 RFID读取器模块,若 读取到了 RFID 标签 返回值如图:
TLV(部门TLV,此TLV貌似嵌套了):07 01 00
(Tag:07,Length:01,StateCode:00。这个 TLV 的 StateCode 是 0x00,代表 “读取乐成”)
https://i-blog.csdnimg.cn/direct/72f4b218877245d5a5332dd9a711bd1c.png
每次盘货,倒数第二位都会变(除了 checksum 的倒数第一位),这就导致了,checksum 和这个数一起改变,这导致末了 2位 一直在改变。缘故起因…
4.设置命令 - 制止盘存标签 模式(0x23)

命令:
52 46 00 00 00 23 00 00 45
https://i-blog.csdnimg.cn/direct/27aaa7c2e24649baa44eb9a60359cb46.png
可以看到,HOST ← Reader 的值中,后面的 TLV 部门的值:
07 01 00
此中,07 大概是 “盘存类型的命令(或操纵)” 的意思,01 是 TLV value 的长度,00 是 TLV 的 value。
关于 value 的值:
0x00 → SUCCESS
0x50 → FALSE
所以 07 01 00
的意思就是:“盘存类型的命令” → 命令已经乐成实行
操纵将会中断正在进行盘货的操纵,让装备处于 STOP 制止模式:
https://i-blog.csdnimg.cn/direct/e4982b0700f2400ab086159227743c1d.png
5.设置命令 - 设置单个参数值(0x48)

请留意,这个命令比较特殊。
设置单个参数的值,实际上 “单个参数” 只有 4 个可选参数。
https://i-blog.csdnimg.cn/direct/c828e392d3fc4f1592406daa9bebc958.png
这四个可选参数,可以恣意选择任何一个,以 改变它们的详细值。
它们分别为:
☆ 0x01:1 byte,设置功率
最大值为 10进制 的 30(16进制 == 0x1E)
比如说,我们可以设置功率为25,25的16进制是:0x19,:
☆ 0x02:1 byte,设置蜂鸣器
boolean值:0x00 为 OFF,0x01 为 ON
☆ 0x03:1 byte,设置标签过滤时间
也就是,我们扫描一次标签之后的冷却时间,在多少秒之后才能再次扫描。取值范围 0-255(10 进制),16进制为 0x00 ~ 0xFF。参考表示图如下:
https://i-blog.csdnimg.cn/direct/fb83dc374ebe4e24b63c4a18d815cdb0.png
0x04:4 byte,参数结构如下:
https://i-blog.csdnimg.cn/direct/76565a7c80514d91b1542e57720b1caa.png
https://i-blog.csdnimg.cn/direct/4d16ec62f52f4a00b410f9061922d59f.png

6.(!!重要!!)设置命令 - 设置功率官方文档让人误解的点

6.(!!重要!!)设置命令 - 设置功率官方文档让人误解的点

6.(!!重要!!)设置命令 - 设置功率官方文档让人误解的点


官方文档中写了这样一段设置功率的命令,令人费解:
https://i-blog.csdnimg.cn/direct/86e512ed25ce4c48be94b6fec5016732.png
你可以看到,明显在 26 后面跟着的是 03 01 09 C4,作为修改功率的 TLV 存在,
但是,下面的讲授却解释了 02 01 1E 作为修改功率的 TLV?!
这完全是两个格式的 TLV,它们的参数数目都不同。
然而,诡异的是,这两个 TLV 所构成的帧,都能够正常修改功率(???)
完全超出了我的预料,颠末近 2小时的实行,我得出了缘故起因,真正的修改功率的帧的内容应该是这样的:
52 46 00 00 00 48 00 05 26 02[也可以是03,无所谓] 01 08[功率值的16进制,允许0x00~0x1E] C3[可以是任意值,C3只是一个占位字节,但不能省略] 27[前置字节串的checksum]

比如:52 46 00 00 00 48 00 05 26 03 01 1E D3 00
是设置功率为30dbm,D3仅是一个占位符,你如果将它改为D4,也能设置功率。
这两段命令是完全相等效的。只是你在改成D4后,需要重置CHECKSUM:
52 46 00 00 00 48 00 05 26 03 01 1E D4 FF
在官方文档 4.4 中:
https://i-blog.csdnimg.cn/direct/04daa7620dd64a47b0bd48d906df272b.png
我们能够看到这样一段话:
“例如设置功率: 52 46 00 00 00 48 00 05 26 02 01 1E checksum 1E转换十进制的值为30,则该命令就是将功率设置为30dbm”
盘算出checksum(==0xD4),得出的命令帧为:
52 46 00 00 00 48 00 05 26 02 01 1E D4
这个命令帧照理说应该是见效的,因为这是文档中给出的示例。
然而实际的结果是,它无法修改功率。这是文档中的一个错误。(我不知道各人看到的时候文档是否已经被修正)
所以,只需要按照我上面说的那个命令才能够修改功率:
52 46 00 00 00 48 00 05 26 02[也可以是03,无所谓] 01 08[功率值的16进制,允许0x00~0x1E] C3[可以是任意值,C3只是一个占位字节,但不能省略] 27[前置字节串的checksum]

比如:52 46 00 00 00 48 00 05 26 03 01 1E D3 00
是设置功率为30dbm,D3仅是一个占位符,你如果将它改为D4,也能设置功率。
这两段命令是完全相等效的。只是你在改成D4后,需要重置CHECKSUM:
52 46 00 00 00 48 00 05 26 03 01 1E D4 FF
查看被修改的功率的命令:
52 46 00 00 00 49 00 03 26 01 01 F4

7.查询命令 - 查询当前设定的功率值(单参数查询)(0x49)

命令:
52 46 00 00 00 49 00 03 26 01 01 F4

内容解析:
49:查询单个参数值的 Frame Code。
00 03:后续 TLV 的长度。
26:查询单个参数的 TLV 中的第一个参数“命令类型”,只要是单参数查询都是 26。
01:此 TLV 中的 value 的长度。
01:value 的值,0x01,代表查询功率。
F4:checksum。
8.查询命令 - 查询当前蜂鸣器状态(单参数查询)(0x49)

命令:
52 46 00 00 00 49 00 03 26 01 02 F3
内容解析:
49:查询单个参数值的 Frame Code。
00 03:后续 TLV 的长度。
26:查询单个参数的 TLV 中的第一个参数“命令类型”,只要是单参数查询都是 26。
01:此 TLV 中的 value 的长度。
02:value 的值,0x02,代表查询 蜂鸣器状态(0x00关闭,0x01开启)。
F3:checksum。
9.查询命令 - 查询当前标签过滤时间(单参数查询)(0x49)

命令:
52 46 00 00 00 49 00 03 26 01 03 F2
内容解析:
49:查询单个参数值的 Frame Code。
00 03:后续 TLV 的长度。
26:查询单个参数的 TLV 中的第一个参数“命令类型”,只要是单参数查询都是 26。
01:此 TLV 中的 value 的长度。
03:value 的值,0x03,代表查询 代表查询 标签过滤时间(同一标签的扫描冷却时间,16进制 0x00-0xFF,也就是10进制的1-255)
F2:checksum。
10.查询命令 - 查询当前Mixer Gain、IF AMP Gain、Threshold(单参数查询)(0x49)(改命令存疑,暂时无效)

命令:
52 46 00 00 00 49 00 03 26 01 04 F1(不成功,需要继续咨询客服)
内容解析:
49:查询单个参数值的 Frame Code。
00 03:后续 TLV 的长度。
26:查询单个参数的 TLV 中的第一个参数“命令类型”,只要是单参数查询都是 26。
01:此 TLV 中的 value 的长度。
04:value 的值,0x04,代表查询 代表查询 :
Mixer Gain(混频增益):默认为9
IF AMP Gain(中频放大增益):默认为36
Threshold(信号门槛):值越高读卡间隔越近,因为阈值升高了,读取自然费力 —— 需要更大的信号才能触发读取。默认值为0x00A0。
F1:checksum。
关于 Mixer Gain、IF AMP Gain、Threshold:
我们可以想象,Mixer Gain、IF AMP Gain 分别是 2个 大喇叭,它们用来将高频微弱的射频信号放大,然后再发射出去,通报到 RFID 标签那边。
https://i-blog.csdnimg.cn/direct/db9be916a83b4693b29961f349cb5c20.png
更多内容在我的博客中,搜索 “CPH” 获取。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【CPH系列】RFID标签读取模块,开发阐明文档(包罗重要内容和BUG)