📄 rs232.c
字号:
break;
case CardreaderRawDataHandST_Addr: //地址时
DEBUG_PrintBuf(buf3,12);
DEBUG_PrintByte16(FlashHead.Addr);
DEBUG_PrintChar('\n');
DEBUG_PrintBuf(buf4,14);
DEBUG_PrintByte16(rcv_buf[rcv_buf_head]);//rcv_buf存放的是232接收到的信息
DEBUG_PrintChar('\n');
SetControllerAddr(rcv_buf[rcv_buf_head]); //对FlashHead的Addr参数进行赋值,并将这个结构体中的数据存入FLASH
if(FALSE == Read_Flash_Data(0,0,0,sizeof(FlashHead),(char*)(&FlashHead)))
{
DEBUG_PrintBuf(buf2,19); //输出Set Address error.\n
}
else
{
DEBUG_PrintBuf(buf1,12); //输出New Address:
DEBUG_PrintByte16(FlashHead.Addr);
DEBUG_PrintChar('\n');
}
Rcv_Buf_Head_Plus(1);
CardreaderRawDataHandST = CardreaderRawDataHandST_Idle;
break;
case CardreaderRawDataHandST_DutyInfo: //值班信息,这个信息是要求读出FLASH中存储的所有卡号和信息
printIDPSWDutyInfo(); //打印值班信息
CardreaderRawDataHandST = CardreaderRawDataHandST_Idle;
Rcv_Buf_Head_Plus(1);
break;
case CardreaderRawDataHandST_Time:
Rcv_Buf_Head_Plus(1);
printCurrentDateTime(); //从串口打印当前时间
CardreaderRawDataHandST = CardreaderRawDataHandST_Idle;
break;
case CardreaderRawDataHandST_SetTime: //设置RTC,即设置当前的时间
if(DataNuInbuf > 7)
{
Rcv_Buf_Head_Plus(1);
Year1 = Change_Hex_To_Dec(rcv_buf[rcv_buf_head]);//这里的Year1,Year2,SetDT.Month等都是十进制
Rcv_Buf_Head_Plus(1);
Year2 = Change_Hex_To_Dec(rcv_buf[rcv_buf_head]);
Rcv_Buf_Head_Plus(1);
SetDT.Year = Year1*100 + Year2;
SetDT.Month = Change_Hex_To_Dec(rcv_buf[rcv_buf_head]);
Rcv_Buf_Head_Plus(1);
SetDT.Day = Change_Hex_To_Dec(rcv_buf[rcv_buf_head]);
Rcv_Buf_Head_Plus(1);
SetDT.Hour = Change_Hex_To_Dec(rcv_buf[rcv_buf_head]);
Rcv_Buf_Head_Plus(1);
SetDT.Minit = Change_Hex_To_Dec(rcv_buf[rcv_buf_head]);
Rcv_Buf_Head_Plus(1);
SetDT.Second = Change_Hex_To_Dec(rcv_buf[rcv_buf_head]);
Rcv_Buf_Head_Plus(1);
SetRTC(&SetDT);
CardreaderRawDataHandST = CardreaderRawDataHandST_Idle;
}
break;
case CardreaderRawDataHandST_SetShiftTime: //设置交班时间
if(DataNuInbuf > 2)
{
Rcv_Buf_Head_Plus(1);
ShiftTime1 = Change_Hex_To_Dec(rcv_buf[rcv_buf_head]);
UART0_SendByte16(ShiftTime1);
DEBUG_PrintChar('\n');
Rcv_Buf_Head_Plus(1);
ShiftTime2 = Change_Hex_To_Dec(rcv_buf[rcv_buf_head]);
UART0_SendByte16(ShiftTime2);
DEBUG_PrintChar('\n');
Rcv_Buf_Head_Plus(1);
FlashHead.DutyShiftTime = ShiftTime1*100 + ShiftTime2;
CardreaderRawDataHandST = CardreaderRawDataHandST_Idle;
}
break;
case CardreaderRawDataHandST_VoiceType:
if(DataNuInbuf > 2)
{
Rcv_Buf_Head_Plus(1);
VoiceCtrl(rcv_buf[rcv_buf_head]);
// UART0_PutChar(rcv_buf[rcv_buf_head]);
Rcv_Buf_Head_Plus(1);
}
case CardreaderRawDataHandST_SetGroupNo:
if(DataNuInbuf > 1)
{
Rcv_Buf_Head_Plus(1);
SetGruopNo(rcv_buf[rcv_buf_head]);
Rcv_Buf_Head_Plus(1);
}
default:
break;
}
}
*/
/********************************************************************************************************
*
* 函数名称:
*
* 功能描述:刷卡器操作提示
*
* 入口参数:
* 出口参数:
*
********************************************************************************************************/
/*
#define HINTTYPE_Select_operation 1
#define HINTTYPE_PSW 2
#define HINTTYPE_WrongPSW 3
#define HINTTYPE_InvalidCard 4
#define HINTTYPE_NotOnDuty 5
void HintCardReadorOperation(uint8 HintType)
{
#ifdef use_debugPrint
uint8 buf1[] = "Please select operation!\n";
uint8 buf2[] = "Please enter password.\n";
uint8 buf3[] = "Wrong password.\n";
uint8 buf4[] = "You are not on duty!\n";
uint8 buf5[] = "Invalid card\n";
#endif
switch(HintType)
{
case HINTTYPE_Select_operation:
DEBUG_PrintBuf(buf1,25);
break;
case HINTTYPE_PSW:
DEBUG_PrintBuf(buf2,23);
break;
case HINTTYPE_WrongPSW:
DEBUG_PrintBuf(buf3,16);
break;
case HINTTYPE_InvalidCard:
DEBUG_PrintBuf(buf5,13);
break;
case HINTTYPE_NotOnDuty:
DEBUG_PrintBuf(buf4,21);
break;
default:
break;
}
}
*/
/********************************************************************************************************
*
* 函数名称:Data_Handle
*
* 功能描述:对RS232接收的刷卡器的信息进行处理
*
* 入口参数:RS232_state RS232数据处理的状态字
* 出口参数:
*
********************************************************************************************************/
/*
char MenaceCode[3] = {'1','1','0'};
char CardReaderPSW[10];
uint8 ReceivedPSWLength; //用来存储接收到的密码
uint8 CardNoReceived[CARDNO_LENGTH]; //用来存储接收到的卡号
IDPSW IDPsw;
uint8 IDPswCheckResult;
extern uint8 CurrentOpraterID[4];
void CardNoKeyValueHandle(void)
{
#ifdef use_debugPrint
uint8 buf1[] = "Open door.\n";
uint8 buf2[] = "Close door.\n";
uint8 buf3[] = "MenaceAlarm.\n";
uint8 buf4[] = "check-passed.\n";
uint8 buf5[] = "Anti-threaten-failed\n";
#endif
uint8 iLoop;
if( CardReadorData.InputType == INPUTDATATYPE_INVALID)
return;
switch(CardReaderDataHandleSt) //CardReaderDataHandleSt已经在UART0的初始化中作了定义
{
case CardReaderSt_Idle://空闲状态
if(CardReadorData.InputType == INPUTDATATYPE_CARDNO)
{//收到卡号,将卡号存储,并切换状态
for(iLoop = 0;iLoop<CARDNO_LENGTH;iLoop++)
{
CardNoReceived[iLoop] = CardReadorData.CardNo_KeyValue[iLoop];
}
CardReaderDataHandleSt = CardReaderSt_CardIN;
HintCardReadorOperation(HINTTYPE_Select_operation);
VoiceCtrl(SelectOperation);
}
else
{
if(CardReadorData.CardNo_KeyValue[0] == '#')
{
printIDPSWDutyInfo();//从串口打印所有信息
}
if(CardReadorData.CardNo_KeyValue[0] == '*')
{
CloseAlarm();//打开报警器
}
}
break;
case CardReaderSt_CardIN://已读到卡号
if(CardReadorData.InputType == INPUTDATATYPE_CARDNO)
{//重新收到卡号,更新存储的卡号
for(iLoop = 0;iLoop<CARDNO_LENGTH;iLoop++)
{
CardNoReceived[iLoop] = CardReadorData.CardNo_KeyValue[iLoop];
}
CardReaderDataHandleSt = CardReaderSt_CardIN;
HintCardReadorOperation(HINTTYPE_Select_operation);//串口打印出提示语,提示用户选择操作
VoiceCtrl(SelectOperation);
}
else
{//收到按键
if(CardReadorData.CardNo_KeyValue[0] == 'O') //用户选择了开门命令
{
CardReaderDataHandleSt = CardReaderSt_OpenKey;
ReceivedPSWLength = 0;
HintCardReadorOperation(HINTTYPE_PSW); //提示用户输入密码
VoiceCtrl(EnterPassword);
}
else if(CardReadorData.CardNo_KeyValue[0] == 'C') //如果用户选择了关门
{
if(CHECKIDPSW_IDINFLASH == CheckID(CardNoReceived))//判断FLASH中有没有此卡号
{
memcpy((char*)CurrentOpraterID,(char*)CardNoReceived,CARDNO_LENGTH);
RS485_Door_Operate_Choose(RS485_Operate_Choose_Close);//进行Door_Command = CLOSE_OPERATE的赋值操作
DEBUG_PrintBuf(buf2,12); //打印"关门"
}
CardReaderDataHandleSt = CardReaderSt_Idle;
break;
}
else
{
CardReaderDataHandleSt = CardReaderSt_Idle;
}
}
break;
case CardReaderSt_OpenKey://开门键已按,等待密码
if(CardReadorData.InputType == INPUTDATATYPE_CARDNO)
{//重新收到卡号,更新存储的卡号
for(iLoop = 0;iLoop<CARDNO_LENGTH;iLoop++)
{
CardNoReceived[iLoop] = CardReadorData.CardNo_KeyValue[iLoop];
}
CardReaderDataHandleSt = CardReaderSt_CardIN;
}
else
{
if(CardReadorData.CardNo_KeyValue[0] == 'E')
{//收到输入键
if(ReceivedPSWLength < 6)
{//密码长度不够
HintCardReadorOperation(HINTTYPE_WrongPSW);//提示密码不对.退出
VoiceCtrl(WrongPassword);
CardReaderDataHandleSt = CardReaderSt_Idle;
break;
}
else if(ReceivedPSWLength == 6)
{//密码长度正确
;//校验卡号和密码
}
else if(ReceivedPSWLength < 9)
{//密码长度不正确
HintCardReadorOperation(HINTTYPE_WrongPSW);//提示密码不对,退出
VoiceCtrl(WrongPassword);
CardReaderDataHandleSt = CardReaderSt_Idle;
break;
}
else if(ReceivedPSWLength == 9)
{//密码长度正确
if(FALSE == memcompare(MenaceCode,CardReaderPSW+6,3))//只要看最后输入的字符是不是MenaceCode,CardReaderPSW里放着接收到的密码
{//防胁迫码不正确
DEBUG_PrintBuf(buf5,21);
HintCardReadorOperation(HINTTYPE_WrongPSW);//提示密码错误
VoiceCtrl(WrongPassword);
CardReaderDataHandleSt = CardReaderSt_Idle;
break;
}
}
//校验卡号和密码
memcpy((char*)(IDPsw.ID),(char*)CardNoReceived,CARDNO_LENGTH);//拷贝卡号到IDPsw.ID中
memcpy(IDPsw.Psw,CardReaderPSW,PSW_LENGTH);//拷贝密码到IDPsw.Psw中
IDPswCheckResult = CheckIDPswOnDuty(IDPsw);//校验卡号和密码,去值班信息中去校验
///////////////////////////////////////////////
//IDPswCheckResult = CHECKIDPSW_PASS;
//memcpy((char*)CurrentOpraterID,(char*)CardNoReceived,CARDNO_LENGTH);
//RS485_Door_Operate_Choose(RS485_Operate_Choose_Open); //驱动电机正转
///////////////////////////////////////
switch (IDPswCheckResult)
{
case CHECKIDPSW_PASS://通过验证
memcpy((char*)CurrentOpraterID,(char*)CardNoReceived,CARDNO_LENGTH);
RS485_Door_Operate_Choose(RS485_Operate_Choose_Open); //驱动电机正转.Door_Command = OPEN_OPERATE;
DEBUG_PrintBuf(buf1,11);
DEBUG_PrintBuf(buf4,14);
if(ReceivedPSWLength == 9)
{
DEBUG_PrintBuf(buf3,13);
AddLog(EVENT_MenaceAlarm,(uint32)CurrentOpraterID);
}
break;
case CHECKIDPSW_NO_EXIST://卡号不存在
HintCardReadorOperation(HINTTYPE_InvalidCard);
VoiceCtrl(InvalidCard);
break;
case CHECKIDPSW_WRONG_PSW://密码错误
HintCardReadorOperation(HINTTYPE_WrongPSW);
VoiceCtrl(WrongPassword);
break;
case CHECKIDPSW_NOT_ON_DUTY://不在值班时间内
HintCardReadorOperation(HINTTYPE_NotOnDuty);
VoiceCtrl(NotOnDuty);
break;
case CHECKIDPSW_IDINFLASH://
default:
break;
}
CardReaderDataHandleSt = CardReaderSt_Idle;
break;
}
else if(CardReadorData.CardNo_KeyValue[0] == 'C')
{//收到清除键
ReceivedPSWLength = 0;
}
else if((CardReadorData.CardNo_KeyValue[0] < '0')||(CardReadorData.CardNo_KeyValue[0] > '9'))
{//收到其他非密码键值
CardReaderDataHandleSt = CardReaderSt_Idle;
break;
}
else
{
if(ReceivedPSWLength == 9)//如果收到的密码数超过9个,以后收到的无效
break;
CardReaderPSW[ReceivedPSWLength++] = CardReadorData.CardNo_KeyValue[0];//收到一个储存一个
}
}
break;
case CardReaderSt_CloseKey://关门键已按
if(CardReadorData.InputType == INPUTDATATYPE_CARDNO)
{//收到卡号
for(iLoop = 0;iLoop<CARDNO_LENGTH;iLoop++)
{
CardNoReceived[iLoop] = CardReadorData.CardNo_KeyValue[iLoop];
}
CardReaderDataHandleSt = CardReaderSt_CardIN;
}
break;
}
CardReadorData.InputType = INPUTDATATYPE_INVALID;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -