|
|
/*******************************************************************************
|
|
|
* 文件 User\src\RFID_S50.c
|
|
|
* 作者 苏志江
|
|
|
* 固件库版本 V3.5.0
|
|
|
* 版本 V1.0
|
|
|
* 修改日期 2016年2月18日
|
|
|
* 版权 常熟市奥特软件技术有限公司
|
|
|
******************************************************************************
|
|
|
* 作用:
|
|
|
* 称重仪表处理
|
|
|
*
|
|
|
*
|
|
|
*
|
|
|
*
|
|
|
*
|
|
|
******************************************************************************/
|
|
|
#ifdef RFIDS50_DEV
|
|
|
|
|
|
#include "stm32f10x.h"
|
|
|
#include "RFID_S50.h"
|
|
|
#include <string.h>
|
|
|
#include <stdlib.h>
|
|
|
#include "FiveSuart.h"
|
|
|
#include "CANManager.h"
|
|
|
|
|
|
|
|
|
#define RFID_S50_CMD_Parameter 20 //0x14 串口参数设置
|
|
|
#define RFID_S50_CMD_Control 21 //0x15 控制设备 打开或关闭
|
|
|
#define RFID_S50_CMD_Beep 22 //0x16 蜂鸣
|
|
|
#define RFID_S50_CMD_Password 23 //0x17 下载密码
|
|
|
#define RFID_S50_CMD_FindCard 24 //0x18 自动寻卡
|
|
|
#define RFID_S50_CMD_ReadCard 25 //0x19 读卡
|
|
|
#define RFID_S50_CMD_WriteCard 26 //0x1A 写卡
|
|
|
#define RFID_S50_CMD_Stop 27 //0x1B 中止
|
|
|
#define RFID_S50_CMD_Reset 29 //0x1D 复位
|
|
|
|
|
|
RFID_S50_Parameter RFID_S50_Para;
|
|
|
|
|
|
//验证写卡包内容 modified by Hy 2019-10-20
|
|
|
uint8_t RFID_S50_CheckedData[16]={0};
|
|
|
|
|
|
//验证写卡块号 modified by Hy 2019-10-20
|
|
|
uint8_t RFID_S50_CheckedBlockID=0;
|
|
|
|
|
|
//是否写卡成功 modified by Hy 2019-10-20
|
|
|
bool isWrite=false;
|
|
|
|
|
|
//读卡 modified by Hy 2019-10-20
|
|
|
void ReadCard(uint8_t blockID)
|
|
|
{
|
|
|
uint16_t crcResult=0;
|
|
|
uint8_t crcL=0;
|
|
|
uint8_t crcH=0;
|
|
|
uint8_t m_buf[6]={0};
|
|
|
|
|
|
m_buf[0] = 0x05; //长度
|
|
|
m_buf[1] = 0x01; //地址
|
|
|
m_buf[2] = 0x04; //命令号
|
|
|
m_buf[3] = blockID; //块号
|
|
|
crcResult = CRC16(m_buf, 4);
|
|
|
crcL = (uint8_t)(crcResult & 0xFF);
|
|
|
crcH = (uint8_t)(crcResult >> 8);
|
|
|
m_buf[4] = crcH;
|
|
|
m_buf[5] = crcL;
|
|
|
Usart_SendData(RFID_S50_Para.CommPara.USARTID,m_buf,6);
|
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
|
* Function Name : RFID_S50_OnCommand
|
|
|
* Description : 分析串口数据
|
|
|
* Input : data 类数据
|
|
|
* Output : None
|
|
|
* Return : None
|
|
|
* Attention :
|
|
|
*******************************************************************************/
|
|
|
void RFID_S50_OnCommand(uint8_t * pData ,uint16_t m_len )
|
|
|
{
|
|
|
//已收到全部数据
|
|
|
if (pData[1] == 1)
|
|
|
{
|
|
|
//如果地址等于1
|
|
|
uint16_t crcResult = 0; //校验结果
|
|
|
uint8_t crcL = 0; //校验低位
|
|
|
uint8_t crcH = 0; //校验高位
|
|
|
crcResult = CRC16(pData,m_len - 2);
|
|
|
crcL = (uint8_t)(crcResult & 0xFF);
|
|
|
crcH = (uint8_t)(crcResult >> 8);
|
|
|
|
|
|
//if ((crcL == pData[m_len - 1]) || (crcH == pData[m_len]))
|
|
|
if ((crcH == pData[m_len - 2]) && (crcL == pData[m_len-1]))
|
|
|
{
|
|
|
|
|
|
//通过校验
|
|
|
uint8_t m_Command = pData[2]; //命令号
|
|
|
if (pData[3]==0)
|
|
|
{
|
|
|
//如果返回正常
|
|
|
CanTxMsg TxMsg;
|
|
|
TxMsg.RTR = CAN_RTR_DATA; // 设置为数据帧
|
|
|
TxMsg.IDE = CAN_ID_EXT; // 使用扩展帧
|
|
|
switch (m_Command)
|
|
|
{
|
|
|
case 1: //蜂鸣
|
|
|
{
|
|
|
uint32_t m_id=GetCANID(DeviceID,RFID_S50_CMD_Beep,0x01);
|
|
|
//返回成功信息
|
|
|
CAN_SendResult(m_id,0x00);
|
|
|
}
|
|
|
break;
|
|
|
case 2: //寻卡返回
|
|
|
{
|
|
|
TxMsg.ExtId=GetCANID(DeviceID,RFID_S50_CMD_FindCard,0x01);
|
|
|
TxMsg.DLC=5;
|
|
|
TxMsg.Data[0]=0x00;
|
|
|
TxMsg.Data[1]=pData[4];
|
|
|
TxMsg.Data[2]=pData[5];
|
|
|
TxMsg.Data[3]=pData[6];
|
|
|
TxMsg.Data[4]=pData[7];
|
|
|
CAN_SendData(&TxMsg);
|
|
|
}
|
|
|
break;
|
|
|
case 3: //下载密码
|
|
|
{
|
|
|
uint32_t m_id=GetCANID(DeviceID,RFID_S50_CMD_Password,0x01);
|
|
|
//返回成功信息
|
|
|
CAN_SendResult(m_id,0x00);
|
|
|
}
|
|
|
break;
|
|
|
case 4: //读数据块返回
|
|
|
{
|
|
|
int flag = 0;
|
|
|
int i = 0;
|
|
|
//验证包内容 modified by Hy 2019-10-20
|
|
|
if(isWrite)
|
|
|
{
|
|
|
isWrite=false;
|
|
|
if(RFID_S50_CheckedBlockID==pData[4])
|
|
|
{
|
|
|
for (i = 0; i < 16; i++)
|
|
|
{
|
|
|
if (RFID_S50_CheckedData[i] != pData[i+5])
|
|
|
{
|
|
|
flag = 1;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (flag == 1)
|
|
|
{
|
|
|
uint32_t m_id=GetCANID(DeviceID,RFID_S50_CMD_WriteCard,0x01);
|
|
|
//返回失败信息
|
|
|
CAN_SendResult(m_id,0x01);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
uint32_t m_id=GetCANID(DeviceID,RFID_S50_CMD_WriteCard,0x01);
|
|
|
//返回成功信息
|
|
|
CAN_SendResult(m_id,0x00);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//正确返回1个字节的块号和16个字节数据
|
|
|
TxMsg.ExtId=GetCANID(DeviceID,RFID_S50_CMD_ReadCard,0x01);
|
|
|
TxMsg.DLC=2;
|
|
|
TxMsg.Data[0]=0x00;
|
|
|
TxMsg.Data[1]=pData[4];
|
|
|
CAN_SendData(&TxMsg);
|
|
|
|
|
|
TxMsg.ExtId=GetCANID(DeviceID,RFID_S50_CMD_ReadCard,0x02);
|
|
|
TxMsg.DLC=8;
|
|
|
TxMsg.Data[0]=pData[5];
|
|
|
TxMsg.Data[1]=pData[6];
|
|
|
TxMsg.Data[2]=pData[7];
|
|
|
TxMsg.Data[3]=pData[8];
|
|
|
TxMsg.Data[4]=pData[9];
|
|
|
TxMsg.Data[5]=pData[10];
|
|
|
TxMsg.Data[6]=pData[11];
|
|
|
TxMsg.Data[7]=pData[12];
|
|
|
CAN_SendData(&TxMsg);
|
|
|
|
|
|
TxMsg.ExtId=GetCANID(DeviceID,RFID_S50_CMD_ReadCard,0x03);
|
|
|
TxMsg.DLC=8;
|
|
|
TxMsg.Data[0]=pData[13];
|
|
|
TxMsg.Data[1]=pData[14];
|
|
|
TxMsg.Data[2]=pData[15];
|
|
|
TxMsg.Data[3]=pData[16];
|
|
|
TxMsg.Data[4]=pData[17];
|
|
|
TxMsg.Data[5]=pData[18];
|
|
|
TxMsg.Data[6]=pData[19];
|
|
|
TxMsg.Data[7]=pData[20];
|
|
|
CAN_SendData(&TxMsg);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
case 5: //写卡
|
|
|
{
|
|
|
//写卡成功后读卡 modified by Hy 2019-10-20
|
|
|
isWrite=true;
|
|
|
ReadCard(RFID_S50_CheckedBlockID);
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case 8: //中止IC卡
|
|
|
{
|
|
|
uint32_t m_id=GetCANID(DeviceID,RFID_S50_CMD_Stop,0x01);
|
|
|
//返回成功信息
|
|
|
CAN_SendResult(m_id,0x00);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//如果返回失败
|
|
|
CanTxMsg TxMsg;
|
|
|
TxMsg.RTR = CAN_RTR_DATA; // 设置为数据帧
|
|
|
TxMsg.IDE = CAN_ID_EXT; // 使用扩展帧
|
|
|
switch (m_Command)
|
|
|
{
|
|
|
case 4: //读数据块返回
|
|
|
{
|
|
|
//获取CANID
|
|
|
TxMsg.ExtId=GetCANID(DeviceID,RFID_S50_CMD_ReadCard,0x01);
|
|
|
TxMsg.DLC=3;
|
|
|
TxMsg.Data[0]=0x01;
|
|
|
TxMsg.Data[1]=pData[3];
|
|
|
TxMsg.Data[2]=pData[4];
|
|
|
CAN_SendData(&TxMsg);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}//校验
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//地址不准确,无需返回
|
|
|
RFID_S50_Reset();
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//当收到串口数据
|
|
|
void RFID_S50_OnData(uint8_t * m_buf,int m_len)
|
|
|
{
|
|
|
int m_idx=0;
|
|
|
uint8_t temp;
|
|
|
for (m_idx=0;m_idx<m_len;m_idx++)
|
|
|
{
|
|
|
temp=m_buf[m_idx];
|
|
|
if (RFID_S50_Para.IndexFlag==0)
|
|
|
{
|
|
|
//先读出长度
|
|
|
RFID_S50_Para.Index=0;
|
|
|
RFID_S50_Para.DataLen=temp; //长度
|
|
|
RFID_S50_Para.Data[RFID_S50_Para.Index] =temp;
|
|
|
RFID_S50_Para.Index++;
|
|
|
RFID_S50_Para.IndexFlag=1;
|
|
|
}
|
|
|
else if (RFID_S50_Para.IndexFlag==1)
|
|
|
{
|
|
|
|
|
|
//读取后续数据
|
|
|
RFID_S50_Para.Data[RFID_S50_Para.Index] = temp;
|
|
|
RFID_S50_Para.Index++;
|
|
|
//执行命令
|
|
|
if (RFID_S50_Para.Index == RFID_S50_Para.DataLen+1)
|
|
|
{
|
|
|
//处理返回的结果
|
|
|
RFID_S50_OnCommand(RFID_S50_Para.Data,RFID_S50_Para.DataLen+1);
|
|
|
RFID_S50_Para.IndexFlag=0;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
void RFID_S50_Process()
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
uint8_t RFID_S50_ProcessData[18]={0};
|
|
|
|
|
|
bool RFID_S50_OnCANData(CanBlock * RxMsg)
|
|
|
{
|
|
|
bool bResult=false;
|
|
|
uint32_t iTemp=0;
|
|
|
switch(RxMsg->CommandID)
|
|
|
{
|
|
|
case RFID_S50_CMD_Parameter: //0x14 设置串口参数
|
|
|
{
|
|
|
RFID_S50_Reset();
|
|
|
RFID_S50_Para.Times=1; //设置超时时间
|
|
|
RFID_S50_Para.CommPara.USARTID =RxMsg->Value[0]; //串口号
|
|
|
RFID_S50_Para.CommPara.BaudRate =RxMsg->Value[1]; //波特率
|
|
|
RFID_S50_Para.CommPara.WordLength =RxMsg->Value[2]; //数据位
|
|
|
RFID_S50_Para.CommPara.StopBits =RxMsg->Value[3]; //停止位
|
|
|
RFID_S50_Para.CommPara.Parity =RxMsg->Value[4]; //校验位
|
|
|
RFID_S50_Para.Type =RxMsg->Value[5]; //读卡器种类
|
|
|
iTemp=GetCANID(DeviceID,0x14,0x01);
|
|
|
CAN_SendResult(iTemp,00);
|
|
|
bResult=true;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case RFID_S50_CMD_Control: //0x15 控制设备
|
|
|
{
|
|
|
if (RxMsg->Value[0]==1)
|
|
|
{
|
|
|
//打开设备
|
|
|
//1、打开串口
|
|
|
//2、将当前设备接收函数挂接到串口上
|
|
|
uint32_t tmp_BaudRate=GetBaudRate(RFID_S50_Para.CommPara.BaudRate);
|
|
|
uint16_t tmp_Parity =GetParity(RFID_S50_Para.CommPara.Parity);
|
|
|
|
|
|
Usart_Open(RFID_S50_Para.CommPara.USARTID,tmp_BaudRate,RFID_S50_Para.CommPara.WordLength,RFID_S50_Para.CommPara.StopBits,tmp_Parity);
|
|
|
SetDeviceOnData(RFID_S50_Para.CommPara.USARTID,RFID_S50_OnData);
|
|
|
SetDeviceProcess(RFID_S50_Para.CommPara.USARTID,RFID_S50_Process);
|
|
|
|
|
|
//TIM2_Configuration(Weight_Times*2000); //超时2秒
|
|
|
|
|
|
//TIM_Cmd(TIM2, ENABLE); //打开超时时钟
|
|
|
|
|
|
iTemp=GetCANID(DeviceID,RFID_S50_CMD_Control,0x01);
|
|
|
CAN_SendResult(iTemp,00);
|
|
|
|
|
|
|
|
|
RFID_S50_Para.Open=true;
|
|
|
|
|
|
}
|
|
|
else if (RxMsg->Value[0]==0)
|
|
|
{
|
|
|
//关闭设备
|
|
|
}
|
|
|
bResult=true;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case RFID_S50_CMD_Beep: //蜂鸣
|
|
|
{
|
|
|
uint16_t crcResult=0;
|
|
|
uint8_t crcL=0;
|
|
|
uint8_t crcH=0;
|
|
|
uint8_t m_buf[6]={0};
|
|
|
|
|
|
if (!RFID_S50_Para.Open)
|
|
|
return false;
|
|
|
|
|
|
|
|
|
m_buf[0] = 0x05; //长度
|
|
|
m_buf[1] = 0x01; //地址
|
|
|
m_buf[2] = 0x01; //命令号
|
|
|
m_buf[3] = 0x0F; //蜂鸣时间
|
|
|
crcResult = CRC16(m_buf, 4);
|
|
|
crcL = (uint8_t)(crcResult & 0xFF);
|
|
|
crcH = (uint8_t)(crcResult >> 8);
|
|
|
m_buf[4] = crcH; //0xBC
|
|
|
m_buf[5] = crcL; //0x10
|
|
|
Usart_SendData(RFID_S50_Para.CommPara.USARTID,m_buf,6);
|
|
|
bResult=true;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case RFID_S50_CMD_Password : // 22 下载密码 0x16
|
|
|
{
|
|
|
uint16_t crcResult=0;
|
|
|
uint8_t crcL=0;
|
|
|
uint8_t crcH=0;
|
|
|
uint8_t m_buf[13]={0};
|
|
|
m_buf[0] = 0x0C; //长度
|
|
|
m_buf[1] = 0x01; //地址
|
|
|
m_buf[2] = 0x03; //命令号
|
|
|
memcpy(m_buf+3,RxMsg->Value,8); //CAN 8个字节
|
|
|
|
|
|
crcResult = CRC16(m_buf,11);
|
|
|
crcL = (uint8_t)(crcResult & 0xFF);
|
|
|
crcH = (uint8_t)(crcResult >> 8);
|
|
|
m_buf[11] = crcH;
|
|
|
m_buf[12] = crcL;
|
|
|
Usart_SendData(RFID_S50_Para.CommPara.USARTID,m_buf,13);
|
|
|
bResult=true;
|
|
|
}
|
|
|
break;
|
|
|
case RFID_S50_CMD_FindCard : // 23 自动寻卡 0x18
|
|
|
{
|
|
|
uint16_t crcResult=0;
|
|
|
uint8_t crcL=0;
|
|
|
uint8_t crcH=0;
|
|
|
uint8_t m_buf[5]={0};
|
|
|
|
|
|
if (!RFID_S50_Para.Open)
|
|
|
return false;
|
|
|
|
|
|
m_buf[0] = 0x04; //长度
|
|
|
m_buf[1] = 0x01; //地址
|
|
|
m_buf[2] = 0x02; //命令 寻卡
|
|
|
crcResult = CRC16(m_buf, 3);
|
|
|
|
|
|
crcL = (uint8_t)(crcResult & 0xFF);
|
|
|
crcH = (uint8_t)(crcResult >> 8);
|
|
|
m_buf[3] = crcH;
|
|
|
m_buf[4] = crcL;
|
|
|
Usart_SendData(RFID_S50_Para.CommPara.USARTID,m_buf,5);
|
|
|
bResult=true;
|
|
|
}
|
|
|
break;
|
|
|
case RFID_S50_CMD_ReadCard : // 24 读卡 0x19
|
|
|
{
|
|
|
uint16_t crcResult=0;
|
|
|
uint8_t crcL=0;
|
|
|
uint8_t crcH=0;
|
|
|
uint8_t m_buf[6]={0};
|
|
|
|
|
|
if (!RFID_S50_Para.Open)
|
|
|
return false;
|
|
|
|
|
|
m_buf[0] = 0x05; //长度
|
|
|
m_buf[1] = 0x01; //地址
|
|
|
m_buf[2] = 0x04; //命令号
|
|
|
m_buf[3] = RxMsg->Value[0]; //块号
|
|
|
crcResult = CRC16(m_buf, 4);
|
|
|
crcL = (uint8_t)(crcResult & 0xFF);
|
|
|
crcH = (uint8_t)(crcResult >> 8);
|
|
|
m_buf[4] = crcH;
|
|
|
m_buf[5] = crcL;
|
|
|
Usart_SendData(RFID_S50_Para.CommPara.USARTID,m_buf,6);
|
|
|
bResult=true;
|
|
|
}
|
|
|
break;
|
|
|
case RFID_S50_CMD_WriteCard : // 25 写卡 0x19
|
|
|
{
|
|
|
if (RxMsg->BlockID==1)
|
|
|
{
|
|
|
//第一包
|
|
|
RFID_S50_ProcessData[0]=RxMsg->Value[0];
|
|
|
RFID_S50_CheckedBlockID=RxMsg->Value[0];
|
|
|
}
|
|
|
else if (RxMsg->BlockID==2)
|
|
|
{
|
|
|
//第二包
|
|
|
memcpy(RFID_S50_ProcessData+1,RxMsg->Value,8);
|
|
|
|
|
|
}
|
|
|
else if (RxMsg->BlockID==3)
|
|
|
{
|
|
|
//第三包
|
|
|
uint16_t crcResult=0;
|
|
|
uint8_t crcL=0;
|
|
|
uint8_t crcH=0;
|
|
|
uint8_t m_buf[22]={0};
|
|
|
|
|
|
if (!RFID_S50_Para.Open)
|
|
|
return false;
|
|
|
|
|
|
memcpy(RFID_S50_ProcessData+9,RxMsg->Value,8);
|
|
|
|
|
|
m_buf[0] = 0x15; //长度
|
|
|
m_buf[1] = 0x01; //地址
|
|
|
m_buf[2] = 0x05; //命令号
|
|
|
|
|
|
memcpy(m_buf+3,RFID_S50_ProcessData,17); //CAN 17个字节
|
|
|
crcResult = CRC16(m_buf,20);
|
|
|
crcL = (uint8_t)(crcResult & 0xFF);
|
|
|
crcH = (uint8_t)(crcResult >> 8);
|
|
|
m_buf[20] = crcH;
|
|
|
m_buf[21] = crcL;
|
|
|
Usart_SendData(RFID_S50_Para.CommPara.USARTID,m_buf,22);
|
|
|
//保存写卡时所发包内容 modified by Hy 2019-10-20
|
|
|
memcpy(RFID_S50_CheckedData,RFID_S50_ProcessData+1,16);
|
|
|
}
|
|
|
bResult=true;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case RFID_S50_CMD_Stop: //中止卡
|
|
|
{
|
|
|
uint16_t crcResult=0;
|
|
|
uint8_t crcL=0;
|
|
|
uint8_t crcH=0;
|
|
|
uint8_t m_buf[5]={0};
|
|
|
|
|
|
if (!RFID_S50_Para.Open)
|
|
|
return false;
|
|
|
|
|
|
m_buf[0] = 0x04; //长度
|
|
|
m_buf[1] = 0x01; //地址
|
|
|
m_buf[2] = 0x08; //命令
|
|
|
crcResult = CRC16(m_buf, 3);
|
|
|
|
|
|
crcL = (uint8_t)(crcResult & 0xFF);
|
|
|
crcH = (uint8_t)(crcResult >> 8);
|
|
|
m_buf[3] = crcH;
|
|
|
m_buf[4] = crcL;
|
|
|
Usart_SendData(RFID_S50_Para.CommPara.USARTID,m_buf,5);
|
|
|
bResult=true;
|
|
|
}
|
|
|
break;
|
|
|
case RFID_S50_CMD_Reset:
|
|
|
{
|
|
|
uint32_t m_id=GetCANID(DeviceID,RFID_S50_CMD_Reset,0x01);
|
|
|
//返回成功信息
|
|
|
CAN_SendResult(m_id,0x00);
|
|
|
RFID_S50_Reset();
|
|
|
bResult=true;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
return bResult;
|
|
|
}
|
|
|
|
|
|
// void TIM3_IRQHandler(void)
|
|
|
// {
|
|
|
// if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
|
|
|
// {
|
|
|
// TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
|
|
|
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
//复位
|
|
|
void RFID_S50_Reset()
|
|
|
{
|
|
|
RFID_S50_Para.IndexFlag=0;
|
|
|
}
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|