1.初始化串口
void USART_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*使能USART1*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*复位串口1*/
USART_DeInit(USART1);
/*初始化串口1发送引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*初始化串口1接收引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/*串口复用*/
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
/*配置波特率为115200,8位数据位,1位停止位、无校验等*/
USART_InitStructure.USART_BaudRate = 115200;
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_Rx | USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
2.串口中断接收数据
void USART1_IRQHandler(void)
{
uint8_t ret = 0;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
ret = USART_ReceiveData(USART1);
reveice_data(ret);//解析数据
}
}
解析数据
/**
* @brief 串口1接收APP数据解析,判断字头、长度等是否正确.
* @param None
* @retval None
*/
void reveice_data(uint8_t data)
{
//根据协议判断
rxflag = 1;
}
3.串口发送函数
/**
* @brief 串口发送底层函数。
* @param USART_TypeDef* USARTx:串口号。
* uint8_t *Data:发送数据起始指针。
* uint16_t Len:数据长度。
* @retval 无。
*/
void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,uint16_t Len)
{
uint16_t i;
for(i=0; i<Len; i++){
USART_SendData(USARTx, Data[i]);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
}
}
4.判断是否正确接受数据
/**
* @brief 判断串口1是否接收到正确的数据,接收正确需拷贝,进入下一步处理。
* @param 无。
* @retval 无。
*/
void usart1_analysis_data(void)
{
uint8_t size = uart1_len;
uint8_t data[200];
if(rxflag != 1 || size == 0)
return;
rxflag = 0; //接收标志位
memcpy(data,usart1_rxbuffer,size);
uart1_len = 0;
USART_OUT(USART1,data,size); //发送数据
}