/******************************************************************************* * 文件 User\src\RFID_S50.c * 作者 苏志江 * 固件库版本 V3.5.0 * 版本 V1.0 * 修改日期 2016年2月18日 * 版权 常熟市奥特软件技术有限公司 ****************************************************************************** * 作用: * 称重仪表处理 * * * * * ******************************************************************************/ #ifdef RFIDS50_DEV #include "stm32f10x.h" #include "RFID_S50.h" #include #include #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_idxCommandID) { 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