STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK)

在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。

下面就说一下使用printf需要做哪些配置。

有两种配置方法:

一、对工程属性进行配置,详细步骤如下

1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。

2、在main文件中重定义函数如下:

// 发送数据

1 int fputc(int ch, FILE *f)
2 {
3 USART_SendData(USART1, (unsigned char) ch);  // USART1 可以换成 USART2 等
4 while (!(USART1->SR & USART_FLAG_TXE));
5 return (ch);
6 }

// 接收数据

1 int GetKey (void)
2 {
3 while (!(USART1->SR & USART_FLAG_RXNE));
4 return ((int)(USART1->DR & 0x1FF));
5 }

这样在使用printf时就会调用自定义的fputc函数,来发送字符。

3、在工程属性的 “Target" -> "Code Generation" 选项中勾选 "Use MicroLIB"”

MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。

至此完成配置,在工程中可以随意使用printf向串口发送数据了。

二、第二种方法是在工程中添加“Regtarge.c”文件

1、在main文件中包含 “stdio.h” 文件

2、在工程中创建一个文件保存为 Regtarge.c ,然后将其添加工程中

在文件中输入如下内容(直接复制即可)

 1 #include "stdio.h"
2
3 #pragma import(__use_no_semihosting_swi)
4 extern int SendChar(int ch); // 声明外部函数,在main文件中定义
5 extern int GetKey(void);
6
7 struct __FILE
8 {
9 int handle; // Add whatever you need here
10 };
11
12 FILE __stdout;
13 FILE __stdin;
14
15 int fputc(int ch, FILE *f)
16 {
17 return (SendChar(ch));
18 }
19
20 int fgetc(FILE *f)
21 {
22 return (SendChar(GetKey()));
23 }
24
25 void _ttywrch(int ch)
26 {
27 SendChar (ch);
28 }
29
30 int ferror(FILE *f)
31 {
32 // Your implementation of ferror
33 return EOF;
34 }
35
36 void _sys_exit(int return_code)
37 {
38 label: goto label; // endless loop
39 }

注释:

fputc和 fgetc是c语言的标准函数(形参是标准的) FILE *f 是文件指针,具备文件系统的操作系统有用。对于简单的无文件系统的嵌入式系统无用。

3、在main文件中添加定义以下两个函数

 1 int SendChar (int ch)
2 {
3 while (!(USART1->SR & USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口
4 USART1->DR = (ch & 0x1FF);
5 return (ch);
6 }
7
8 int GetKey (void)
9 {
10 while (!(USART1->SR & USART_FLAG_RXNE));
11 return ((int)(USART1->DR & 0x1FF));
12 }

至此完成配置,可以在main文件中随意使用 printf 。

STM32中如何使用printf()函数的更多相关文章

  1. STM32中如何对printf函数重定向

    通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们现STM32工程上的printf()函数,方便用于程序开发中调试信息的打印. 方法一:使用MicroLIB库 ...

  2. php中sprintf与printf函数用法区别

    下面是一个示例:四舍五入保留小数点后两位  代码如下 复制代码 <?php$num1 = 21;echo sprintf("%0.2f",$num1)."<b ...

  3. STM32 KEIL 下的 printf 函数

    1 //加入以下代码,支持printf函数,而不需要选择use MicroLIB 2 #if 1 3 #pragma import(__use_no_semihosting) 4 //标准库需要的支持 ...

  4. stm32中如何进行printf重定向用于串口调试输出

    1 在main中包含stdio.h 文件 2 Target选项框里选Use MicroLib 选项 3 在main中添加UART1_Configuration()初始化的代码 Uart1初始化,voi ...

  5. 如果简化stm32中printf函数的使用——首先重定向

    STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印.(HAL库例程)https://blog.csdn.net/wu10188/article/details/9 ...

  6. 关于STM32中printf函数的重定向问题

    printf函数一般是打印到终端的,stm32芯片调试中经常需要用到串口来打印调试信息,那能不能用串口实现类似windows的Console中的printf呢? 答案是肯定的,那就是printf函数的 ...

  7. STM32 printf()函数和scanf()函数重定向到串口

    STM32 printf()函数和scanf()函数重定向到串口 printf()函数和scanf()函数重定向 在学习STM32的时候,常常需要用串口来测试代码的正确与否,这时候就要要用到print ...

  8. 单片机中printf函数的重映射

    单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...

  9. STM32 中的 assert_param 函数

    在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用. 断言机制函数assert_param我们在分析库函数的时候,几乎每一 ...

  10. C 中 关于printf 函数中度剖析

    题外话  这篇博文主要围绕printf函数分析的,主要讲解printf 使用C的可变参数机制, printf是否可重入(是否线程安全), printf函数的源码实现. 正文 1.C中可变参数机制 我们 ...

随机推荐

  1. HUAWEI SECURITY 2023 山东大学专场 WP

    Crypto by Smera1d0 1.ezrsa 题干如下: from Crypto.Util.number import getPrime from secret import flag p = ...

  2. 黑苹果(Hackintosh) - 问题,修改CPU数量和内存数量后,系统重启失败

    1. 问题复现 安装完黑苹果后,内存默认的 1个处理器2个核心.2G内存,发现不够用. 于是,修改了 VMware 对此系统的 硬件配置 内存: 2G -> 8G 处理器:1个处理器 -> ...

  3. [springboot] mvn编译实现代码混淆

    pom配置   <project>   <build>   <plugins>   <plugin>   <groupId>org.spri ...

  4. python_Django---基础

    1.创建app 终端:python3.x manage.py startapp  app(名字) 2.路由创建 urls.py: 导入函数:from app(app名) import views 创建 ...

  5. Qt编写视频监控系统77-Onvif组件支持非正常时间的设备

    一.前言 在经历了大量的现场设备测试,至少几十种厂家.几百种设备,遇见过奇奇怪怪的问题,一个个想方设法解决,发现有个问题是在下发鉴权的时候,需要带上设备的时间,而不是发送端的时间,如果带的不是设备上的 ...

  6. 关于Qt中的qss样式表需要注意的坑

    关于QSS要注意的坑. qss源自css,相当于css的一个子集,主要支持的是css2标准,很多网上的css3的标准的写法在qss这里是不生效的,所以不要大惊小怪. qss也不是完全支持所有的css2 ...

  7. 创建用于预测序列的人工智能模型,用Keras Tuner探索模型的超参数。

    上一篇:<创建用于预测序列的人工智能模型(五),调整模型的超参数> 序言:在完成初步的模型研发后,接下来的重点是探索和优化超参数.通过合理调整超参数(如学习率.动量参数.神经元数量等),可 ...

  8. 即时通讯技术文集(第40期):推送技术合集(Part2) [共18篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 40 期. [- 1 -] 一个基于长连接的安全可扩展的订阅/推送服务实现思路 [链接] h ...

  9. 即时通讯技术文集(第11期):IM通信格式的选型及Protobuf专题 [共16篇]

    为了更好地分类阅读52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第11 期. [- 1 -] 如何选择即时通讯应用的数据传输格式 [链接] http://www. ...

  10. 开源即时通讯IM框架 MobileIMSDK v6.2 发布

    一.更新内容简介 本次更新为次要版本更新,进行了若干优化(更新历史详见:码云 Release Nodes).可能是市面上唯一同时支持 UDP+TCP+WebSocket 三种协议的同类开源IM框架. ...