STM32F427VIT6串口hal库接收多个数据(NVIC)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

为了使用串口和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);
	}
}


总结

嘿嘿,加油欧里给,只要学不死就要往死里学。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
stm32f427vit6是一款强大的微控制器,可以用来控制两轮小车的运动。下面是一个简单的300字的程序示例: 首先,在程序中需要引入必要的文件,比如使用stm32f4xx.h和GPIO.h等。然后,定义一些常量和变量,如左右电机引脚的连接位置和小车的速度等。 接着,需要配置相关的引脚作为输出,以便控制电机的运动。可以选择将一对引脚配置为PWM输出,以实现对电机的速度控制,而将另一对引脚配置为数字输出,用于控制电机的正反转。 在程序的主循环中,可以使用一些条件判断来控制小车的运动。比如,当按下前进按钮时,可以设置电机引脚的输出为前进状态,并根据需要控制PWM的占空比来调整速度。 类似地,通过设置左右引脚的输出状态和PWM占空比,可以控制小车的后退、左转和右转等动作。还可以添加一些其他的功能,如设置定时器来控制小车的运动时间,以及使用传感器来检测障碍物并进行自动避障等。 最后,在程序中加入适当的延时函数,以确保控制信号传递到电机上并产生预期的运动效果。 以上是一个简单的示例程序,实际上,对于控制两轮小车的程序,还可以根据具体需要添加更多的功能和细节。在编写程序时,需要注意调试和测试,以确保程序的正确性和稳定性。同时,也可以参考相关的资料和例程,来更好地理解和运用stm32f427vit6微控制器的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片有机机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值