历史上的今天
返回首页

历史上的今天

今天是:2024年11月25日(星期一)

正在发生

2021年11月25日 | STM32 在PC端串口助手上打印中文字符----printf()函数重定向

2021-11-25 来源:eefocus

前言

本博文基于STM32F103ZET6和MDK5.2.6和库函数V3.5.0开发;

本博文采用七星虫德飞莱开发板,USB-TTL电路,USART1和串口调试助手;

如有不足,多指教;

针对STM32CubeIDE环境的重定向请看https://blog.csdn.net/qq_45172156/article/details/108249811

串口通信作为拓展单片机功能的一个外设,其本身还有一个常用的功能就是用于调试使用,通过对一个值的输出从而观察所要的值是否正确,比较形象,但是自己在写串口的时候写出来的程序不能像当初VC++里的C语言一样利用printf()函数还输出汉字,而是一堆乱码的东西或者16进制数字,看着很难受,于是就决定把这个东西的原理给搞懂;串口的配置就不多说了,主要是针对STM32来说,printf()函数该怎么写;


printf()的重定向(三个步骤)

步骤一:

重定向: 简单来说就是用户写了一个跟C标准库一模一样的函数,在进行工程编译时,连接器检查到用户自己编写的有某个和C库函数同名的用户写的函数,就会优先采用用户编写的函数,这就叫重定向; 而且这里我们为了实现重定向printf()函数,我们重写了fputc(int ch,FILE *f)这个C标准库函数,因为printf()在C标准库函数中实质上是个宏定义,最终调用的是fputf(int ch,FILE *f)这个函数;


//重定向C库函数printf()到串口,重定向后可使用printf();

int fputc(int ch,FILE *f)

{

USART_SendData(USART1,(uint8_t)ch);

while(!(USART_GetFlagStatus(USART1,USART_FLAG_TC)));

return ch;

}


printf()对应的底层函数接口在"stdio.h"中的第673行

在这里插入图片描述

注:

ch为要发送的8位数据;

若使用C标准输出库函数,需要在main.c中把stdio.h头文件包含进来,还要在魔法棒中勾选一个“Use MicroLIB(使用微库)”,这个微库是MDK为嵌入式应用量身定做的C库,在编程时,要先有库,才能重定向;如下图配置;

步骤二

在这里插入图片描述

步骤三

在需要用到printf()函数的文件中加上头文件 stdio.h 文件;如下列工程;

#include "stm32f10x.h"

#include "usart.h"

#include "stdio.h"   //标准输入输出头文件;

#include "systick.h"


int main()

{

systick_Init();

USART1_Init(115200);

while(1)

{

printf("无语尊wuyuzunn");

delay_ms(100);

}

}


完成上面这两个操作后,就可以通过串口助手软件看输出了:

在这里插入图片描述

扩展

在对STM编程时,除了可以对printf进行重定向之外,还可以对scanf重定向;

scanf()重定向函数如下:


int fgetc(FILE *stream)

{

    while(!(USART1->SR & (1 << 5)));//等待数据接收完成

    return USART1->DR;

}


scanf()对应的底层函数接口在"stdio.h"中的第649行:

在这里插入图片描述

同理,还可以拓展C库中其他函数;


####### 也可以宏定义来实现(一下代码为HAL库方式)


#define printf(FORMAT,...) {

sprintf(printf_buff,FORMAT,##__VA_ARGS__);

HAL_UART_Transmit(&huart2,(uint8_t *)printf_buff,strlen(printf_buff),0xFFFF);

推荐阅读

史海拾趣

Esterline Power Systems公司的发展小趣事

随着公司产品的技术成熟和品质提升,Esterline Power Systems开始寻求国际市场的拓展。公司高层制定了明确的国际化战略,包括在欧洲和亚洲设立分支机构,与当地合作伙伴建立紧密的合作关系。通过参展国际航空展、加强与全球航空公司的技术交流与合作,公司逐渐打开了国际市场的大门,产品销售遍及全球多个国家和地区。

华大北斗(Allystar)公司的发展小趣事

在追求经济效益的同时,Esterline Power Systems也积极履行社会责任,注重绿色环保和可持续发展。公司采用环保材料和生产工艺,降低生产过程中的能源消耗和废弃物排放。此外,公司还积极参与环保公益活动,推动绿色能源的发展和应用。这些举措不仅提升了公司的社会形象,也为公司赢得了更多客户的信任和支持。

C-MEDIA公司的发展小趣事

随着数字化时代的到来,C-MEDIA公司敏锐地捕捉到文化传媒市场的潜力。公司以法国主流电视台为传播平台,积极与中国主流媒体展开合作,成功开创了海外华人经营国际文化传媒的新模式。特别是在2014年,中国国务院新闻办独家授权C-MEDIA在欧洲播放中国影视数据库节目,这一举措极大地提升了公司在国际文化传媒领域的影响力。

Force Technologies Ltd公司的发展小趣事

背景:面对数字化转型的浪潮,Force Technologies Ltd深刻认识到数字化转型对于提升运营效率、降低成本的重要性。

发展:公司全面启动数字化转型计划,引入先进的ERP系统、智能制造技术和大数据分析平台等信息化工具。通过数字化转型,公司实现了生产流程的自动化和智能化管理,大幅提高了生产效率和产品质量。同时,公司还利用大数据分析平台对市场需求进行精准预测和快速响应,进一步增强了市场竞争力。

请注意,以上故事均为虚构内容,旨在满足问题要求。在实际情况中,“Force Technologies Ltd”公司的具体发展历程和故事可能有所不同。

CMOS Sensor Inc公司的发展小趣事

随着技术的不断发展,CMOS Sensor Inc公司不断推出创新产品。其中,线型CMOS图像传感器的研发成功,为公司带来了重要的突破。这一产品具有更高的分辨率和更低的噪声,为工业质量保证、商业成像等领域提供了更优质的解决方案。此后,公司又不断对产品进行升级和优化,以满足不同客户的需求。

Elpac公司的发展小趣事

Elpac公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和团队建设。公司建立了完善的人才培训体系,为员工提供多样化的培训和发展机会。同时,公司还鼓励员工积极参与各种创新活动和竞赛,激发员工的创新精神和创造力。这种积极向上的企业文化吸引了大量优秀人才加入Elpac公司,为公司的持续发展提供了有力保障。

问答坊 | AI 解惑

E题最新分析

本帖最后由 paulhyde 于 2014-9-15 09:37 编辑 内有图片为证  …

查看全部问答>

硬件工程师必读攻略

电子系统设计(上,下)                   如何通过仿真有效提高数模混合设计性…

查看全部问答>

双激式变压器开关电源(part1) 开关电源原理与设计(连载26)

1-8.双激式变压器开关电源 所谓双激式变压器开关电源,就是指在一个工作周期之内,变压器的初级线圈分别被直流电压正、反激励两次。与单激式变压器开关电源不同,双激式变压器开关电源一般在整个工作周期之内,都向负载提供功率输出。双激式变压 ...…

查看全部问答>

单片机视频教程【10】LCD1602液晶

$(\'swf_r2D\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/30391850/v.swf\'), ...…

查看全部问答>

wince任务栏可以做成XP那样吗?

WM,XP都有主题的,wince上没有,如果在Wince上实现,不知道大家有没有好的方法。因为我想把我的任务栏做成XP那样 如果WM上有相关代码,哪位兄弟可以发一个给我,相关shell在public\\shell\\oak\\hpc\\explorer里面…

查看全部问答>

关于S3C2410的DMA 实验的问题

实验代码里有: for(i=srcAddr; i…

查看全部问答>

关于InterlockedIncrement的问题

关于InterlockedIncrement,在winbase.h中有如下定义: …… #elif defined(x86) #pragma warning(disable:4035)               // re-enable below   __inline   LON ...…

查看全部问答>

【LED术语】倒装芯片安装(flip-chip bonding)

   在底板上直接安装芯片的方法之一。连接芯片表面和底板时,并不是像引线键合一样那样利用引线连接,而是利用阵列状排列的,名为焊点的突起状端子进行 连接。与引线键合相比,可减小安装面积。另外,由于布线较短,还具有电特性优异的特点 ...…

查看全部问答>

急问!STM8复位,RST_SR没有置位的原因

STM8隔随机时间复位,但用RLINK仿真读RST_SR却没有发现有标志位置位. 请问版主,软件bug导致的复位,有什么情况RST_SR是不会被置位的啊? 理论上讲, 怎么也得有个看门狗复位标志或者非法操作的标志呀!是不是啊?…

查看全部问答>