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. vue-elementui 因滚动条引发的table错位问题

    修复后效果 在网上看到的方法都是设置样式属性,试过之后也不生效,也不知道原因 所以就自己用原生js解决了,代码如下 //修错位 x(){ var u = document.getElementsByC ...

  2. Docker非root用户修改/etc/hosts文件

    本文会讲解在Docker容器环境下,非root用户如何编辑修改/etc/hosts文件. 1.背景和需求描述 环境:Docker 运行用户:非root用户,如普通用户1001 需求:应用运行在容器内, ...

  3. HarmonyOS Next 入门实战 - 关系型数据库、smartdb

    SQLite数据库 HarmonyOS的关系型数据库基于SQLite 导入模块 import { relationalStore } from '@kit.ArkData'; 实现步骤: 获取RdbS ...

  4. 龙哥量化:通达信板块概念FAQ,*期强势、*期弱势是怎么划分的?等问题是官网的解释,股友可以根据文章的提示迸发策略灵感

    如果您需要代写公式, 请联系我. 龙哥QQ:591438821 龙哥微信:Long622889 比如第9条,*期强势:20日涨幅>=30%,     3日涨幅>0,非停牌.非ST.非未开板 ...

  5. Qt通用方法及类库6

    函数名 //判断是否是IP地址 static bool isIP(const QString &ip); //判断是否是MAC地址 static bool isMac(const QStrin ...

  6. Qt编写地图综合应用8-地图交互

    一.前言 最常用的地图交互就几个,比如鼠标在地图上按下的时候可以拾取经纬度坐标,然后传给Qt程序,再比如对设置的设备点进行单击的时候,通知Qt程序单击了哪一个设备点,好让Qt程序识别并作出反应比如弹出 ...

  7. Qt编写安防视频监控系统42-用户权限

    一.前言 前几年写这个视频监控系统的时候,就规划过要加入用户权限管理,因为不属于急需要的功能一直耽搁至今,近期刚好其他几个项目要需要这个功能,和秘钥认证一样,于是一鼓作气就把这几个功能一块干掉,本次完 ...

  8. Ubuntu 20.04编译opencv-3.1.0时报错 error: 'CODEC_FLAG_GLOBAL_HEADER' was not declared in this scope

    Ubuntu 20.04源码编译安装opencv320 报错 error: 'CODEC_FLAG_GLOBAL_HEADER' was not declared in this scope的解决办法 ...

  9. 长连接网关技术专题(八):B站基于微服务的API网关从0到1的演进之路

    本文由B站微服务技术团队资深开发工程师周佳辉原创分享. 1.引言 如果你在 2015 年就使用 B 站,那么你一定不会忘记那一年 B 站工作日选择性崩溃,周末必然性崩溃的一段时间. 也是那一年 B 站 ...

  10. 前端开发常用git命令详细版

    1.新建代码库 当前目录创建一个git代码库 git init 新建一个目录文件 将其初始化为git代码库 git init [pro-name] 远端拉去项目 git clone [url] 2.基 ...