【STM32】USART串口重映射 & 打印输出printf标识符

简介: 【STM32】USART串口重映射 & 打印输出printf标识符

编写丢失数据帧的串口重映射(重定向)函数

  • 在USART1.h里添加   #include <stdio.h> 头文件
  • 编写串口重映射函数
1. int fputc(int Data, FILE *BUF)
2. {
3.  USART_SendData(USART1, Data);//串口1发送数据Data
4.  while ( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//USART_FLAG_TC标志位 运行不稳定
5. // while ( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);    
6. 
7.  return Data;
8. }

然后开启支持库,勾选 UseMicroLIB

20da5cc121f414725c32ccaeb1acf574_2bba5716272b43f4a5b215233fc5c02b.png

然后在while(1)中直接调用printf()函数即可

1. #include "stm32f10x.h"                  // Device header
2. #include "Delay.h"
3. #include "LED.h"
4. #include "USART1.h"
5. 
6. int main(void)
7. {
8.  Delay_Init (72);
9.  USART1_Init(115200);  //串口1波特率:115200
10. 
11.   while(1)
12.   {
13.     printf("2023新年快乐!你要加油!\r\n");
14.     Delay_ms(1500);
15.   }
16. }
17. 
18. /***********************************END OF FILE***********************************/

连接USB转TTL

参考【STM32】串口通讯USART串口中断配置硬件接线

下载程序,打开串口,有可能出现这种乱码的情况

bf9c6bb3c5d7263b5766743216bd891a_f2611326c09c498286f3badcc700ef06.png

然后在编码设置里,更改成UTF-8编码格式即可

d5ac598caf18504d77e324f890da9adc_078c4a2b43604d36b828615cec622395.png

看实际效果

b20bab791c79225378f4ad17ffcf1a45_7eb71b9e7efe4a3cba992a3719e5fb6a.png

在串口调试助手中可以看到接收到的大部分数据是正常的,但是按下复位按键之后,就会有数据帧丢失!!!!!

效果不理想~_~


修改fputc()函数!

36d8d8d6c7c82d6f8079a4adbcceb4e6_c4071f8c641d4c418f6fba27352f8c79.png

USART_FLAG_TC 和 USART_FLAG_TXE标志位有细微区别

代码里改成检测USART_FLAG_TXE标志位


这才是串口重定向函数!!!

1. int fputc(int Data, FILE *BUF)
2. {
3.  USART_SendData(USART1, Data);//串口1发送数据Data
4. // while ( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//USART_FLAG_TC标志位 运行不稳定
5. // 如果==0,就一直在这循环等待,直到等于1才跳出循环,这个标志位是1的时候,代表发送完成了 
6.  while ( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);    
7. 
8.  return Data;
9. }

89d876edf64bcb052775098c705198bc_c9a469d9518249e2a4f5b5e3ace11109.png

多按下复位按键,也没有数据帧丢失!检测USART_FLAG_TXE标志位,数据接收更加稳定!


串口打印标识符

效果如下

c9c951acfed589c6d1666865ebf76cd0_35a4275d981c478f8ffe566a5b63deee.png

直接粘main.c代码

1. #include "stm32f10x.h"                  // Device header
2. #include "Delay.h"
3. #include "LED.h"
4. #include "USART1.h"
5. 
6. char str[] = "2023年1月20日14:42:56";
7. 
8. int main(void)
9. {
10.   Delay_Init (72);
11.   USART1_Init(115200);  //串口1波特率:115200
12. 
13.   printf("\r\n");     //换行
14.   printf("%d\r\n", 255);  //十进制输出255
15.   printf("%x\r\n", 255);  //十六进制方式输出255,小写的十六进制 ff
16.   printf("%X\r\n", 255);  //十六进制方式输出255,大写的十六进制 FF
17.   printf("%#x\r\n", 255); //输出0xff
18.   printf("%#X\r\n", 255); //输出0xFF
19.   printf("%f\r\n", 255.0);    //输出255.000000
20.   printf("%.2f\r\n", 255.6666); //输出255.67
21.   printf("%0.8d\r\n", 255);   //蓝牙&红外遥控 输出完整信息
22.   printf("%s\r\n","Stay hungry stay foolish!"); //注意结尾要输入英文状态下的感叹号  
23.   printf("2023新年快乐!你要加油呀!\r\n");
24.   printf("%s\r\n",str);
25.   printf("\r\n");     //换行
26. 
27.   while(1)
28.   {
29. //    printf("2023新年快乐!你要加油呀!\r\n");
30. //    Delay_ms(1500);
31.   }
32. }
33. 
34. /***********************************END OF FILE***********************************/

最后验证USART_FLAG_TXE标志位状态

在while(1)获取USART_FLAG_TXE标志位状态即可

1. while(1)
2.  {
3. //   printf("2023新年快乐!你要加油呀!\r\n");
4.    printf("%d\r\n", USART_GetFlagStatus(USART1, USART_FLAG_TXE));//获取USART_FLAG_TXE标志位状态
5.    Delay_ms(200);
6.  }

 

ae74ce70cd3e7ea1df14e5188d264d63_65bc5a090ecb4fefbfc8b34a285ff33f.png

可以发送完数据, USART_FLAG_TXE == 1,跳出fputc函数的while循环,即发送完成!


相关文章
|
5月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
763 0
|
5月前
STM32CubeMX 串口收发一帧数据
STM32CubeMX 串口收发一帧数据
64 9
|
5月前
|
芯片
STM32CubeMX 串口数据收发
STM32CubeMX 串口数据收发
175 2
|
5月前
|
监控
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
392 0
|
7月前
|
存储 缓存 芯片
STM32--USART串口
STM32--USART串口
113 0
|
7月前
|
Java C语言
STM32使用printf重定向到USART(串口)并打印数据到串口助手
STM32使用printf重定向到USART(串口)并打印数据到串口助手
368 0
|
7月前
|
存储 传感器
【STM32基础 CubeMX】uart串口通信
【STM32基础 CubeMX】uart串口通信
408 0
|
6月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
470 2