⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 通过调试的保险柜程序,包含通讯,中断,蜂鸣器,RS232通讯.
💻 C
字号:


/***************************************************************************************************
*
*文件说明:
*
*
***************************************************************************************************/

/***************************************************************************************************
*
*文件名			:uart.c
*版本			:V0.1
*创建日期		:2006.7.5
*创建者			:程超
*
*最后修改日期	:
*修改者			:
*修改原因及内容	:
*
***************************************************************************************************/



#include "includes.h"



/***************************************************************************************************
*
*功能描述		:串口初始化,波特率115200,8位数据位,1个停止位,没有校验位,接收发送使能,使能接收中断
*输入参数		:无
*返回值			:无
*
***************************************************************************************************/
void uartInit(void)
{
	TRISC7=1;
	TRISC6=1;
	SPBRG = 10; 											//设置波特率发生器 
	RCSTA = 0x90;											//使能连继接收,8位数据位,使能串口配置 
	TXSTA = 0x24;											//设置高速波特率计算,异步通信方式,8位数据位,开发送使能  	
	RCIE=1;													//使能接收中断
}


/***************************************************************************************************
*
*功能描述		:使TRISC7,TRISC6作为普通输入输出口,串口不工作
*输入参数		:无
*返回值			:无
*
***************************************************************************************************/
void uartStop(void)
{
	RCSTA=0;												//关串行口使能位
	RCIE=0;
	TRISC7=0;
	TRISC6=0;
	RC7=0;
	RC6=0;
}


/***************************************************************************************************
*
*功能描述		:通过串口发送数据
*输入参数		:dataLeng要发送的字节数
*返回值			:无
*
***************************************************************************************************/
void uartSend(uint8 dataLeng)
{
	uint8 i;

	for(i=0;i<dataLeng;i++)
	{
		while(TXIF==0);										
		TXREG=sendData[i];
	}
}


/***************************************************************************************************
*
*功能描述		:checkSum计算
*输入参数		:dataLeng要计算checkSum的数据的长度
*返回值			:checkSum值
*
***************************************************************************************************/
uint8 checkSum(uint8 dataLeng)
{
	uint8 i;
	uint8 returnValue;

	returnValue=sendData[1];
	for(i=2;i<dataLeng;i++)
	{
		returnValue ^= sendData[i];
	}

	returnValue |=0x20;

	return(returnValue);
}


/***************************************************************************************************
*
*功能描述		:检查指纹模块是否有存储指纹
*输入参数		:无
*返回值			:有存储指纹返回false,没有返有true
*
***************************************************************************************************/
uint8 FPMEmptycheck(void)
{
	uint16 timeCount;										//用作命令应答超时时间记数
	uint8 tryCount;											//用作命令重试记数
	
	tryCount=0;
	sendData[0]=STX;
	sendData[1]=CHAR_U;
	sendData[2]=CHAR_N;
	sendData[3]=CHAR_0;
	sendData[4]=CHAR_0;
	sendData[5]=CHAR_0;
	sendData[6]=CHAR_0;
	sendData[7]=ETX;
	sendData[8]=checkSum(8);
	while(tryCount<3)										//命令失败可重试一次
	{
		receiveAck=false;
		receiveCmd=false;
		sendData[0]=STX;
		uartSend(9);										//送确认已登录全体登录者数量命令
		timeCount=0;
		while((receiveAck==false) && (timeCount<300))		//检查是否收到应答,或应答超时(300mS)	
		{
			delayMs(1);
			timeCount++;
		}
		if(receiveAck==true)
		{
			if(ackType==true)								//当应答类型为ACK时
			{
				timeCount=0;
				while((receiveCmd==false) && (timeCount<300))//检查是否收到一帧应答命令,或命令应答超时(300mS)
				{
					delayMs(1);
					timeCount++;
				}
				if(receiveCmd==true)
				{
					sendData[0]=ACK;
					uartSend(1);							//正确收到命令送应答信号
					receiveCmd=false;
					if((receiveData[1]==CHAR_U) && (receiveData[2]==CHAR_N))//确认命令正确
					{
						if((receiveData[9]==CHAR_0) && (receiveData[10]==CHAR_0))//确认存储的指纹数为0
						{
							return(true);
						}
						else
						{
							return(false);
						}
					}
				}//if(receiveCmd==true)
			}//if(AckType==true)
		}//if(receiveAck==true)
		tryCount++;
	}
	return(false);
}


/***************************************************************************************************
*
*功能描述		:验证用户命令
*输入参数		:无
*返回值			:验证成功返回true,验证失败返回false
*
***************************************************************************************************/
uint8 useCheck(void)
{
	uint16 timeCount;										//用作命令应答超时时间记数
	uint8 tryCount;											//用作命令重试记数
	uint8 receiveCmdNum;									//用于定义收到的命令的数目
	
	tryCount=0;
	receiveCmdNum=0;
	sendData[0]=STX;
	sendData[1]=CHAR_U;
	sendData[2]=CHAR_I;
	sendData[3]=CHAR_0;
	sendData[4]=CHAR_0;
	sendData[5]=CHAR_0;
	sendData[6]=CHAR_1;
	sendData[7]=CHAR_2;
	sendData[8]=ETX;
	sendData[9]=checkSum(9);
	while(tryCount<3)										//命令失败可重试一次
	{
		receiveAck=false;
		receiveCmd=false;
		receiveCmdNum=0;
		sendData[0]=STX;
		uartSend(10);										//送确认登录使用者命令
		timeCount=0;
		while((receiveAck==false) && (timeCount<300))		//检查是否收到应答,或应答超时(300mS)	
		{
			delayMs(1);
			timeCount++;
		}
		if(receiveAck==true)
		{
			if(ackType==true)
			{
				while(receiveCmdNum<4)
				{
					while((receiveCmd==false) && (timeCount<10000))
					{
						delayMs(1);
						timeCount++;
					}
					if(receiveCmd==true)
					{
						receiveCmd=false;
						sendData[0]=ACK;
						uartSend(1);						//正确收到命令送应答信号
						if((receiveData[1] =CHAR_U) && (receiveData[2] =CHAR_I))
						{
							if((receiveData[7]==CHAR_O) && (receiveData[8]==CHAR_K))
							{
								return(true);
							}
							else 
							{
								if((receiveData[7]==CHAR_N) && (receiveData[8]==CHAR_G))
								{
									return(false);
								}
							}
							return(false);
						}
					}
					else
					{
						return(false);
					}
				}
				return(false);
			}	
		}
		tryCount++;
	}
	return(false);
}


/***************************************************************************************************
*
*功能描述		:登录用户命令
*输入参数		:无
*返回值			:成功登录返回true,登录失败返回false
*
***************************************************************************************************/
uint8 useLogin(void)
{
	uint16 timeCount;										//用作命令应答超时时间记数
	uint8 tryCount;											//用作命令重试记数
	uint8 receiveCmdNum;									//用于定义收到的命令的数目
	
	tryCount=0;
	receiveCmdNum=0;
	sendData[0]=STX;
	sendData[1]=CHAR_U;
	sendData[2]=CHAR_E;
	sendData[3]=CHAR_0;
	sendData[4]=CHAR_0;
	sendData[5]=CHAR_0;
	sendData[6]=CHAR_1;
	sendData[7]=CHAR_2;
	sendData[8]=ETX;
	sendData[9]=checkSum(9);
	while(tryCount<3)										//命令失败可重试一次
	{
		receiveAck=false;
		receiveCmd=false;
		receiveCmdNum=0;
		sendData[0]=STX;
		uartSend(10);										//送登录使用者命令
		timeCount=0;
		while((receiveAck==false) && (timeCount<300))		//检查是否收到应答,或应答超时(300mS)	
		{
			delayMs(1);
			timeCount++;
		}
		if(receiveAck==true)
		{
			if(ackType==true)
			{
				while(receiveCmdNum<7)
				{
					while((receiveCmd==false) && (timeCount<10000))
					{
						delayMs(1);
						timeCount++;
					}
					if(receiveCmd==true)
					{
						receiveCmd=false;
						sendData[0]=ACK;
						uartSend(1);						//正确收到命令送应答信号
						if((receiveData[1] =CHAR_U) && (receiveData[2] =CHAR_E))
						{
							if((receiveData[7]==CHAR_O) && (receiveData[8]==CHAR_K))
							{
								return(true);
							}
							else 
							{
								if((receiveData[7]==CHAR_N) && (receiveData[8]==CHAR_G))
								{
									return(false);
								}
							}
						}
					}
					else
					{
						return(false);
					}
				}
				return(false);
			}	
		}
		tryCount++;
	}
	return(false);
}


/***************************************************************************************************
*
*功能描述		:删除所有登录用户命令
*输入参数		:无
*返回值			:成功删除返回true,没有成功删除返回false
*
***************************************************************************************************/
uint8 allUseDel(void)
{
	uint16 timeCount;										//用作命令应答超时时间记数
	uint8 tryCount;											//用作命令重试记数
	
	tryCount=0;
	sendData[0]=STX;
	sendData[1]=CHAR_U;
	sendData[2]=CHAR_D;
	sendData[3]=CHAR_0;
	sendData[4]=CHAR_0;
	sendData[5]=CHAR_0;
	sendData[6]=CHAR_1;
	sendData[7]=CHAR_3;
	sendData[8]=ETX;
	sendData[9]=checkSum(9);
	while(tryCount<3)										//命令失败可重试一次
	{
		receiveAck=false;
		receiveCmd=false;
		sendData[0]=STX;
		uartSend(10);										//送删除全体登录者命令
		timeCount=0;
		while((receiveAck==false) && (timeCount<300))		//检查是否收到应答,或应答超时(300mS)	
		{
			delayMs(1);
			timeCount++;
		}
		if(receiveAck==true)
		{
			if(ackType==true)
			{
				timeCount=0;
				while((receiveCmd==false) && (timeCount<3000))//检查是否收到应答,或应答超时(3000mS)	
				{
					delayMs(1);
					timeCount++;
				}
				if(receiveCmd==true)
				{
					sendData[0]=ACK;
					uartSend(1);							//正确收到命令送应答信号
					receiveCmd=false;
					if((receiveData[1]==CHAR_U) && (receiveData[2]==CHAR_D))
					{
						if((receiveData[7]==CHAR_O) && (receiveData[8]==CHAR_K))
						{
							return(true);
						}
						else
						{
							return(false);
						}
					}
				}
			}//if(ackType==true)
		}//if(receiveAck==true)
		tryCount++;
	}
	return(false);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -