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

📄 uart.c

📁 南格(AVR)操作系统 for keil
💻 C
字号:
/*
**********************************Copyright (c) ****************************
*	  						cwg
*			       All Rights Reserved
*			     		QQ:7084394
*
*---------------------------------File Info---------------------------------
*File Name    	:uart.c
*Descriptor   	:
*Create By    	:ChenWeiGuo
*Create Date  	:2006-9-24
*Version      	:V1.0
*Note	      		:
*
*---------------------------------------------------------------------------
*Modified By    :
*Modified Date  :
*Version        :
*Note	        	:
*
****************************************************************************
*/
#define _IN_UART_
#include "config.h"

uint8 	Rx1Buffer[USART_RX_BUFFER_SIZE];
uint8 	Tx1Buffer[USART_TX_BUFFER_SIZE];
uint16 	Rx1Head = 0, Tx1Head = 0;
uint16 	Rx1Tail = 0, Tx1Tail = 0;

/***************************************************************************
*Function Name	  :InitUart
*Description      :
*Input parameters :
*Return Values:   :
*Global Variables :
*Calling Modules  :
***
*Create By	      :ChenWeiGuo
*Create Tate	  :2007-4-27
***
*Modified By	  :
*Modified Date    :
*Note		      :
****************************************************************************/
void InitUart(void)
{
    //Communication Parameters: 8 Data, 1 Stop, No Parity
    //USART Receiver: On
    //USART Transmitter: On
    //USART Mode: Asynchronous
    //USART Baud rate: 38400    
    UCSR1A = 0x00;
    UCSR1B = 0xD8;
    UCSR1C = 0x06;
    UBRR1H = 0x00;
    UBRR1L = 0x0C;	
}
/***************************************************************************
*Function Name	
*Description        :
*Input parameters   :
*Return Values:   	:
*Global Variables 	:
*Calling Modules  	:
***
*Create By	      	:ChenWeiGuo
*Create Tate	 	:2007-4-27
***
*Modified By	  	:
*Modified Date    	:
*Note		      	:
****************************************************************************/
#pragma optimize=z 4
AVRX_SIGINT(SIG_UART1_RECV)//串口接收中断函数
{                
    /*接收到数据*/    
    IntProlog();                //切换到系统堆栈   
	Rx1Buffer[Rx1Tail] = UDR1;  	
	IncRxPtr(Rx1Tail);			//调整尾巴 	
	Epilog();                   //返回任务堆栈 
} 
/***************************************************************************
*Function Name	
*Description        :
*Input parameters   :
*Return Values:   	:
*Global Variables 	:
*Calling Modules  	:
***
*Create By	      	:ChenWeiGuo
*Create Tate	 	:2007-4-27
***
*Modified By	  	:
*Modified Date    	:
*Note		      	:
****************************************************************************/
#pragma optimize=z 4
AVRX_SIGINT(SIG_UART1_TRANS)    //串口发送中断函数
{
    //发送完数据
	IntProlog();                //切换到系统堆栈	
	if(Tx1Tail != Tx1Head)
	{         	 
		UDR1 = Tx1Buffer[Tx1Head];	
		IncTxPtr(Tx1Head);		//调整为下一次的头指针			
	}     
	Epilog();                   //返回任务堆栈 
}
/***************************************************************************
*Function Name	  :GetUart1Data
*Description      :
*Input parameters :
*Return Values:   :
*Global Variables :
*Calling Modules  :
***
*Create By	      :ChenWeiGuo
*Create Tate	  :2006-9-24
***
*Modified By	  :
*Modified Date    :
*Note		      :
****************************************************************************/
uint8 GetUart1Data(uint8 *pbyData)
{
	//读取串口接收缓存区一字节数据	    	
    if(Rx1Tail != Rx1Head)
    {	/*缓冲区中有数据*/      	
        *pbyData = Rx1Buffer[Rx1Head];	//取出第一个数据	        
        IncRxPtr(Rx1Head);	            //调整为下一次的头指针                                                    
        return(OK);
    }
    else
    {      		        
     	return(ERROR);
    }
} 
/***************************************************************************
*Function Name	  :PutUart1Data
*Description      :
*Input parameters :
*Return Values:   :
*Global Variables :
*Calling Modules  :
***
*Create By	      :ChenWeiGuo
*Create Tate	  :2006-9-24
***
*Modified By	  :
*Modified Date    :
*Note		      :
****************************************************************************/
uint8 PutUart1Data(uint8 byData)
{		    
    Tx1Buffer[Tx1Tail] = byData;    //数据入缓冲区	
    IncTxPtr(Tx1Tail);			    //调整为下一次的头指针
    if(Tx1Tail != Tx1Head)          //缓冲区没有满
    {             
        return(OK);
    }
    else
    {             
	 	return(ERROR);
    }	
} 
/***************************************************************************
*Function Name	  :StartUart1Send
*Description      :
*Input parameters :
*Return Values:   :
*Global Variables :
*Calling Modules  :
***
*Create By	      :ChenWeiGuo
*Create Tate	  :2007-4-27
***
*Modified By	  :
*Modified Date    :
*Note		      :
****************************************************************************/
void StartUart1Send(void)
{	
    while(!(UCSR1A & (1 << UDRE1)));	//等待发送缓冲区空          
    UDR1 = Tx1Buffer[Tx1Head]; 
	IncTxPtr(Tx1Head);					//调整为下一次的头指针		
		
	return;
}
/***************************************************************************
*Function Name	  :SendUart1String
*Description      :
*Input parameters :
*Return Values:   :
*Global Variables :
*Calling Modules  :
***
*Create By	      :ChenWeiGuo
*Create Tate	  :2006-9-24
***
*Modified By	  :
*Modified Date    :
*Note		      :
****************************************************************************/
uint8 SendUart1String(uint8 *pbyData, uint16 uiLen) // 发送一数据帧包;
{
	if(uiLen == 0)              //数据长度错误
	{
	    return(ERROR);
	}
	while(uiLen-- != 0)
	{
	    if(PutUart1Data(*pbyData++) == ERROR)
	    {   //发送数据帧超过缓冲区大小
	        return(ERROR);
	    }		    
	}
	StartUart1Send();           //启动数据发送
	
	return(OK);
} 

⌨️ 快捷键说明

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