You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

533 lines
15 KiB
C

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

/*******************************************************************************
* 文件 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