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


你可能感兴趣的:(单片机/ARM,开发,字符流,硬件,编程,stm32,ARM)