历史上的今天

今天是:2024年10月08日(星期二)

正在发生

2021年10月08日 | STM32:重定向 prinft 和 getchar 函数,但是使用过程串口出现问题

发布者:电子创新者 来源: eefocus关键字:STM32  重定向  getchar  函数  串口 手机看文章 扫描二维码
随时随地手机看文章

在STM32学习中,我们肯定会学到串口的使用。其中关于串口数据的接收和发送,我们其实可以用 printf() 函数和 getchar() 函数来简化传输。我们只需要做一些简单的前期工作即可。


在 C 语言标准库中,fputc 函数是 printf 函数内部的一个函数,功能是将字符 ch 写入到文件指针 f 所指向文件的当前写指针位置,简单理解就是把字符写入到特定文件中。我们使用 USART 函数重新修改 fputc 函数内容,达到类似“写入”的功能。


fgetc 函数与 fputc 函数非常相似,实现字符读取功能。在使用 scanf 函数时需要注意字符输入格式。


还有一点需要注意的,使用 fput 和 fgetc 函数达到重定向 C 语言标准库输入输出函数必须在 MDK 的工程选项把“Use MicroLIB”勾选上,MicoroLIB 是缺省 C 库的备选库,它对标准 C 库进行了高度优化使代码更少,占用更少资源。为使用 printf、scanf 函数需要在文件中包含 stdio.h 头文件


代码如下:


/*重定向c库函数printf到串口,重定向后可使用printf函数*/

int fputc(int ch, FILE *f)

{

/* 发送一个字节数据到串口 */

USART_SendData(DEBUG_USARTx, (uint8_t) ch);

//DEBUG_USARTx改成你想用的USART端口

/* 等待发送完毕 */

while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);

//DEBUG_USARTx改成你想用的USART端口

return (ch);

}


///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数

int fgetc(FILE *f)

{

/* 等待串口输入数据 */

while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

//DEBUG_USARTx改成你想用的USART端口

return (int)USART_ReceiveData(DEBUG_USARTx);

//DEBUG_USARTx改成你想用的USART端口

}


如果你用的是STM32的固件库,应该可以直接复制粘贴,只需要改DEBUG_USARTx即可。如果你是其他的,呢么你只要把这两段代码里的发送和接受函数,换成你自己的函数即可。


当然,有的小伙伴会发现,自己在重定向的时候可能会出错,达不到预期的效果。(排除你重定向函数写错的可能)


首先,记得包含头文件 #include


其次,如果你用的是 KEIL,你还需要设置一个东西


点击这个魔术棒,进入到设置页面

在这里插入图片描述

然后点击使用Use MicroLIB

在这里插入图片描述

一般注意这两点的话,就可以成功的实现重定向

关键字:STM32  重定向  getchar  函数  串口 引用地址:STM32:重定向 prinft 和 getchar 函数,但是使用过程串口出现问题

上一篇:STM32笔记 (九)串口通讯USART(串口发送接收编程)
下一篇:STM32重定向C库printf/scanf

推荐阅读

Vicor 应用工程总监 Paul Yeaman 将讨论与传统电源转换器设计相比,高级电源架构及创新封装为混合动力车、纯电动车以及自动驾驶汽车带来的优势。2018 汽车 48V 电源及电气化系统论坛将于 10 月 17 日至 18 日在德国柏林举行,论坛将专注于旨在提高汽车性能、成本效益和燃油经济性的 48V 配电。关于 Vicor 公司公司总部位于马萨诸塞州安多...
提供业界领先低功耗视频处理解决方案的领先供应商——Pixelworks, Inc.宣布,其近日推出的TrueCut运动调控软件工具荣获了2019年先进影像协会的娱乐技术卢米埃尔奖。该款工具是Pixelworks公司今年早些时候发布的用于电影运动及HDR的TrueCut视频平台的关键组成部分。 TrueCut平台是业界首个帮助电影制作人针对内容的运动模糊、抖动及帧率外观进行电影级微调...
NVIDIA发布重磅应用、系统以及与宝马集团合作 NVIDIA提出了下一代计算的愿景,该愿景将全球信息经济的重心从服务器转移到了新型的强大且灵活的数据。 NVIDIA创始人兼首席执行官在其加州住宅的厨房中录制的六集同时发布的主题演讲中,介绍了NVIDIA最近对Mellanox的收购,还有重盼所归的基于NVIDIA Ampere 架构的新产品以及重要的最新软件技术。 这场...
广告摘要声明广告近期,世界经济论坛公布了2021年最新一批“灯塔工厂”名单,全球有21家“灯塔工厂”入选,其中10家在中国。而中信戴卡秦皇岛铝车轮工厂成为了河北省唯一入选的企业,也是全球汽车轮毂行业首家入选企业。中信集团董事长朱鹤新在9月29日全球灯塔工厂网络年会上的发言中表示,数字化发展正在重构经济竞争新格局、产业演进新模式和企业发展新...

史海拾趣

问答坊 | AI 解惑

在杭州的同行谁有s3c2450的开发板,借用一下

在杭州的同行谁有S3C2450的开发板,12M 晶振, 64M DDR2 内存的板子,我想借用下测试下代码。我现在的板子DDR2内存没有工作,我用Samsung WinCE NBoot 和 测试代码的配置初始化DDR2都不能正常工作,我想确认下是代码问题还是硬件问题。大家交个朋友 ...…

查看全部问答∨

2.6.28内核创建设备节点问题

小弟使用2.6.28内核因为用了新的创建设备节点方式。其中调用了class_device_create函数,并且引用了linux/device.h 但是在编译时却提示class_device_create为隐士声明! 请帮助小弟。…

查看全部问答∨

编译Error 请指教

FATUTIL_COMPONENTS=fatutil_ui fatutil_main exfatutil GWE1_COMPONENTS=wmbase gweshare gwesmain immthunk msgque GSetWinLong CePtr foregnd idle kbdui uibase msgbeep audio GWE2_COMPONENTS=mgbase mgbitmap mgblt mgblt2 mgdc mgdibsec m ...…

查看全部问答∨

请问嵌入式Linux是怎么回事?

   我想转投嵌入式Linux系统开发,可是不知道嵌入式Linux是在Linux下用C/C++开发,还是用Linux本身的语法在Shell中开发?另外如果是用C/C++开发的话是用C开发的多还是用C++多?我有一点C和C++的基础,但是不多,不知道这两个语言在Linux ...…

查看全部问答∨

台湾中山大学ASIC实验室综合脚本教程

台湾中山大学ASIC实验室综合脚本教程   …

查看全部问答∨

监测客车所载人数用什么传感器比较好?

如题:监测客车所载人数用什么传感器比较好?…

查看全部问答∨

ADC12的通道选择问题!

我设置的都是一通道都行但是我设置其它通道就不行了,这个是为啥子啊! 例如我设置的是P6SEL=0x01;//AD0通道 那么我设置P6SEL=0x02;//AD1通道啊。 咋个我设置了P6.0依然还是在采集数据,我现在想的就是用其它端口采集数据!…

查看全部问答∨

对C语言的理解

对C语言的理解:一个系统里面有一些函数;一个函数里面有一些语句;一个语句里面有一些变量;一个变量里面有一些数值;仅此而已…

查看全部问答∨

MSP430F5525 源代码

#include \"msp430f5525.h\"   #define READBIT(y,x)  (x & (y))     if(!READBIT(STAT_F_DELAY_AFTER_RESET_IN,usSTATUS_FLAGS))   我在看一个程序,但看到IF这里就看不懂了。请问下是怎么回事 这里的usS ...…

查看全部问答∨

MSP430程序升级方式探讨

 对MSP430系列单片机进行编程的方式有以下3种:利用JTAG接口,利用BSL固件和利用用户自定义的升级固件。由于利用自定义升级固件进行程序升级的方式比较灵活,且用途广泛,因此本文将对其作重点介绍。   1 利用JTAG接口   MSP430系列 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved