stm32 对于串口数据流的处理

串口编程问题:

   当来的数据是一个字符流的时候,截取需要的一串字符的处理 (stm32):

#include "bsp_usart.h"


uint8_t RxBuffer1[COM1_Rx_length]={0};
uint8_t RxBuffer2[COM2_Rx_length]={0};
uint8_t TxBuffer1[COM1_Tx_length]={0}; 
uint8_t TxBuffer2[COM2_Tx_length]={0};

extern uint8_t flag;									   
USART_TypeDef COM1,COM2;	//bsp_usart.c中的全局变量,在stm32f10x.h的结构体定义中增加了两个变量UsartRecvBufReadIndex UsartRecvBufWriteIndex;

/***************************************************************************************************
*\Function      Usart_GPIO_config
*\Description   配置函数
*\Parameter     void
*\Return        void
*\Note          
*\Log           2014.05.28    Ver 1.0    
*               创建函数。
***************************************************************************************************/
void Usart_GPIO_config()
{

	/*
	USART2 
	TXD2----- PA2-US2-TX
	RXD2----- PA3-US2-RX

	USART1
	PA9   --tx
	PA10  --rx


	速率:9600,n,8,1 
	*/
	GPIO_InitTypeDef GPIO_Structure;
	GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz; 
	//   GPIO_Structure.GPIO_Pin=GPIO_Pin_9;
	//	 GPIO_Structure.GPIO_Mode=GPIO_Mode_AF_PP;
	//	 GPIO_Init(GPIOA,&GPIO_Structure);

	//	 GPIO_Structure.GPIO_Pin=GPIO_Pin_10;
	//	 GPIO_Structure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	//	 GPIO_Init(GPIOA,&GPIO_Structure);

	GPIO_Structure.GPIO_Pin=GPIO_Pin_3;
	GPIO_Structure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA,&GPIO_Structure);

	GPIO_Structure.GPIO_Pin=GPIO_Pin_2;
	GPIO_Structure.GPIO_Mode=GPIO_Mode_AF_PP;;
	GPIO_Init(GPIOA,&GPIO_Structure);



}
/***************************************************************************************************
*\Function      void Usart_Initlocal(int8_t port)
*\Description   Usart 时钟使能
*\Parameter     port 使能端口 (1或2)
*\Return        void
*\Note          
*\Log          	2014年7月4日
*               创建函数。
***************************************************************************************************/
void Usart_RCC_Initlocal(int8_t port)
{
	if(port==1)		  
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);	 
	if(port==2)
		RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2,ENABLE);

}
/***************************************************************************************************
*\Function      SetBaudRatelocal(USART_TypeDef* USARTx ,u32 BaudRate)
*\Description   设置波特率
*\Parameter     USART_TypeDef* USARTx
*\Parameter     u32 BaudRate
*\Return        void
*\Note          
*\Log          	2014年7月4日
*              
***************************************************************************************************/
void SetBaudRatelocal(USART_TypeDef* USARTx ,u32 BaudRate)
{

	USART_InitTypeDef USART_InitStructure; 
	USART_InitStructure.USART_BaudRate = BaudRate; 
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; 
	USART_InitStructure.USART_StopBits = USART_StopBits_1; 
	USART_InitStructure.USART_Parity = USART_Parity_No; 
	USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None; 
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; 
	USART_Init(USARTx, &USART_InitStructure);  

}

/***************************************************************************************************
*\Function     Usart_Enablelocal(USART_TypeDef* Usartx)
*\Description   使能USAETx
*\Parameter     USART_TypeDef* Usartx
*\Return        void
*\Note          
*\Log          	2014年7月4日
*              	在时钟使能和设置完波特率之后,再使能Usart
***************************************************************************************************/
void Usart_Enablelocal(USART_TypeDef* Usartx)
{		
	USART_ITConfig(Usartx, USART_IT_TXE, ENABLE);
	USART_ITConfig(Usartx, USART_IT_RXNE, ENABLE);
	USART_Cmd(Usartx, ENABLE);	  

}
/***************************************************************************************************
*\Function     Usart_Enable(USART_TypeDef* Usartx)
*\Description   使能USAETx
*\Parameter     IRQn_Type IRQx( USART1_IRQn / USART2_IRQn)
*\Return        void
*\Note          
*\Log          	2014年7月4日
*              	在时钟使能和设置完波特率之后,再使能Usart
***************************************************************************************************/
void Usart_NVIconfiglocal(IRQn_Type IRQx)
{
	NVIC_InitTypeDef NVICInitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
	if(USART1_IRQn==IRQx)
		NVICInitStructure.NVIC_IRQChannel = USART1_IRQn;
	if(USART2_IRQn==IRQx)
		NVICInitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVICInitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
	NVICInitStructure.NVIC_IRQChannelSubPriority = 0;
	NVICInitStructure.NVIC_IRQChannelCmd = ENABLE;	
	NVIC_Init(&NVICInitStructure);
}
/////////////以上为硬件初始化/////////////////////////////////////////////////////////////////////////////////////

/***************************************************************************************************
*\Function      Usart_Sendchar(USART_TypeDef* USARTx,uint8_t ch_data)
*\Description   发送单个字节
*\Parameter     USART_TypeDef* USARTx
*\Parameter     uint8_t ch_data
*\Return        void
*\Note          
*\Log          	2014年7月5日
*              	
***************************************************************************************************/
void Usart_Sendchar(USART_TypeDef* USARTx,uint8_t ch_data)
{
	while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);
	USART_SendData(USARTx,(u8)ch_data);
}

/***************************************************************************************************
*\Function      Usart_SendString(USART_TypeDef* USARTx,uint8_t *p_str)
*\Description   发送字符串 
*\Parameter     USART_TypeDef* USARTx
*\Parameter     uint8_t *p_str
*\Return        void
*\Note          
*\Log          	2014年7月5日
*              	用于测试  需要以‘0’字符结尾
***************************************************************************************************/
void Usart_SendString(USART_TypeDef* USARTx,uint8_t *p_str)
{
	while(*p_str)
	{	  	   
		Usart_Sendchar(USARTx,*p_str++);	 
	}	
}
/////////////////////////////////////////////////////////////////
/***************************************************************************************************
*\Function       USARTSend(USART_TypeDef* USARTx,uint8_t *p_str,uint8_t len)
*\Description   发送函数
*\参数          USART_TypeDef* USARTx  端口号
*\参数          uint8_t *buf  接收数组
*\参数          uint8_t len	  接收串的长度
*\Return        uint8_t       返回实际可读取串的长度
*\Note          
*\Log          	2014年7月5日
*              	
***************************************************************************************************/
void USARTSend(uint8_t port,uint8_t *p_str,uint8_t len)
{
	uint8_t i;
	if(port==1)
	{
		for(i=0;i<len;i++)
		{				   	   
			Usart_Sendchar(USART1,p_str[i]);   	   
		}

	}
	if(port==2)
	{
		for(i=0;i<len;i++)
		{				   	   
			Usart_Sendchar(USART2,p_str[i]);   	   
		}
	}
}		
/***************************************************************************************************
*\Function      USARTRecv(uint8_t port,uint8_t *buf,uint8_t len)
*\Description   接收函数
*\参数          uint8_t port  端口号
*\参数          uint8_t *buf  接收数组
*\参数          uint8_t len	  接收串的长度
*\Return        uint8_t       返回实际可读取串的长度
*\Note          
*\Log          	2014年7月5日
*              	
***************************************************************************************************/
uint8_t USARTRecv(uint8_t port,uint8_t *buf,uint8_t len)
{
	uint8_t data_count=0;
	uint8_t i;

	switch(port)
	{
	case 1:
		data_count=(COM1.UsartRecvBufWriteIndex+COM1_Rx_length-COM1.UsartRecvBufReadIndex)%COM1_Rx_length;
		if(data_count<len)
		{			   
			len=data_count;	 // 当len<(UsartRecvBufWriteIndex-UsartRecvBufReadIndex)的时候,数据并不放在buf中,而是等待大于或等于的时候再放入!!!
		}
		else
		{
			for(i=0;i<len;i++)
			{
				buf[i]=RxBuffer1[COM1.UsartRecvBufReadIndex++];
				COM1.UsartRecvBufReadIndex=COM1.UsartRecvBufReadIndex%COM1_Rx_length;
			}

		}
		break;
	case 2:
		data_count=(COM2.UsartRecvBufWriteIndex+COM2_Rx_length-COM2.UsartRecvBufReadIndex)%COM2_Rx_length;
		if(data_count<len)
		{
			len=data_count;						
		}
		else
		{
			for(i=0;i<len;i++)
			{
				buf[i]=RxBuffer2[COM2.UsartRecvBufReadIndex++];
				COM2.UsartRecvBufReadIndex=COM2.UsartRecvBufReadIndex%COM2_Rx_length;	

			}
		}
		break;
	default:
		break;					   
	}
	return len;

}







/***************************************************************************************************
*\Function      Usart1_RxIntHandler(void)
*\Description   Usart1接收处理函数
*\Parameter     void
*\Return        void
*\Note          
*\Log          	2014年7月5日
*              	放在中断里进行接收
***************************************************************************************************/
void Usart1_RxIntHandler(void)
{

	if(USART_GetFlagStatus(USART1,USART_IT_RXNE)!=RESET)
	{
		RxBuffer1[COM1.UsartRecvBufWriteIndex++]=USART_ReceiveData(USART1);
		COM1.UsartRecvBufWriteIndex=COM1.UsartRecvBufWriteIndex%COM1_Rx_length;

	}	 													 
	if(USART_GetITStatus(USART1,USART_IT_TXE)!=RESET)//	这段是为了避免STM32 USART 第一个字节发不出去的BUG // 发送中断还没有清零                
	{
		USART_ITConfig(USART1,USART_IT_TXE,DISABLE);  	
	}	// 当再有需要发送的字符是,硬件会自动置位 

}
//void Usart1_RxIntHandler(void)	//放在中断里进行接收
//{
//	uint8_t i;
//	if(USART_GetFlagStatus(USART1,USART_IT_RXNE)!=RESET)
//	{
//		RxBuffer1[RxCounter1++]=USART_ReceiveData(USART1);
//
//		if(RxBuffer1[RxCounter1-1]==0x16)
//		{
//			for(i=0;i<RxCounter1;i++)
//			{
//				TxBuffer1[i]=RxBuffer1[i]; 						 
//			}
//			TxBuffer1[RxCounter1]=0;
//			flag=1;
//			RxCounter1=0;	  			
//		}  	
//	}
//	if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //这段是为了避免STM32 USART 第一个字节发不出去的BUG // 发送中断还没有清零                
//	{ 
//		USART_ITConfig(USART1, USART_IT_TXE, DISABLE);					     //禁止发缓冲器空中断, 
//	}	// 当再有需要发送的字符是,硬件会自动置位 
//
//}



/***************************************************************************************************
*\Function      Usart2_RxIntHandler(void)
*\Description   Usart2接收处理函数
*\Parameter     void
*\Return        void
*\Note          
*\Log          	2014年7月5日
*              	放在中断里进行接收   //结束符 0x16
***************************************************************************************************/
void Usart2_RxIntHandler(void)
{

	if(USART_GetFlagStatus(USART2,USART_IT_RXNE)!=RESET)
	{
		RxBuffer2[COM2.UsartRecvBufWriteIndex++]=USART_ReceiveData(USART2);
		COM2.UsartRecvBufWriteIndex=COM2.UsartRecvBufWriteIndex%COM2_Rx_length;

	}	 													 
	if(USART_GetITStatus(USART2,USART_IT_TXE)!=RESET)
	{
		USART_ITConfig(USART2,USART_IT_TXE,DISABLE);  	
	}

}
//void Usart2_RxIntHandler(void)
//{
//	uint8_t i;
//	if(USART_GetFlagStatus(USART2,USART_IT_RXNE)!=RESET)
//	{
//		RxBuffer2[RxCounter2++]=USART_ReceiveData(USART2);
//		if(RxBuffer2[RxCounter2-1]==0x16)
//		{
//			for(i=0;i<RxCounter2;i++)
//			{
//				TxBuffer2[i]=RxBuffer2[i];
//
//			}
//			TxBuffer2[RxCounter2]=0;
//			flag=1;
//			RxCounter2=0;	  			
//		}  
//	}	 	
//	if(USART_GetITStatus(USART2,USART_IT_TXE)!=RESET)
//	{
//		USART_ITConfig(USART2,USART_IT_TXE,DISABLE);  	
//	}
//
//}



你可能感兴趣的:(编程,字符流,硬件,stm32,ARM)