개발모듈/펌웨어 모듈

- UART 수신처리

메가아재 2016. 2. 27. 06:28
반응형
unsigned char Rx_Complete;
unsigned char RX_BUFF[32]; 

//수신 인터럽트 서비스 루틴
#pragma vector = USART0_RX_vect
__interrupt void USART_interrupt(void)	
{
	// 데이터가 수신될때마다 1씩 증가
	static unsigned char RX_Count;
	unsigned char Data;
	
	// 수신바이트를 Data에 넣는다.	
	Data = UDR0;                    
	
	// 수신데이터에 에러가 없으면
	if(Rx_Complete == 0)            
	{			
		// 스타트 바이트	
		if(Data == '<')         	
		{
			RX_Count = 1;			
			RX_BUFF[0] = '<';	
		}					
		else	
		{	
			RX_BUFF[RX_Count++] = Data;			
			
			if(RX_Count >= 32) {RX_Count = 0;}
		}			
		
		// 스톱 바이트
		if(Data == '>')        
		{
			RX_BUFF[RX_Count] = 0;		
			
			// RX_Count를 0으로 초기화
			RX_Count = 0;    
			
			Rx_Complete = 1;		
		}		
	}	
}	

// 수신데이터 처리 함수
void Excute_Serial(void)	
{
	// 체크섬
	unsigned char Check_Sum;	
	
	// 체크섬이 RX_BUFF[1] ~ RX_BUFF[5]까지 합해서 RX_BUFF[6]과 비교할 경우
	Check_Sum = RX_BUFF[1] + RX_BUFF[2] + RX_BUFF[3] + RX_BUFF[4] + RX_BUFF[5];	
	
	// 체크섬이 맞을 경우
	if(Check_Sum == RX_BUFF[6])    
	{
		;
	}
	// 체크섬이 맞지 않을 경우
	else                            
	{
		;
	}
}

// 메인 함수
void main(void)	
{
	while(1)	
	{			
		if(Rx_Complete)	
		{
			Excute_Serial();
			Rx_Complete = 0;
		}	
	}
}

반응형