提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
为了使用串口和esp8266通信,接收心知天气的json数据。
提示:以下是本篇文章正文内容,下面案例可供参考
一、串口接收数据
本节使用串口二作为和esp8266通信让后使用中断把回调的数据发给串口一通信
USART2.h
#ifndef __usart2_H
#define __usart2_H
#include "main.h"
#include "usart.h" //串口1头文件
#define TX2 GPIO_PIN_2
#define RX2 GPIO_PIN_3 //宏定义
#define USART_2 GPIOA
extern UART_HandleTypeDef huart2; //调用结构体
extern uint8_t Rxbuff[524]; //RX接收缓存包
extern uint16_t Rx_Len; //RX字节长度
extern uint8_t DateBuff[1]; //串口2回调的数据
void usart2_GPIO_Init(void); //引脚初始化
void USART_config(void); //串口初始化+中断初始化
void USART2_IRQHandler(void); // 串口2的中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart);// 串口的中断函数
#endif
USART2.c
#include "usart2.h"
UART_HandleTypeDef huart2;
uint8_t Rxbuff[524];
uint16_t Rx_Len;
uint8_t DateBuff[1];
void usart2_GPIO_Init(void){
GPIO_InitTypeDef GPIO_InitStruct;
__HAL_RCC_USART2_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = RX2|TX2;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
HAL_GPIO_Init(USART_2, &GPIO_InitStruct);
/* USART2 interrupt Init */
}
void USART_config(void){
usart2_GPIO_Init();
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart2);
HAL_NVIC_SetPriority(USART2_IRQn, 3, 2); //设置中断优先级
HAL_NVIC_EnableIRQ(USART2_IRQn); //使能串口2中断
HAL_UART_Receive_IT(&huart2,(uint8_t *)&DateBuff,1); //以非阻塞模式接收一定量的数据。必须有
}
void USART2_IRQHandler(void){
HAL_UART_IRQHandler(&huart2); //开启串口2中断
//HAL_UART_Receive_IT(&huart2,(uint8_t *)&DateBuff,1);
//Rxbuff[Rx_Len]=DateBuff[0];
//HAL_UART_Transmit(&huart2,(uint8_t*)&Rxbuff,strlen(Rxbuff) * sizeof(char),HAL_MAX_DELAY);
//HAL_UART_Transmit(&huart2,(uint8_t*)&DateBuff,strlen(DateBuff) * sizeof(char),HAL_MAX_DELAY);
//HAL_UART_Transmit(&huart1,(uint8_t*)&Rxbuff,sizeof(Rxbuff),HAL_MAX_DELAY);
//Rx_Len=0;
}
中断回调函数我是放到串口一里面的
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)//如果是串口1
{
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else
{
USART_RX_STA|=0x8000; //接收完成了
}
}
else //还没收到0X0D
{
if(aRxBuffer[0]==0x0d){
USART_RX_STA|=0x4000;
}
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
//************************************前面是正点原子的串口一的代码**********************
//************************************这里是我写的串口2接收长数据代码****************
if(huart->Instance==USART2){
//HAL_UART_Receive_IT(&huart2,(uint8_t *)&DateBuff,1);
/*******************************注意HAL_UART_Receive_IT()函数不要放到前面不然发送一定数据后串口会卡死,还有注意串口引脚焊接好没有。我就是因为自己画的stm32f427vit6开发板RX2引脚虚焊所以调试了一天。*/
if(DateBuff[0]=='\n'){ //判断接收的数据是否接收完,后面代码自己理解。
Rxbuff[Rx_Len]='\0';
Rx_Len=0;
HAL_UART_Transmit(&UART1_Handler,(uint8_t*)&Rxbuff,strlen(Rxbuff) * sizeof(char),HAL_MAX_DELAY);
}else{
Rxbuff[Rx_Len]=DateBuff[0];
Rx_Len++;
}
HAL_UART_Receive_IT(&huart2,(uint8_t *)&DateBuff,1);
//HAL_UART_Transmit(&huart2,(uint8_t*)&DateBuff,strlen(DateBuff) * sizeof(char),HAL_MAX_DELAY);
}
}
总结
嘿嘿,加油欧里给,只要学不死就要往死里学。