UCchip UHF RFID产品资料

RFID系列选型手册:
UCCHIP UHF RFID Reader选型手册_v2.5.pdf (1.2 MB)
Win上位机Demo:
【旧版Reader_v1.76_8(固件2.2及以下版本适用)】
【新版Reader_v1.0.2(固件2.3及以上版本适用)】
安卓Demo:
ucchip-rfid-sdk-v2.0.5.1.zip (6.2 MB)
串口协议:
UCChip UHF READER串口协议v1.1.2(固件2.2及以下适用).pdf (1.0 MB)
UCChip UHF READER串口协议v1.1.5(固件2.3及以上适用).pdf (1.2 MB)

Tip:使用开发过程种遇到问题可随时在该帖下方留言讨论

协议内,rssi,计算,里面的data[0]没看懂,哪来的,怎么找不到哪条指令可以返回rssi值呢

实时盘存的回复里面带的有RSSI 没有专门的指令去返回RSSI

rssi,到底怎么算的,c代码看不明白,能不能解释一下,公式是什么,和那四个字节的关系。

RSSI= B * log10(X) + C + D

那四个字节的值就是X 然后第一个字节的头3bit是mode

1 个赞

通过mode去确认B C的值

D值如何得到?文档内的公式是要用X除EPCLEN,RSSI怎么会和EPC长度有关系啊,要除吗?

D值默认是0 是一个偏移值 ,原始数据是需要除以epc长度然后再去计算的

在固件2.1的版本中,优化了射频参数保存逻辑,模块将不会默认自动保存射频参数设置,需要到版本信息中手动保存射频参数配置信息,操作流程如下:

上位机读写标签epc可以参考如下说明

关于UHF RFID标签四个区块:
标签可存储一定量的信息,RFID读写器模块通过标准命令来读取标签中的数据,可读写长度数据,由标签本身决定,具体可询问标签供应商,所有的读写操作都是以十六进制形式进行的,数据长度必须以字(word)为单位(2byte,即4位,如0001)*

18000-6C协议标签分为Reserved (保留),EPC (电子产品代码),TID (标签识别号)和User (用户) 四个独立的存储区块 (Bank)
● RESERVER区: 8byte(4字)大小,前4byte(2字)为摧毁密码 (用于摧毁标签,,一般用不到),后4bvte(2字)为访问密码 (用于进行写数据和锁走操作),默认值为: 0000 0000(摧毁密码)0000 0000 (访问密码).
TID区: 12bye(6字大小,"只可读,不可写”出厂已经写入,为标签的唯一标识符,电子标签的产品类识别号,每人生产厂商的TD号都会不同
EPC区: 为识别标签对象的电子产品码,EPC与TID相比,区别在于EPC可以用户手动写入修改。EPC区的数据结构是,第一个word是校验位,第二个word是长度控制,之后的才是数据存储位置,盘存的时候,是根据长度控制位所表示的长度来显示EPC的。实际写入EPC数据的时候,起始地址填1,即从长度控制位开始写入数据,校验位会自动计算不用手动写入。长度控制位计算: EPC数据长度2=将转换为十六进制表示,然后在转换后的结果后面加00,最终得到的就是长度控制位的数据。如:0001, i = 4 * 2 = 8 —> 08 —>0800,长度控制位为0800,程序中计算:

byte[ ] newEPCByte = Tools.HexString2Bytes(newEPC);
byte[ ] pcByte = new byte[] { 0x00, 0x00 };
pcByte[0] = (byte) (newEPCByte.length * 4);
String pc = Tools.Bytes2HexString(pcByte, 2));

长度根据实际需要写入的数据长度填,比如:0001,长度为1word,4位(需要注意的是,数据位长度必须为4的倍数),加上长度控制位0800,软件中长度填写2; 例: 0001 起始地址:1,长度:2,数据:08000001
● USER区: 该存贮器的长度由各个电子标签的生产厂商确定,USER区可以写入用户自定义的数据(以16进制形式)

601NC蜂鸣器控制原理图参考

RSSI C语言计算方法更新:

const uint8_t para_B[5][8] = {
{43,43,45,49,43,43,45,49},/UCM 601/
{43,43,45,49,43,43,45,49},/UCM 601C/
{43,43,45,49,43,43,45,49},/UCM 601B/
{53,53,48,43,49,45,43,43}, /UCM602/
{47,47,47,47,46,43,43,43} /UCM608/

};

const int para_C[5][8] = {
{43,43,45,49,43,43,45,49},/UCM 601/
{43,43,45,49,43,43,45,49},/UCM 601C/
{43,43,45,49,43,43,45,49},/UCM 601B/
{-283,-283,-283,-283,-283,-283,-283,-283}, /UCM602/
{-303,-283,-253,-238,-304,-313,-280,-266} /UCM608/
};

int general_func_file::Calculate_Rssi(char data[],uint8_t len){

uint8_t rssi_mode = 0;
uint8_t hardware_mode = 0;
int B=0,C=0,D=0;
int RssiVal = 0;
uint8_t epc_len = 0;
float A = 1.0f;
float rssi_temp = 0.0f;
union{
uint32_t u32;
uint8_t chr[4];
}UNION;

epc_len = (len-3);
if(epc_len == 0){
epc_len = 1;
// //LOG(INFO) << “EPC len = 0 rssi error”;
}

rssi_mode = (data[0]&0xE0) >> 5;
hardware_mode = (data[0]&0x1E) >> 1;
UNION.chr[3] = data[0] & 0x01;
UNION.chr[2] = data[1];
UNION.chr[1] = data[2];
UNION.chr[0] = data[3];

B = para_B[hardware_mode][rssi_mode];
C = para_C[hardware_mode][rssi_mode];

rssi_temp = (UNION.u32/epc_len)*A;

RssiVal = (B * log10(rssi_temp)) + C + D;
if(RssiVal > 0 || RssiVal == 0){
// //LOG(INFO) << "rssi > 0 , original value is “<<int(UNION.u32)<<” mode is “<<int(rssi_mode)<<” hard mode is "<<int(hardware_mode);
RssiVal = -30;
}
else if(RssiVal < -90 || RssiVal == -90){
// //LOG(INFO) << "rssi > 0 , original value is “<<int(UNION.u32)<<” mode is “<<int(rssi_mode)<<” hard mode is "<<int(hardware_mode);
RssiVal = -90;
}

return RssiVal;
}

Q:通过单机连接模组时,有时候会出现,有上电复位失败的问题,导致模组不能正常工作,串口命令无响应
A:模组上电时,需要保持外部引脚没有外灌电流,不然会导致上电复位异常。对于外部有单外机连接uart引脚的情况。有几种操作方式。
(1)通过修改外部单处机的引脚状态来规避。在对模组进行上电时,把与模组串口相连的单个机引脚设置为输出状态,并输出低电平。
(2)通过模组复位引脚进行复位,把模组的RESET脚拉低可以对模组进行硬复位。
(3)通过增加保护电路来防止电流倒灌,在模组串口的RX和TX上都加上二级管,起到阻断作用。一种参考接法如下图所示:
lQLPJxM72lEUc_rNAd3NAmmwzQ0Of5gIfxsENOFCskB1AA_617_477
参考二:左边是UART_TX,右边是UART_RX,VDDA和VDDB分别是各自芯片的供电电源
dbe808a09645aa30ef642e94c0c43b79