UART+蓝牙

本文介绍了STM32中UART串口的配置与使用,包括波特率计算、中断接收函数和回调函数的应用。通过一系列测试案例展示了如何实现串口数据的收发、数据解析、LCD1602显示以及与手机蓝牙通信,涉及串口协议、数据处理和实时性需求。

1. uart(1)

串口简介

USART1,2,3:同步、异步

UART4,5:异步

image-20211118200653335

异步通信

image-20211118200751716

波特率也可以理解:传输每一位需要的时间

波特率9600:1s传输9600bit或者传输1bit的时间是19600\frac{1}{9600}96001s

串口发送/接收函数

image-20211118201002998

串口发送函数

此处常用阻塞方式发送函数

image-20211118201750297

串口接收函数

重点学习采用中断方式的接收函数

需要配合***接收中断回调函数***的使用

image-20211118202346592

MX串口配置

USART1——异步模式——波特率

image-20211118211127759

中断使能设置

image-20211118211741247

NVIC优先级配置

image-20211118212601676

其余System Core设置:

SYS/RCC/GPIO(PC12-output)

KEIL代码部分

串口初始化

读代码——MX_USART1_UART_Init();

image-20211118212446872

image-20211118212844714

UART中断部分

image-20211118213208793

image-20211118213411115

image-20211118213506984

image-20211120160752953

测试一 简单收发

image-20211120195052680

image-20211120195118925

以下测试只限发送和接收相同位数据,超出发送位数上限时,接收结果将显示错误

Test1 电脑端发送串口数据,单片机接收并翻转led


#include "main.h"
#include "usart.h"
#include "gpio.h"

uint8_t temp;

void SystemClock_Config(void);

int main(void)
{
   
   
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  HAL_UART_Receive_IT(&huart1,&temp,1);// 启动接收,将接收到的1bit保存在temp

  while (1)
  {
   
   
      
  }
}

// 串口接收中断回调函数
// 串口有数据进入,触发接收中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
   
   
	if(huart==&huart1)
	{
   
   
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_12);
		HAL_UART_Receive_IT(&huart1,&temp,1);// 每次接收完数据重新启动接收	

	}	
}

Test2 电脑端发送串口数据,单片机接收并回传给电脑


#include "main.h"
#include "usart.h"
#include "gpio.h"

uint8_t temp;
uint8_t u1_flag;// uart1标志位
uint8_t u1_txbuf[20] = {
   
   "this is ok"};// 用于发送:单片机向电脑端回传数据数组

void SystemClock_Config(void);

int main(void)
{
   
   
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  HAL_UART_Receive_IT(&huart1,&temp,1);// 启动接收启动接收,将接收到的1bit保存在temp,并进入中断

  while (1)
  {
   
   
   	  if(u1_flag == 1)
	  {
   
   
		HAL_UART_Transmit(&huart1,u1_txbuf,10,0xff);// 单片机向电脑端回传数据
		u1_flag=0;
	  }   
  }
}

// 串口接收中断回调函数
// 串口有数据进入,触发接收中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
   
   
	if(huart==&huart1)
	{
   
   
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_12);
        u1_flag=1;
		HAL_UART_Receive_IT(&huart1,&temp,1);// 每次接收完数据重新启动接收	
	}	
}

Test3 单片机接收5bit进入中断并向电脑返回数据


#include "main.h"
#include "usart.h"
#include "gpio.h"

uint8_t temp;
uint8_t u1_flag;// uart1标志位
uint8_t u1_rxbuf[20] = {
   
   0};// 用于接收

void SystemClock_Config(void);

int main(void)
{
   
   
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_USART1_UART_Init();

HAL_UART_Receive_IT(&huart1,u1_rxbuf,5);// 单片机每接收5bit才进入中断

  while (1)
  {
   
   
	  if(u1_flag == 1)
	  {
   
   
		temp++;  
		HAL_UART_Transmit(&huart1,u1_rxbuf,5,0xff);// 单片机向电脑端回传数据
		u1_flag=0;
	  }		 
  }
}

// 串口接收中断回调函数
// 串口有数据进入,触发接收中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
   
   
	if(huart==&huart1)
	{
   
   
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_12);
		u1_flag=1;
		HAL_UART_Receive_IT(&huart1,u1_rxbuf,5);// 电脑端发送5个bit进入1次中断	
	}		
}

Printf函数重定向至USARTx

/**
  * 函数功能: 重定向c库函数printf到USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
#include <stdio.h>
int fputc(int ch, FILE *f)
{
   
   
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1,0xffff);
  return ch;
}

Test4 使用printf函数向串口发送数据


#include "main.h"
#include "usart.h"
#include "gpio.h"

#include <stdio.h>
int fputc(int ch, FILE *f)
{
   
   
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1,0xffff);
  return ch;
}

uint8_t temp;
uint8_t u1_flag;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值