基于HAL库的STM32串口发送数据+串口重定向printf

目录

一、函数介绍

1、堵塞式发送

2、中断方式发送

3、串口重定向printf

二、配置STM32CubeMX

三、代码编写及测试

1、堵塞式发送

1、中断方式发送

3、串口重定向printf函数


一、函数介绍

1、堵塞式发送

        堵塞模式也叫轮询模式,hal库里面堵塞式发送的函数为HAL_UART_Transmit(),具体使用方法如下:

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

该函数的作用是将数据通过UART发送到外部设备或其他设备。

参数说明:

huart: UART句柄,表示要使用的UART外设。
pData: 要发送的数据的指针,即数据的起始地址。
Size: 要发送的数据的大小,以字节为单位。用sizeof()函数获取发送缓冲区的长度
Timeout: 发送的超时时间,单位为毫秒。如果在指定的时间内发送完成,则函数返回 HAL_OK;否则,返回 HAL_TIMEOUT。如果设置为HAL_MAX_DELAY,处理器就会一直等到数据发送完成再执行下一条语句。

2、中断方式发送

        hal库里面的串口中断发送函数为HAL_UART_Transmit_IT(),具体用法和说明如下:

HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

这个函数的目的是启动UART传输并以非阻塞的方式发送一定数量的数据。

参数说明:中断方式的收发函数只有三个参数
        第一个参数是要使用的串口句柄地址

        第二个参数是发送缓冲区的首地址,用于存放要发送的数据
        第三个参数是发送缓冲区长度

3、串口重定向printf

        在PC上进行C语言程序开发时,我们可以利用C语言的格式化输出函数 printf()将程序的运行结果发送到显示屏上显示。在嵌入式系统的开发中,我们也希望能够将程序的运行结果或者调试信息发送到 PC 上显示,实现良好的人机交互。

        HAL库提供的串口收发函数,功能比较简单,不能进行格式化的输出。如果要实现类似 C语言中的格式化输出函数,需要把printf()函数的输出重新定向到串口。

        由于printf()函数通过调用fputc()函数来实现数据的输出,因此用户需要改写这个函数来实现串口的重定向。

二、配置STM32CubeMX

第一步:选择SYS的Debug-Serial Wire模式,开启SWD调试:

第二步:配置时钟,选择RCC的HSE(高速时钟)为 Crystal/Ceramic Resonator(外部晶振),接着再配置时钟树,将时钟频率配置为最大值168MHZ:

第三步:配置串口,这里我们使用串口一,将串口一的模式配置为Asynchronous(异步)模式,配置串口一波特率为115200,接着开启串口一中断:

接下来就是生成工程文件,初始化代码

三、代码编写及测试

1、堵塞式发送

首先定义发送数据缓冲数组Tx_Buff[],数组内容可以是中文字符也可以是英文字符:

uint8_t Tx_Buff1[] = "hello word\n";
uint8_t Tx_Buff2[] = "hello 单片机\n";

接着在main函数里面循环调用HAL_UART_Transmit()函数,加一个1s延时,实现1s发送一次数据:

HAL_UART_Transmit(&huart1,Tx_Buff1,sizeof(Tx_Buff1),100);
HAL_Delay(1000);
HAL_UART_Transmit(&huart1,Tx_Buff2,sizeof(Tx_Buff2),100);
HAL_Delay(1000);

最终在串口助手中的显示效果如下:

1、中断方式发送

        hal库的中断发送函数有三个参数,和轮询发送的函数前三个参数一样,只是没有了超时时间管理,因为中断(IT)方式配置完成寄存器之后不需要再占用CPU,会在接收/发送数据完成后触发中断,因此不需要超时时间管理机制。

首先定义发送数据缓冲数组Tx_Buff[],数组内容可以是中文字符也可以是英文字符:

uint8_t Tx_Buff3[] = "hello! 这是中断发送数据!\n";

接着在main函数里面循环调用HAL_UART_Transmit_IT()()函数,加一个1s延时,实现1s发送一次数据:

HAL_UART_Transmit_IT(&huart1,Tx_Buff3,sizeof(Tx_Buff3));
HAL_Delay(1000);

最终在串口助手中的显示效果如下:

3、串口重定向printf函数

第一步:在进行重定向之前,需要配置好串口,使用到串口的轮询模式。由于 printf()函数是由MDK 软件所提供的 C语言标准库函数,在完成程序编写后,用户还需要在MDK 软件的工程设置窗口中选择“Target”标签页勾选其中的“Use MicroLIB”选项。如果不勾选“Use MicroLIB”选项,则无法使用。

第二步:由于需要调用printf()函数,因此需要添加标准输入输出头文件:stdio.h。

第三步:重写fputc()函数:

int fputc(int ch,FILE *f)
{
	uint8_t temp[1] = {ch};
	
	//采用轮询方式发送1字节数据
	HAL_UART_Transmit(&huart1,temp,1,2);
	return ch;
}

第四步:在main函数里面调用printf()函数输出信息:

printf("hello! 这是printf输出!\n");
HAL_Delay(1000);

最终在串口助手中的显示效果如下:

最近更新

  1. TCP协议是安全的吗?

    2024-04-25 16:26:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-25 16:26:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-25 16:26:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-25 16:26:02       18 阅读

热门阅读

  1. - 实际案例演示Single-Spa的使用步骤

    2024-04-25 16:26:02       11 阅读
  2. C++人工智能程序01A版本

    2024-04-25 16:26:02       13 阅读
  3. uniapp实现相册、拍照及视频录制功能

    2024-04-25 16:26:02       13 阅读
  4. Flutter 扒一扒图片缓存框架cached_network_image

    2024-04-25 16:26:02       12 阅读
  5. pytest-cov代码覆盖率

    2024-04-25 16:26:02       14 阅读
  6. 宝塔Linux面板命令大全

    2024-04-25 16:26:02       12 阅读
  7. Flink容错机制

    2024-04-25 16:26:02       14 阅读
  8. Web 前端进阶—— Http 和数据结构 学习笔记

    2024-04-25 16:26:02       12 阅读
  9. go-zero整合Kafka实现消息生产和消费

    2024-04-25 16:26:02       12 阅读