HAL库中断方式进行串口通信

HAL库中断方式进行串口通信

版本:

软件:

STM32CubeMX:6.6.0
KEIl:5.37.0.0
FlyMcu:0.188
硬件:
STM32F103ZET6

1. 通过CubeMX配置项目

1.1 设置SYS

image-20221019190425614

1.2 设置RCC

image-20221019191732518

1.3 设置USART

image-20221019191844584

1.4 设置NVIC

image-20221019191953929

1.5 设置时钟

image-20221022090327014

1.6 创建项目

image-20221019192059091

image-20221019192106506

2. keil配置代码

2.1 printf函数设置

main.cusart.c中添加头文件#include "stdio.h"之后,勾选Target中的use MicroLIB,在mian.c文件中,添加如下代码,进行重定义

int fputc(int ch, FILE *f)
 
{
 
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
 
  return ch;
 
}

2.2 设置两个字符型数组和FLAG

main.c中设置两个字符型数组,用来存放需要判别的字符串(记得添加头文件#include "string.h")。同时设置FLAG标志变量,来判断电脑向stm32发送了哪一个字符串。

uint8_t aRxBuffer;		//接收中断
uint8_t Uart1_RxBuff[256]; //接收缓冲
uint8_t str1[1] = "g";
uint8_t str2[1] = "s";
uint8_t go[20] = "go stm32!";
uint8_t stop[20] = "stop stm32!";
uint8_t Uart1_Rx_Cnt = 0;	//接收缓冲计算
uint8_t cAlmStr[] = "数据溢出\r\n";
unsigned int flag = 1;

在这里插入图片描述

2.2在main函数中设置接收中断

2.2.1 函数原型

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

2.2.2 功能

串口中断接收,以中断方式接收指定长度数据。

  1. 大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。

  2. 接收到数据时,会触发串口中断。

  3. 再然后,串口中断函数处理,直到接收到指定长度数据

  4. 而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

2.2.3 参数
UART_HandleTypeDef *huartUATR的别名
huart1 *pData接收到的数据存放地址
Size接收的字节数
2.2.4 在while前添加
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);

image-20221022103155132

2.3 main函数里while循环里面添加传输代码

while (1)
{
	if(flag == 1){		
	  		printf("Hello windows!\r\n");
		}
	HAL_Delay(1000);
}

2.4 在main函数下面重写中断处理函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(strcmp(Uart1_RxBuff, str1) == 0)
	{
			flag = 1;
			printf("start....\r\n");
		
	}
	if(strcmp(Uart1_RxBuff, str2) == 0)
	{
			flag = 0;
			printf("stop....\r\n");
		
	}
	if (strcmp(Uart1_RxBuff, go) == 0){
			flag = 1;
			printf("start....\r\n");
		
	}
	if (strcmp(Uart1_RxBuff, stop) == 0){
			flag = 0;
			printf("stop....\r\n");
		
	}
	if(Uart1_Rx_Cnt >= 255)  //溢出判断
	{
		Uart1_Rx_Cnt = 0;
		memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));
		HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);	
	}
	else
	{
		Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
	
		if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
		{
			Uart1_Rx_Cnt = 0;
			memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组
		}
	}
	
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断

}

image-20221022104531824

3. 编译

image-20221019194643767

4.烧录

image-20221019194911851

5.运行

image-20221022102725046

image-20221022102739902

6.总结

使用HAL库配置好相关引脚后,在生成的代码里可以很容易的实现中断控制串口通信,但是大量的函数需要自己查找,需要大量练习。

7. 参考文章

STM32利用中断实现LED亮灭和串口通信的收发_xxbiubiu的博客-CSDN博客

  • 1
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HAL库提供了一些函数和宏定义来帮助我们配置和使用串口中断,以实现多机通信。下面是一个简单的示例代码,演示如何使用HAL库实现串口中断多机通信: ```c #include "stm32f4xx_hal.h" UART_HandleTypeDef huart2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); // 启用串口中断 HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_data, 1); while (1) { // 主循环 } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart->Instance == USART2) { if (rx_data[0] == 0xAA) // 接收到数据头 { // 接收数据 HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_data, 7); } else // 接收到数据 { // 处理数据 // ... // 继续接收数据 HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_data, 1); } } } static void MX_USART2_UART_Init(void) { 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; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } ``` 在上面的代码中,我们启用了USART2的中断接收模式,当接收到数据时,会调用`HAL_UART_RxCpltCallback`函数进行处理。在该函数中,我们可以根据接收到的数据进行相应的处理,并继续启用中断接收模式以接收下一帧数据。例如,当接收到数据头0xAA时,我们启用中断接收模式以接收接下来的7个字节的数据;当接收到数据时,我们可以进行相应的处理,例如打印到终端或者进行数据解析等等。 需要注意的是,在使用多机通信时,需要对数据帧进行设计,例如在数据帧中添加数据头、数据长度、校验位等等,以确保数据的正确性和完整性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值