1.读卡器介绍
(1)前言
首先畅科读卡器在出厂的时候内置了一些功能,比如我购买的是带有蜂鸣器的RS485协议的读卡器,我放卡上去会听到“滴”的一声,并且芯片上的LED灯会常亮,于此同时读卡器会发送一帧数据返回若干信息。卡片离开时LED灯会灭,并且会发送一帧数据显示已离开读卡器。我们可以配置相关功能比如检测到卡片时是否会“滴”的一声,检测到卡片时要不要主动返回数据给上位机,以及卡片离开时是否发送数据提示卡片已离开,还能设置波特率。顺便说一下通讯指令用到的都是十六进制位,数据类型用的是unsigned char。如果用多个读卡器的话,多个读卡器接到RS485转TTL芯片,STM32用一个串口跟这芯片相连,那么我们怎么区分哪个读卡器读到卡呢?这就要用到读卡器的地址了,我们还要修改读卡器的地址,比如出厂的读卡器模块地址都是0x00,我们要把多余的读卡器地址设置为0x01、0x02等等,反正不与0x00相同就行。
(2)数值帧指令分析
我们来看读卡器的功能配置指令(如图3),以上我说的相关功能都可以在这里配置。
图3 功能配置指令
由上图可知,一帧数据指令是由以上若干格式组成的。我们要更改相关功能只需要修改对应的值即可,以下贴出读卡器使用说明中各个位指令的作用(如图5)。
图4 各个位的作用
这里要注意的是校验和,上面可能说得不太清楚,根据我的理解是先把BCC校验(异或校验)算出来,然后把得出来的二进制位全部取反,取反后得到的就是校验和。写个例子,比如根据上面的功能配置指令,我写出来了一帧配置指令:
20 00 2C 04 00 00 96 00 校验和 03
配置指令的意思是开启主动输出卡号,主动输出卡片离开数据,9600的波特率,开启蜂鸣器提醒。我现在开始要算校验和,根据指示我得出来00 2C 04 00 00 96 00。
然后计算BBC校验码,如图5。
图5 BBC校验码计算
得出二进制位是1011 1110,按位取反获得0100 0001。
转换为十六进制为:41
所以我们的校验和是41,填入后完整的数据指令是:
20 00 2C 04 00 00 96 00 41 03
需要注意的是,数据指令的第二个位是读卡器的地址,你要改哪个读卡器的话就用地址定位你要改的读卡器。
2.准备步骤
(1)修改读卡器地址
如果你打算只使用一个读卡器完成测试的话,那就可以跳过这一步,否则的话请按照此步骤将读卡器的地址设置为不同的值。两个以上读卡器的话要修改读卡器地址,因为指令发送是发送给单个读卡器的,你需要读卡器的唯一地址才能确定这指令发给谁,否则后面发送指令时一样的地址会导致冲突。其中一个读卡器默认地址就为0x00就行了(如果你不想要0x00的话改成其他也行),其他的改成其他值(0xFF以内)。首先我们先把要改地址的读卡器接好线,电源线接3.3V,A、B线接到RS485转TTL芯片的A、B线,然后RS485转TTL芯片的串口线接到我们的USB转串口芯片上,j接好后插电脑。打开串口调试助手,按如图3所示配置:
图6 串口调试助手的相关配置
接下来我们查看修改模块地址指令(如图7)。
图7 修改模块地址指令
我们可以看到,我们要修改的有两个值,一个是原地址,一个是新地址,分别位于第2和第5个字节。由于读卡器出厂都是默认地址为0x00,原地址就填0x00。新地址的话填你想要的值,我填的是0x01,发送成功后会接受到反馈指令,如图8。
图8 修改读卡器地址
(2)测试读卡器功能
如果我们用默认功能配置的话,是开启主动输出卡号,主动输出卡片离开数据,9600的波特率,开启蜂鸣器提醒。所以我们先测试的时候是把卡片放到天线上去,可以听到蜂鸣器响一声,并且串口调试助手接受到数据(如图9)。卡片拿走后返回卡片离开数据(如图10)。(这里我使用的是地址为0x01的读卡器,所以数据帧第二个字节是01)
图9 检测到卡片时返回的数据
图10 卡片已离开
我们不仅要它读到卡号返回数据,还要随时能够确定读卡器天线上有没有卡片,接下来测试读卡指令,先看读卡指令的通讯格式(如图11)。
图11 寻卡指令格