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

📄 serialcomm.c

📁 mega16 ucos操作系统
💻 C
字号:
#define SER_GLOBALS

#include "..\source\CPU_Source\includes.h"



/*
*******************************************************************************
**                             Uart初始化
**
**功    能:配置所使用的Uart端口
**参    数:无
**返 回 值:无
**创建日期:2009年03月10日
**修改记录:
**说    明:
*******************************************************************************
*/


void  Uart_Init(void)
{
  
    INT8U  temp;                                  

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous

    UCSRA=0x00;
    UCSRB=0xD8;
    UCSRC=0x86;
	UBRRH=0x00;
	switch(SysParam[eeprom_baud])
	{
	  case 1200:	       
           UBRRL=0xCF;
		   break;
	  case 2400:	       
           UBRRL=0x67;
		   break;
	  case 4800:
	       UBRRL=0x33;
		   break;
	  case 9600:
	       UBRRL=0x19;	
		   break;	       
	  case 19200:
	       UBRRL=0x0c;
		   break;
	  default:
	       UBRRL=0x19;	
	       break;
	  
	}

    UartRingBuf.RxCounter=0;
	UartRingBuf.RxIndex=0;
	UartRingBuf.RxInptr=0;
	UartRingBuf.RxOutptr=0;	
	
	UartRingBuf.TxCounter=0;
	for(temp=0;temp<UART_TX_BUF_SIZE;temp++)
		UartRingBuf.TxBuf[temp]=0;
	UartRingBuf.TxInptr=0;
	UartRingBuf.TxOutptr=0;
	
   
}



/*
*********************************************************************************************************
*                                 Rx Communication handler for uC/OS-Bms
*
* Description: This function is called by OSBms_RxISR (see OS_Bms_a.ASM) to process a received
*              character interrupt.
*********************************************************************************************************
*/

void  OSBms_RxISRHandler (void) 
{
#if OS_CRITICAL_METHOD == 3                          /* Allocate storage for CPU status register       */
    OS_CPU_SR  cpu_sr;
#endif
    POSMSG  pmsg;
    INT8U   rx_status;
	INT8U   rx_data;
    OS_ENTER_CRITICAL();
	rx_status = UCSRA;
    rx_data   = UDR;
	 
	/* Clear interrupt source by reading Rx Data      */
    if(UartRingBuf.RxCounter<UART_RX_FRAME){/*缓冲区满则放弃接收*/
		if (rx_status & ((1<<FE)|(1<<PE)|(1<<DOR)|(1 << RXC))) { /* Check if received character?       */
       	    UartRingBuf.RxBuf[UartRingBuf.RxInptr][UartRingBuf.RxIndex++] = rx_data;     
		    
			switch(UartRingBuf.RxIndex)
		   {
		 	    case 1:			
				    if(rx_data!=UART_BEGIN_STX)
				 	   UartRingBuf.RxIndex=0;	
				    break;
				case 2:
				    if(rx_data!=ClientAddr)
					    UartRingBuf.RxIndex=0;					
					 
					break;
			    case UART_RX_FRAME_SIZE:			     
				    if(rx_data==UART_END_STX)				
				    {	
					   UartRingBuf.RxInptr++;						
					   if(UartRingBuf.RxInptr==UART_RX_FRAME)
					 	  UartRingBuf.RxInptr=0;
					   UartRingBuf.RxCounter++;						 
					   OSSemPost(UartRxSem);						   				
				    }
				    UartRingBuf.RxIndex=0;		
				    break;				  	   		 		 
		    }			
        } 
	} 
    OS_EXIT_CRITICAL();
}

/*
*********************************************************************************************************
*                                 Tx Communication handler for uC/OS-Bms
*                                            (PORT SPECIFIC)
*
* Description: Handle transmission of a character
*
* Note(s)    : 1) This function is called by OSView_UDREISR (see OS_BMS_a.ASM)
*********************************************************************************************************
*/

void  OSBms_UDREISRHandler (void) 
{
   OS_ENTER_CRITICAL();//关中断 
   if(UartRingBuf.TxCounter)
   {
   	  
   	   UartRingBuf.TxCounter--;	     	      
	   UDR=UartRingBuf.TxBuf[UartRingBuf.TxOutptr++];
	   if(UartRingBuf.TxOutptr==UART_TX_BUF_SIZE)
   		   UartRingBuf.TxOutptr=0;	
	    
   }
   else
   {
      UCSRB&=~(1<<UDRIE);     
	}
	OS_EXIT_CRITICAL();   
}

/*
*********************************************************************************************************
*                                 Tx Communication function for uC/OS-Bms
*                                            (PORT SPECIFIC)
*
* Description: Handle transmission of a character
*
* Note(s):
*********************************************************************************************************
*/
void Uart_PutChar(INT8U c)
{
 	 if(UartRingBuf.TxCounter||((UCSRA & (1<<UDRE))==0))
     { 		
		OS_ENTER_CRITICAL();//关中断	
		if((UartRingBuf.TxCounter==0)&&((UCSRA & (1<<UDRE))==1))
		{
		   UDR=c;
		   UCSRB |= (1 << UDRIE);	
		}
		else
		{   	
   		   UartRingBuf.TxBuf[UartRingBuf.TxInptr++]=c;
   		   if(UartRingBuf.TxInptr==UART_TX_BUF_SIZE)
   		      UartRingBuf.TxInptr=0; 
		   UartRingBuf.TxCounter++;
	     }
		 OS_EXIT_CRITICAL();		      
	 }   
	 else
	 {	    
		OS_ENTER_CRITICAL();//关中断   
		UDR=c;		
		UCSRB |= (1 << UDRIE);
		OS_EXIT_CRITICAL();	
	}
}


void Uart_GetFrame(INT8U *buf)
{   
    INT8U  i,index;    
	OS_ENTER_CRITICAL();//关中断
	index=UartRingBuf.RxOutptr++;
	if(UartRingBuf.RxOutptr==UART_RX_FRAME)
   		UartRingBuf.RxOutptr=0;	    
	for(i=0;i<UART_RX_FRAME_SIZE;i++)      
   		(*buf++)=UartRingBuf.RxBuf[index][i]; 		   
    UartRingBuf.RxCounter--;
    OS_EXIT_CRITICAL();	
}


⌨️ 快捷键说明

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