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

📄 uart_new.c

📁 KEIL C上的门禁控制器源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		case STATE_MSG_NUM:
			if(maxtrans)
				temp=SPIbuf[i];
			else
				temp=recv_buf[i];
		 	if(temp<'0'||temp>'9')
				errordect=TRUE;
			checksum+=temp;
			i++;
			nextstate=STATE_STX;
			break;
		case STATE_STX:
			if(maxtrans)
				temp=SPIbuf[i];
			else
				temp=recv_buf[i];
			if(temp==STX)
			{
				checksum+=STX;
				nextstate=STATE_MSG_STRING;
			}
			else
				errordect=TRUE;
			i++;
			break;
		case STATE_MSG_STRING:
			strindex=0;
			while(TRUE)
			{
				if(maxtrans)
					temp=SPIbuf[i];
				else
					temp=recv_buf[i];

				if(temp==ETX)
				{
					checksum+=ETX;
					break;
				}
				checksum+=temp;
				i++;
				strindex++;
				if(strindex>MAX_COMMAND_LENGTH)
				{
					errordect=TRUE;
					break;
				}
			}

			i++;
			nextstate=STATE_CHECKSUM;
			break;
		case STATE_CHECKSUM:
			if(maxtrans)
				temp=SPIbuf[i];
			else
				temp=recv_buf[i];

			testchecksum=Asc_hex(temp);
			i++;
			if(maxtrans)
				temp=SPIbuf[i];
			else
				temp=recv_buf[i];

			testchecksum=testchecksum<<4;
			testchecksum+=Asc_hex(temp);
			temp=(testchecksum+checksum)&0xFF;
			if(temp!=0)
				errordect=TRUE;

			i++;
			nextstate=STATE_EOT;
			break;
		case STATE_EOT:
			if(maxtrans)
				temp=SPIbuf[i];
			else
				temp=recv_buf[i];

			if(temp!=EOT)
				errordect=TRUE;
			else
				endofmessage=TRUE;
			break;
		}

		if(errordect||wrongaddr)
   			break;
		if(endofmessage)
			break;
	}

 	if(wrongaddr)
  	{
		recv_ctr=0;
  		return FALSE;		// 地址错误直接返回,不进行任何操作
  	}

  	if(errordect)
  	{
		recv_ctr=0;
		sendmessage(NAK);
  		return FALSE;		// 接收错误   	        
  	}
  	
	if(endofmessage)
  	{	
		recv_ctr=0;
		sendmessage(ACK);
  	    return TRUE;		// 接收正确
  	}
}

///////////////////////////////////////////////////////////////////////////////
// 上位机命令处理过程
///////////////////////////////////////////////////////////////////////////////
void host_proc()
{
	idata uint  i;
	idata uchar temp;

	if(checkmessage())
	{
		if(readbuf()==TRUE)				// 处理具体的上位机命令
		{
			if(maxtrans)				// 大数据量传输模式
			{
				if((SPIbuf[COMMAND_PTR]=='S')&&(SPIbuf[COMMAND_PTR+1]=='C')
					&&(SPIbuf[COMMAND_PTR+2]=='S')&&(SPIbuf[COMMAND_PTR+3]=='S'))
				{
					SPIbuf[0]=SOH;
					SPIbuf[1]=haddr;	// 源地址
					SPIbuf[2]=laddr;
					SPIbuf[3]='0';		// 目标地址
					SPIbuf[4]='0';
					SPIbuf[5]='0';		// 信息号
					SPIbuf[6]=ACK;		// ACK
					SPIbuf[7]=EOT;		// 结束
			
					Dir=1;				// 485发送
					COMENABLE;			// 允许串口中断
					trans_ctr=0;
					trans_size=8;
					SBUF=SPIbuf[0];		// 发送

					while(trans_size){}	// 直到数据传输完毕

					maxtrans=FALSE;		// 切换为小数据量传输模式
				}
				else if((SPIbuf[COMMAND_PTR]=='S')&&(SPIbuf[COMMAND_PTR+1]=='C')
					&&(SPIbuf[COMMAND_PTR+2]=='S')&&(SPIbuf[COMMAND_PTR+3]=='L'))
				{
					SPIbuf[0]=SOH;
					SPIbuf[1]=haddr;	// 源地址
					SPIbuf[2]=laddr;
					SPIbuf[3]='0';		// 目标地址
					SPIbuf[4]='0';
					SPIbuf[5]='0';		// 信息号
					SPIbuf[6]=ACK;		// ACK
					SPIbuf[7]=EOT;		// 结束
			
					Dir=1;				// 485发送
					COMENABLE;			// 允许串口中断
					trans_ctr=0;
					trans_size=8;
					SBUF=SPIbuf[0];		// 发送

					while(trans_size){}	// 直到数据传输完毕

					maxtrans=TRUE;		// 切换为大数据量传输模式
				}
				else
				{
					SPIbuf[1]='0';		// 修改地址向DSP发送
					SPIbuf[2]='1';
					SPIbuf[3]='0';
					SPIbuf[4]='2';

					// 重新计算校验和
					i=0;
					checksum=0;
					while(SPIbuf[i]!=ETX)
					{
						checksum+=SPIbuf[i];
						i++;
					}
					checksum+=SPIbuf[i];	// ETX

					checksum=~checksum+1;
		
					temp=(checksum&0xF0)>>4;
					i++;
					SPIbuf[i]=Hex_ascii(temp);
		
					temp=checksum&0x0F;
					i++;
					SPIbuf[i]=Hex_ascii(temp);

					if(Send_spi())			// 直接向DSP发送
					{
						if(SPIbuf[7]=='D'&&SPIbuf[8]=='U'&&SPIbuf[9]=='T'&&SPIbuf[10]=='S')
						{
							white_bill_reg();	// 注册白名单
						}

						SPIbuf[1]=haddr;	// 修改地址向上位机发送
						SPIbuf[2]=laddr;
						SPIbuf[3]='0';
						SPIbuf[4]='0';
	
						// 重新计算校验和
						i=0;
						checksum=0;
						while(SPIbuf[i]!=ETX)
						{
							checksum+=SPIbuf[i];
							i++;
						}
						checksum+=SPIbuf[i];	// ETX
	
						checksum=~checksum+1;
			
						temp=(checksum&0xF0)>>4;
						i++;
						SPIbuf[i]=Hex_ascii(temp);
			
						temp=checksum&0x0F;
						i++;
						SPIbuf[i]=Hex_ascii(temp);
						i++;

						COMENABLE;			// 允许串口中断

						Dir=1;				// 485发送
						trans_ctr=0;		// 发送指针
						trans_size=i+1;		// 发送数据大小
						SBUF=SPIbuf[0];		// 发送数据
					}
					else
					{
						while(trans_size){}	// 直到数据传输完毕
						sendmessage(NAK);
					}
				}
			}
			else		// 小数据量命令模式
			{
				if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='M')&&(recv_buf[COMMAND_PTR+2]=='T'))
				{
					for(i=0;i<15;i++)
					{
						cur_time[i]=recv_buf[COMMAND_PTR+3+i];
						set_time();		// 设置系统时间
					}
				}
				else if((recv_buf[COMMAND_PTR]=='G')&&(recv_buf[COMMAND_PTR+1]=='R')&&(recv_buf[COMMAND_PTR+2]=='R'))
				{
					while(trans_size){}	// 直到数据传输完毕

					sendmessage(0);
				}
				else if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='C')
						&&(recv_buf[COMMAND_PTR+2]=='S')&&(recv_buf[COMMAND_PTR+3]=='S'))
				{
					while(trans_size){}	// 直到数据传输完毕

					maxtrans=FALSE;		// 切换为小数据量传输
				}
				else if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='C')
						&&(recv_buf[COMMAND_PTR+2]=='S')&&(recv_buf[COMMAND_PTR+3]=='L'))
				{
					while(trans_size){}	// 直到数据传输完毕

					maxtrans=TRUE;		// 切换为大数据量传输
				}
				else
				{
					while(trans_size){}	// 直到数据传输完毕
					sendmessage(NAK);	// 命令不支持
				}
			}
		}
	}
}

				
///////////////////////////////////////////////////////////////////////////////
// 设置波特率
///////////////////////////////////////////////////////////////////////////////
void Baud_Init()
{
	switch(baudrate)
	{
	case 0:
		TR2=0;			// 关闭T2定时器
	    TH2 = 0xff ;                  
	    TL2 = 0x70;		// 波特率设为4800bps
	    RCAP2H=0xff;
	    RCAP2L=0x70;
	    TR2 = 1;		// 允许T2中断
		break;
	case 1:
		TR2=0;			// 关闭T2定时器
	    TH2 = 0xff ;                  
	    TL2 = 0xb8;		// 波特率设为9600bps
	    RCAP2H=0xff;
	    RCAP2L=0xb8;
	    TR2 = 1;		// 允许T2中断
		break;
	case 2:
		TR2=0;			// 关闭T2定时器
	    TH2 = 0xff ;                  
	    TL2 = 0xdc;		// 波特率设为19200bps
	    RCAP2H=0xff;
	    RCAP2L=0xdc;
	    TR2 = 1;		// 允许T2中断
		break;
	case 3:
		TR2=0;			// 关闭T2定时器
	    TH2 = 0xff ;                  
	    TL2 = 0xee;		// 波特率设为38400bps
	    RCAP2H=0xff;
	    RCAP2L=0xee;
	    TR2 = 1;		// 允许T2中断
		break;
	case 4:
		TR2=0;			// 关闭T2定时器
	    TH2 = 0xff ;                  
	    TL2 = 0xf4;		// 波特率设为57600bps
	    RCAP2H=0xff;
	    RCAP2L=0xf4;
	    TR2 = 1;		// 允许T2中断
		break;
	case 5:
		TR2=0;			// 关闭T2定时器
	    TH2 = 0xff ;                  
	    TL2 = 0xfa;		// 波特率设为115200bps
	    RCAP2H=0xff;
	    RCAP2L=0xfa;
	    TR2 = 1;		// 允许T2中断
		break;
	default:
		break;
	}
}
			

⌨️ 快捷键说明

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