📄 uart.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 + -