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

printf()函数和scanf()函数重定向

在学习STM32的时候,常常需要用串口来测试代码的正确与否,这时候就要要用到printf()函数或者scanf()函数,但是printf()这个函数是格式化输出到屏幕的,scanf()函数又是格式化输入(从屏幕),并不能输出到串口助手中,所以需要进行重定向。


在系统中有三个标准文件:标准输入,标准输出,标准错误。 
printf : 强大的格式化转换(可以将任何类型转为字符串)。 
scanf : 强大的格式化转换(可以将字符串类型转为任何类型)。


要重定向,首先要找到底层函数: 
1.printf()函数的底层函数接口:在头文件<stdio.h>中第620行左右处, 

找到这个函数后,就可以开始写函数了

int fputc(int c, FILE *stream)
{
    USART1->DR = c;//将c赋给串口1的DR寄存器,即重定向到串口,也可以是其他的接口
    while(!(USART1->SR & (1 << 7))){};//等待数据发送完成
    return c;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.scanf()函数的底层函数接口:在头文件<stdio.h>中第595行左右处, 

重定向函数如下:

int fgetc(FILE *stream)
{
    while(!(USART1->SR & (1 << 5))){};//等待数据接收完成
    return USART1->DR;
}
  • 1
  • 2
  • 3
  • 4
  • 5

写好这两个函数后就可以在其他。.c文件中使用printf()函数将数据打印到串口调试助手了,当然也可以使用scanf()函数从串口调试助手输入数据。和C语言中的使用如出一辙,一毛一样!

值得注意的是:1.在头文件<stdio.h>中已经有fgetc()和fputc()这两个函数,为什么又可以再写这两个函数呢?难道不会产生重定义的错误吗?其实头文件<stdio.h>是在微信C语言库中,简称微型库。学过C语言的就知道,C代码在运行的时候,会优先在当前的.c文件中查找这两个函数,没有的话就会从系统默认的路径下查找。 
使用printf()和scanf()时要包含头文件<stdio.h>,微型库也要勾选上,如下图: 
 
2.勾选上微型库再进行编译的时候,会发现多了几KB的代码,在工程完成的时候就没必要再勾选上,再者,printf()函数仅仅是方便调试,在工程完成的时候也应该去掉!

STM32 printf()函数和scanf()函数重定向到串口的更多相关文章

  1. C中gets()函数与scanf()函数说明

    scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别.若想从键盘上输入字符串"hi hello",则应该使用 gets 函数. gets可以接收空格:而sc ...

  2. scanf函数和printf函数

    C程序实现输出和输入的 主要是printf函数 和 scanf函数,这两个函数是格式输入输出 格式声明由%和格式字符组成 如%d,%f 格式字符:  d格式符:用来输出一个有符号的十进制整数  c格式 ...

  3. C/C++编程笔记:C语言基础printf()和scanf()函数,大学入门知识

    在解释这两个函数之前,为了方便大家更容易理解,我们先来讲讲下面的这幅图. ​ 这个图中的例子其实很简单,我们就是把题目通过输入设备(例如键盘鼠标)传输到计算机中,然后让计算机进行运算得出结果,再然后把 ...

  4. C语言基础printf()和scanf()函数

    在程序的运行中,我们经常会进行一些输入输出的操作,用来实现交互.为此, C语言便给出了 printf() 函数和 scanf() 函数用来实现输入和输出两个动作. 其中,printf()函数用于向控制 ...

  5. C语言scanf函数详细解释

    原文链接 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准 ...

  6. C语言scanf函数详解

    函数名: scanf  功 能: 运行格式化输入  用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设 ...

  7. scanf函数详解

    函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键 ...

  8. C语言scanf函数详细解释(转载)

    原文地址:https://blog.csdn.net/21aspnet/article/details/174326 scanf 函数名: scanf 功 能: 执行格式化输入 用 法: int sc ...

  9. scanf()函数释疑(word找的,没源地址了)

    scanf()函数释疑(上) 一.序言 scanf()函数的控制串的使用 例1. #include "stdio.h" int main(void) { int a,b,c; sc ...

随机推荐

  1. 使用jQuery和CSS3实现一个数字时钟

    点击进入更详细教程及源码下载     在线演示 我们经常会在网站中看见一个时钟的效果.今天向大家分享一个使用jQuery和CSS3实现一个数字时钟教程. http://www.html5cn.org/ ...

  2. 编写xml文件不当时会出现R文件找不到情况

    1,先检查xml文件是否报错,报错的话直接找到报错行. 2,xml文件若不报错,可能是文本值得格式输入错误 比如android:text=“<0.5km”,此时的小于号就会引发错误,导致R文件找 ...

  3. Jni OnLoad()和OnUnload()

    除了前面说的自定义JNI函数之外,JNI还提供了两个特殊函数,它们是JNI_OnLoad()和JNI_OnUnload(),分别在加载库和卸载库的时候调用. 1.JNI_OnLoad() Java调用 ...

  4. [20180413]热备模式相关问题2.txt

    [20180413]热备模式相关问题2.txt --//上午测试热备模式相关问题,就是如果打开热备模式,如果中间的归档丢失,oracle在alter database end   backup ;时并 ...

  5. 系统运维|IIS的日志设置

    摘要: 1.服务器告警,磁盘资源不足 2.检查发现是IIS日志没有清理并且设置有误.在E盘占用了200G的空间 3.原则上IIS日志不能放在C盘,避免C盘写满了导致操作系统异常 4.附上IIS日志按天 ...

  6. mysql5.7如何修改密码以及密码如何忘记无密码登陆

    今天买了一台阿里云服务器,Centos7.3系统,环境是LAMP.学生价9.8元是真的很实惠了.然后想修改一下mysql服务器的密码(mysql版本5.7),结果操作失误,密码给忘记了,导致新旧密码都 ...

  7. January 06th, 2018 Week 01st Saturday

    In life the most interesting things tend to happen when you are on your way to do something else. 生活 ...

  8. 三叔学FPGA系列之二:Cyclone V中的POR、配置、初始化,以及复位

    对于FPGA内部的复位,之前一直比较迷,这两天仔细研究官方数据手册,解开了心中的诸多疑惑,感觉自己又进步了呢..... 原创不易,转载请转原文,注明出处,谢谢.   一.关于POR(Power-On ...

  9. idea+spring-boot+devtools热部署

    idea+spring-boot+devtools热部署 标签: spring-boot 2017-03-20 14:45 2635人阅读 评论(1) 收藏 举报  分类: spring-boot m ...

  10. Sublime Text 3安装及常用插件安装

    一.Sublime3下载 1.百度搜索Sublime3 download,选择进入下载页面 2.我选择下载Win64位安装程序 二.Sublime3安装 傻瓜式安装,一直点下一步即可. 三.Subli ...