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

📄 uart._c

📁 mega128平台下
💻 _C
字号:
//UART0接口


unsigned char put_done=0;
unsigned char recv_done=0;
unsigned char recvBuff[128]; 
unsigned char newMSG=0;
unsigned char i;
unsigned char *serial_recv_MSG;
unsigned char change_flag=0;
unsigned char serial_recv_flag=0;

#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr(void)
{
  recv_done=1;
  serial_get();
  }


#pragma interrupt_handler uart0_tx_isr:21
void uart0_tx_isr(void)
{
  put_done=1; 
}


//**********Put a single byte to the serial port. 
void put(unsigned char data) 
{
      while(!put_done)
      ;
      UDR0=data;
      put_done=0;
 }


//***********Receive a single byte from the serial port. 
unsigned char get() 
{
     unsigned char data;
     while(!recv_done)
      ;
     data=UDR0;
     recv_done=0;
     return data;
}

  
//**********Put a serial Frame to the serial port. 
void serial_put(unsigned char *serial_MSG) 
{
  unsigned char m;
  unsigned char length;
  unsigned char data;
  put(0x7E);
  serial_MSG++;
  length=*serial_MSG;
  
  for(m=0;m<length;m++)
  {
    data=*serial_MSG;
    if(data==0x7E)
    {
      put(0x7D);
      put(0x5E);	
    }
    else if(data==0x7D)
    {
      put(0x7D);
      put(0x5D);	
    }
    else
      {
      	put(data);
      	}
   }
   put(0x7E);
}

//**********Receive a serial Frame from the serial port.
unsigned char *serial_get()
{
        unsigned char data;
	data=get();
    
        if(data==0x7E&&newMSG==0)  //symbol for new msg
        {
      		i=0;
			newMSG=1;
        	recvBuff[i]=data;
         	serial_recv_MSG=&recvBuff[i];
        	i++;
        }
    	else if(data==0x7E&&newMSG==1)
      	{
      		newMSG=0;
      		recvBuff[i]=data;
      		i=0;
      		serial_recv_flag=1;   //一条消息发送完毕,在处理完本条消息后需要被置零
        }
    	else
      	{
      		if(data==0x7D)
      		{
      	  		change_flag=1;
      	  	}
      		else if(change_flag==1)
      		{
      	 		switch(data)
      	  		{
      	     		case 0x5E: recvBuff[i]=0x7E;
      	                	   change_flag=0;
      	                	   i++;
      	                	   break;
      	     		case 0x5D: recvBuff[i]=0x7D;
      	                	   change_flag=0;
      	                 	   i++;
      	                	   break;
      	     		default:   break;
      			}
      		}
      		else
      	 	{
      	 		recvBuff[i]=data;
      	 		i++;
      		}
      	}
 	return serial_recv_MSG;
}

⌨️ 快捷键说明

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