HAL库STM32CUBEMX学习记录——USART(串口中断收发数据)

一、首先使用STM32CUBEMX新建一个工程

二、打开工程文件

1.在usart.c中添加以下代码

/* USER CODE BEGIN 0 */
#include "stdio.h"
#include "string.h"
uint8_t aRxBuffer;//数据缓存
char USART_RX_BUF[USART_REC_LEN];//接收到的数据
uint16_t USART_RX_STA;//接收标志位


//printf函数重定向
int fputc(int ch,FILE *f)
{
	
    HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xFFFF);
	return ch;
}
int fgetc(FILE *f)
{
	uint8_t ch=0;
    HAL_UART_Receive(&huart1,&ch,1,0xFFFF);
	return ch;
}
/* USER CODE END 0 */

 2.然后在最后面加入中断回调函数

/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
 {
	UNUSED(huart);
	if(huart==&huart1)
	{
	if(USART_RX_STA<255)
			{
				USART_RX_BUF[USART_RX_STA ++]=aRxBuffer ;
				if((USART_RX_BUF[USART_RX_STA -1]==0x0A)&&(USART_RX_BUF[USART_RX_STA -2]==0x0D))
				{
					HAL_UART_Transmit(&huart1 ,(uint8_t *)&USART_RX_BUF ,USART_RX_STA,0xFFFF);
					USART_RX_STA=0;
					memset(USART_RX_BUF,0x00,sizeof (USART_RX_BUF));
				}
			}
	 else
			 {
				USART_RX_STA=0;
				memset(USART_RX_BUF,0x00,sizeof(USART_RX_BUF));
				HAL_UART_Transmit(&huart1,(uint8_t *)"数据已满",10,0xFFFF);
		    }
			HAL_UART_Receive_IT(&huart1 ,(uint8_t *)&aRxBuffer ,1);	   
 }
}
/* USER CODE END 1 */

3.在usart.h文件中加入

/* USER CODE BEGIN Includes */
#define USART_REC_LEN 5000 //接收的数据范围
extern char USART_RX_BUF[USART_REC_LEN];
extern uint8_t aRxBuffer;
extern uint16_t USART_RX_STA;

/* USER CODE END Includes */

 4.新建一个cmd.c文件,创建命令check函数

/**********************************
*函数:USART1_Check(char *cmd)
*输入参数:命令字符串
*返回值:无
**********************************/
void USART1_Check(char *cmd)
{
	
		if(strcasecmp("LED OFF",cmd)==0) 
 {
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
 }
		if(strcasecmp("LED ON",cmd)==0) 
 {
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
 }
}
/****************END OF FILE************/

5.在mian函数中的while(1)循环中调用USART1_Check(USART_RX_BUF)函数

6.最后串口初始化函数后打开串口中断函数

SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 *              		
  HAL_UART_Receive_IT(&huart1 ,(uint8_t *)&aRxBuffer ,1);
	printf("Int is ok!\r\n");
  /* USER CODE END 2 */

注意:还要在keil中勾选

配置好了就可以进行串口收发数据了,并且可以通过串口助手来控制单片机LED灯亮灭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值