历史上的今天
返回首页

历史上的今天

今天是:2024年09月01日(星期日)

正在发生

2021年09月01日 | STM32—重定向printf和getchar函数到串口

2021-09-01 来源:eefocus

在STM32测试串口的时候经常需要在开发板和上位机之间传输数据,我们可以用c语言中的printf()函数和getchar()函数来简化传输。


以printf()为例:

printf()函数实际上是一个宏,最终调用的是 fputc(int ch,FILE *f)这个函数来执行输出的,所以我们需要修改这个函数,使函数向串口输出,这样当再次引用printf()函数时,printf()就是通过串口向上位机发送数据的一个函数了。


那么如何修改printf()呢?加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。


修改fputc函数如示:


/* 重定向printf函数 */

int fputc(int ch, FILE *f)

{

USART_SendData( DEBUG_USARTx,  (uint8_t) ch);

/* 等待发送完毕 */

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

return ch;

}


修改完成后需要勾选Target设置中的Use Micro LIB选项,MicroLib提供了一个有限的stdio子系统,所以还要再头文件中包含#include

在这里插入图片描述

getchar()函数也是如此:


/* 重定向scanf函数 */


int getc(FILE *f)

{

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

/* 有了这个等待就不需要在中断中进行了 */

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

/* 返回值进行强制类型转换 */

return (int)USART_ReceiveData(DEBUG_USARTx);

}


推荐阅读

史海拾趣

依必安派特(ebmpapst)公司的发展小趣事

1996年,依必安派特在上海外高桥保税区设立了其在中国的首个据点——依必安派特风机(上海)有限公司。最初,它仅作为销售为主的贸易公司,为中国市场提供德国制造的风机和电机产品。然而,随着中国市场的快速增长和需求的不断变化,依必安派特意识到仅仅作为贸易公司已无法满足市场需求。于是,在2000年,依必安派特电气(上海)有限公司正式成立,开始在上海本地生产风机和电机,标志着依必安派特从贸易到制造的转变。

Hayashi Denko Co Ltd公司的发展小趣事

为了进一步满足中国市场的本地化需求,依必安派特在2005年成立了依必安派特电机(上海)有限公司,开始了国产化进程。这一举措不仅提高了产品的性价比,还缩短了交货周期,使得依必安派特在中国市场的竞争力得到了显著提升。随着国产化产品的快速增长,依必安派特在中国的前十年市场业绩突飞猛进,为后续的飞跃发展打下了坚实基础。

国产公司的发展小趣事
如电阻的热噪声、晶体管的散粒噪声等。选择低噪声的元器件可以在一定程度上抑制噪声。
Global Connector Technology公司的发展小趣事
安装位置不正确或连接线路错误,导致继电器无法正常检测到断相故障。
Ericsson公司的发展小趣事

随着通信技术的不断发展和市场竞争的加剧,Ericsson也面临着前所未有的挑战。为了应对这些挑战,Ericsson积极进行转型升级。一方面,公司加大了对研发的投入力度,不断推出具有创新性和竞争力的产品和服务;另一方面,Ericsson也通过收购、兼并等方式拓展业务领域和市场份额。此外,公司还注重与合作伙伴建立紧密的合作关系共同推动行业发展。

ACCRETECH公司的发展小趣事

Ericsson非常重视人才培养和团队建设。公司设立了专门的培训机构为员工提供全面的培训和发展机会帮助他们不断更新知识和技能以适应快速变化的市场环境。此外Ericsson还注重营造积极向上的企业文化鼓励员工创新创造和发挥潜力为公司的发展贡献自己的力量。这种注重人才培养和团队建设的策略也为Ericsson的长期发展提供了有力保障。

问答坊 | AI 解惑

用于汽车防盗器的低功耗无匙进入加密收发器技术

本文分析了不断变化的汽车盗窃手段,以及相应的汽车防盗技术的发展,重点介绍了TI最新的汽车防盗解决方案—DST+收发器的加密技术及系统组成,并阐述了与之兼容的新一代射频识别(RFID)技术方案—三维天线模拟前端芯片实现无匙进入的工作原理。 由 ...…

查看全部问答>

怎样利用MCS51单片机和PTR8000实现无线传输和发送

如题!谢谢大侠们…… 经过几天的努力,我的无线通信的硬件模块已经调试通过了!谢谢大家的帮助! [ 本帖最后由 zhangzhe0124 于 2009-5-19 10:06 编辑 ]…

查看全部问答>

功率测量模块的设计与实现

功率测量模块的设计与实现           (功率测量模块的硬件设计与实现) 要求:以单片机为核心设计一可测量8路功率(1Kw以内)的模块。在该模块中将测量结果用LCD显示,并通过串行接口传送到上位计算机中。请查阅 ...…

查看全部问答>

WinCE的Notification怎么搞啊?

RT. 好像CE 6里面有那个API,请问该怎么弄啊?…

查看全部问答>

WINCE开机自动运行应用程序问题

我按照如下的方法想做一个开机自运行我的应用程序(MyApp.exe),可怎么也不成功.开机后LCD没有显示(黑屏),我查了下WINDOWS目录,其目录下根本没有MyApp.exe.也就是说我的应用程序(MyApp.exe)没有打包进nk.   1. 假定Windows CE.NET目标工程 ...…

查看全部问答>

PXA270关于CF host口的驱动

开发板处理器是PXA270的,现在想在板子上装一个CF无线网卡(NETGEAR MA701),因为板子是自己做的,所以需要修改一下pcmcia的接口驱动。 我是在drivers/pcmcia/pxa2xx_mainstone.c基础上修改的。 现在问题: 1.CF卡在开放板启动起来以后,CF卡上 ...…

查看全部问答>

i2c读写操作时序

i2c协议中提到有三种可能的传输方式 1 主机(发送器)发送到从机(接收器),传输的方向不会改变   S-->Slave Address-->R/W-->A-->Data-->NA-->P 2 在第一个字节后,主机立即读从机。在第一次响应时,主机(发送器)变成主机(接收器), ...…

查看全部问答>

请教问题:error: linking files for incompatible targets ??

本帖最后由 dontium 于 2015-1-23 12:43 编辑 我自己建了个工程,单个文件编译可以通过,但是链接后就出现: [Linking...] \\"d:\\\\ti\\\\c5500\\\\cgtools\\\\bin\\\\cl55\\" -@\\"Debug.lkf\\" >>   error: linking fi ...…

查看全部问答>

SCI中断老是进不去

今天做了一上午发现SCI的中断程序怎么也进不去,最后解决是重新翻看了TI的SCI模块手册,发现自己有一个使能位没有做,导致无法识别。 在此记下,也许有人会跟我一样傻 RXFFIENA Receive FIFO interrupt enable0 RX FIFO interrupt based on RXFF ...…

查看全部问答>

开工第一件事情就是管理层统一更换为智能手机

今年过年就是不停的玩智能手机,自己手上的iPhone 3G,Google的Nexus和三星的P1010,感觉确实不错,并且开通了微博,包括新浪和腾讯的,不仅仅获取了更多的信息,也推广了公司的信息,尤其是经常用它看看书,把零碎的时间都用起来了。回公司发现 ...…

查看全部问答>