历史上的今天
返回首页

历史上的今天

今天是:2025年06月10日(星期二)

正在发生

2018年06月10日 | 在STM32中使用printf发送字符串到串口

2018-06-10 来源:eefocus

问题:在使用STM32调试时,经常使用串口发送信息,为了方便调试与串口发送信息,用printf()函数实现通过串口打印信息。


方法一:


1.添加包含printf()函数的头文件:#include “stdio.h” 

2.重写 stdio.h 头文件中的 int fputc(int ch, FILE *f) 函数


int fputc(int ch, FILE *f)

{

    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

    //等待先前的字符发送完成

    USART_SendData(USART1, (uint8_t) ch);

    //发送字符

    return ch;

}

//示例函数中使用了USART1来发送消息

//实际情况可以根据硬件板来决定使用哪个串口


注意:使用while循环先等待先前的字符发送完成,避免造成字符串首字符发送丢失的问题。 

3.将该函数” int fputc(int ch, FILE *f) “放在main()函数能够调用到的文件中,KEIL->Options for Target’xxx’->Target->Code Generation,勾选Use MicroLIB


方法二:


//加入以下代码,支持printf函数,而不需要选择use MicroLIB    

#if USART_DEBUG

#pragma import(__use_no_semihosting)             

//标准库需要的支持函数                 

struct __FILE 

{

    int handle; 


};


FILE __stdout;       

//定义_sys_exit()以避免使用半主机模式    

_sys_exit(int x) 

{

    x = x; 

}

//重定义fputc函数 

int fputc(int ch, FILE *f)

{      

    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)

    {}

    USART_SendData(USART1,(uint8_t)ch); 

    return ch;

}

#endif 


使用以上任一方法,均可实现printf()函数打印字符串重定义到USART1。


推荐阅读

史海拾趣

ebm-papst公司的发展小趣事

在巩固欧洲市场的基础上,ebm-papst不断拓展全球市场,特别是亚洲市场。近年来,公司在亚洲市场的营收增长率一直保持在较高水平。为了进一步拓展亚洲市场,ebm-papst加大了在中国的产能建设,陆续在上海、西安等地进行扩建和新建产能。这些措施使得ebm-papst能够更好地满足亚洲市场的需求,并为其在全球市场的进一步发展奠定了坚实基础。

芯源半导体(CW)公司的发展小趣事

随着市场竞争的加剧,芯源半导体(CW)公司意识到品质管理的重要性。公司加强了对原材料采购、生产过程和产品质量控制的管理,建立了完善的质量管理体系。同时,公司还引入了先进的检测设备和技术手段,以确保产品的稳定性和可靠性。这些措施使芯源半导体(CW)公司的产品质量得到了显著提升,赢得了客户的信任和好评。

Hirect公司的发展小趣事
确认输入电源是否正常,包括电压、电流和频率等参数是否符合要求。
BOCA公司的发展小趣事

BOCA公司最初是一家小型电子元件制造商,面临着激烈的市场竞争。然而,公司始终坚持研发创新,投入大量资源于新技术的研究。终于,在一次偶然的实验中,BOCA的研发团队成功开发出了一种新型的半导体材料,这种材料在性能上远超当时的行业标准。这一技术突破让BOCA迅速在行业中崭露头角,订单量激增,公司规模迅速扩大。

Chiefdom Electronic Co Ltd公司的发展小趣事

在市场竞争日益激烈的情况下,Chiefdom Electronic Co Ltd注重创新营销策略,以吸引更多消费者的关注。公司推出了一系列具有针对性的广告宣传活动,利用社交媒体、网络直播等新媒体渠道进行广泛传播。同时,公司还积极参与各类电子展会和论坛,展示其最新技术和产品,与潜在客户建立联系。这些创新营销策略使得公司的品牌知名度和美誉度不断提升,进而带动了销售业绩的稳步增长。

Fastron公司的发展小趣事

Fastron公司一直将技术创新作为企业发展的核心动力。自创立以来,公司不断投入研发资源,致力于电感器技术的创新。Fastron生产的符合RoHS标准的高质量电感器和线圈,如AEC-Q200级产品,得到了市场的广泛认可。这些产品不仅具有高性能和长寿命,还能满足客户多样化的需求。

问答坊 | AI 解惑

JZC-23F继电器

还有一个问题:这个继电器的用什么样的三极管来带动?上面有“10A/28VDC,5A/220VAC,DC5V“字样,怎样解释?它对吸合电流又没有要求?…

查看全部问答>

RS232 起始位 停止位 校验位 需要自己实现吗?

ModBus帧格式为:从机地址(1字节),功能码(1字节),起始地址(2字节),数据长度(2字节),CRC码(2字节) 然后数据传输方式规定为串行异步:1位起始位,8位数据位,1偶校验位,1位停止位。 我的疑问是: 1)CRC只对数据位进行校验,那就是 ...…

查看全部问答>

S3C44B0X板配什么LCD好?学习用的,价格一般

麻烦大家推荐一下,要是有卖的话直接卖给我吧,免得我东找西找,好辛苦~…

查看全部问答>

【求助】eVB读写文件时“语句未结束”?

源代码如下: Private Sub Form_Load()    Dim word, meaning As String        Open \"words.dat\" For Input Access Read As #1    Do While Not EOF(1)      Input #1, word ...…

查看全部问答>

【求助】有关无线通讯(实在没办法了)

我已经从21号弄到现在了,本来年前想弄一点效果出来,但这几天一直试却实在调不通,所以只好向大家求助了。 我计划做两块电路板之间的无线通讯,用的是149,通讯模块是prt2000。 电路版已做好,板内控制灯等元件都是灵的,但是两块板之间的控一直 ...…

查看全部问答>

I2C的从地址问题

我用的是F4152的单片机 我的I2C器件的从地址是0xa0, 把0xa0写到 UCB0I2CSA 寄存器里了 在发送从地址后I2C器件就是接收不到。 后来用示波器看了波形之后,发现发送的从地址不是0xa0. 是00100000,第八位就是发不出来 为什么啊?…

查看全部问答>

关于CAN模块远程帧应该如何配置

CAN模块远程帧应该如何配置,网上有人说有配置成接收,到底具体配置应该如何操作?…

查看全部问答>

28335 CAN时钟频率以及波特率问题?

这段是复制例程中的,感觉不太对啊,求大家指教。记得书上写的是:SYSCLKOUT 是CAN 模块系统的时钟频率,与CPU 的时钟频率一样,那么对于150 MHz SYSCLKOUT ,CAN 模块系统的时钟频率也应该为150 MHz,那么下面这段的CAN clock是什么意思?又是如何 ...…

查看全部问答>

学模拟+PSRR和电源的关系

本帖最后由 dontium 于 2015-1-23 11:39 编辑 放大器具有高 PSRR,就不需担心电源变化? 链接deyisupport./blog/b/signalchain/archive/2013/12/16/psrr.aspx 本人模拟新手,看了这篇文章了解了PSRR和电源的关系,重点了解了规格书中写的DC PS是R ...…

查看全部问答>