UART串口(非DMA)学习随笔(STM32-HAL库)

一、概念

UART:通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。

二、应用

HAL库中常用的串口相关函数如下

//串口接收
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
//串口以DMA的形式接收
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
//串口以中断的形式接收
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
//串口接收回调
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
//串口发送
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
//串口以DMA的形式发送
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
//串口以中断的形式发送
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
//串口发送回调
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

由于本次学习目的性较强,为针对蓝桥杯相关赛题要求进行学习,故不会涉及到DMA相关内容,后续会继续补充!

2.1 如何使用

2.1.1 发送

在main.c中使用串口发送函数即可通过电脑向单片机发送数据

HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)

注意:

  1. 发送的内容位于第二个位置,且应为uint8_t型变量
  2. Size处参数为发送多长的数据

2.1.2 接收

在main.c中使用串口接收函数即可通过单片机接收电脑发送来的数据

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

注意:

  1. 接收的内容也位于第二个位置,且应为uint8_t型变量
  2. Size处参数为接收多长的数据,如果发送的数据多于接受的数据,则会截取接收中Size长度的数据

2.1.3 回调函数

当单片机接收到数据后,可以产生一次接收中断,且每次接收完成之后都会自动关闭接收中断,如果需要使用接收中断,则需要在每次接收完成后都重新启动。
回调函数相当于原先的中断服务函数,在产生中断后会进入中断服务函数跑相关程序代码,STM32CubeMX生成的代码中回调函数为__weak类型,用户如果需要对其中内容进行操作可以在其他位置调用该函数,并进行代码增添。

2.2 代码示例及结果演示

此代码的功能为:电脑向单片机发送一个字符串,单片机对字符串中内容的指定位进行判断,并将内容写入E2PROM,当单片机接收完成后,发送“ok\n”给电脑。
对E2PROM的简单使用有疑问的朋友可以移步我这一篇文章进行简单了解
EEPROM学习随笔

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);

  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_UART_RxCpltCallback can be implemented in the user file.
   */
	if(RX_BUFFER[3] == '1')
	{
		k = 0.1;
		IIC_AT24C02_Write(0,k);
	}
	if(RX_BUFFER[3] == '2')
	{
		k = 0.2;
		IIC_AT24C02_Write(0,k);
	}
	if(RX_BUFFER[3] == '3')
	{
		k = 0.3;
		IIC_AT24C02_Write(0,k);
	}
	if(RX_BUFFER[3] == '4')
	{
		k = 0.4;
		IIC_AT24C02_Write(0,k);
	}
	if(RX_BUFFER[3] == '5')
	{
		k = 0.5;
		IIC_AT24C02_Write(0,k);
	}
	if(RX_BUFFER[3] == '6')
	{
		k = 0.6;
		IIC_AT24C02_Write(0,k);
	}
	if(RX_BUFFER[3] == '7')
	{
		k = 0.7;
		IIC_AT24C02_Write(0,k);
	}
	if(RX_BUFFER[3] == '8')
	{
		k = 0.8;
		IIC_AT24C02_Write(0,k);
	}
	if(RX_BUFFER[3] == '9')
	{
		k = 0.9;
		IIC_AT24C02_Write(0,k);
	}
	
	sprintf(TX_BUFFER,"ok\n");
	HAL_UART_Transmit(&huart1,(uint8_t*)TX_BUFFER,sizeof(TX_BUFFER),0xFFFF);
	HAL_UART_Receive_IT(&huart1,(uint8_t*)RX_BUFFER,6);
}

在主函数中当然也需要调用相关函数,如下

  while (1)
  {
  	HAL_UART_Receive_IT(&huart1,(uint8_t*)RX_BUFFER,6);
  }

代码效果如下:

在这里插入图片描述

总结

通过STM32CubeMX使用UART串口时,在配置好相应的波特率、传输位数等相关参数后,在main.c中调用相关函数,在while循环中调用接收函数,同时编写回调函数即可实现反复发送数据
PS:笔者此次学习随笔目的性较强,对于串口的分析介绍非常浅显,对于串口的接收和发送的过程以及DMA模式、USART等相关功能为进行解释,后续等有时间了会进行一次完整详细的通信方面的文章,还请大家海涵!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

DayDayUp..

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

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

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

打赏作者

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

抵扣说明:

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

余额充值