你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的重定向printf和getchar的经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-18 16:33
在STM32测试串口的时候经常需要在开发板和上位机之间传输数据,我们可以用c语言中的printf()函数和getchar()函数来简化传输。
6 ?9 J% K' F: c5 ~3 p
. B% e! v: t5 ~5 v以printf()为例:
( p$ `+ [9 @3 n8 m9 O# p( p3 g0 Gprintf()函数实际上是一个宏,最终调用的是 fputc(int ch,FILE *f)这个函数来执行输出的,所以我们需要修改这个函数,使函数向串口输出,这样当再次引用printf()函数时,printf()就是通过串口向上位机发送数据的一个函数了。
! C6 ^# H3 o: z) y+ [% k; _% l那么如何修改printf()呢?加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。
& [3 F9 X' L5 ]7 }3 E5 B/ B修改fputc函数如示:1 ^5 n- i# I" o8 c
  1. /* 重定向printf函数 */( D4 L& s8 I/ e( T( f% J" [
  2. int fputc(int ch, FILE *f)9 i4 a+ f  m( I# i7 x
  3. {
    , V# J9 R5 h( S, N+ p3 U! p' B6 F
  4.         USART_SendData( DEBUG_USARTx,  (uint8_t) ch);* y: j/ v! j% f1 Y6 s
  5.         /* 等待发送完毕 */' S0 {8 A2 {4 |5 R" v6 ^3 o4 E
  6.         while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
    ; m2 R3 g: `- y. K
  7.         return ch;
    7 F8 G4 }! I+ l" {. J% w: a7 j
  8. }, G7 E& }9 q8 U& E3 Q

  9. & }5 O" D% k  }( a7 E  b
复制代码
/ D: B1 ^9 q- S7 S
修改完成后需要勾选Target设置中的Use Micro LIB选项,MicroLib提供了一个有限的stdio子系统,所以还要再头文件中包含#include <stdio,h>
- @! P8 A% _  _, v5 ~4 D/ K# v2 T. V; w( f0 w4 q7 L
20190730170540530.png
- e' F# v" a4 M  m2 J8 L- L- O; N5 Z, y0 x; J9 h

& M3 j9 x. H2 b' I! r3 Agetchar()函数也是如此:4 }6 j8 i7 q0 u2 S: N1 K+ E; G6 d0 V* G
  1. /* 重定向scanf函数 */8 q7 o/ U' _9 |) o

  2. - S  }" X4 N8 R3 ?2 M% `- D5 I
  3. int getc(FILE *f)6 m# r% R& R& h* o: D* n7 q+ ]
  4. {
    * Z5 r3 r% O) r  j
  5.         /* 等待串口输入数据 */- ]# K6 B# V1 W% C& k6 W; J6 L
  6.         /* 有了这个等待就不需要在中断中进行了 */# O7 M% T# c; L: J
  7.         while(USART_GetFlagStatus(DEBUG_USARTx , USART_FLAG_RXNE)==RESET);* A, {. P0 c* A9 P9 X9 F$ b) k8 T+ s
  8.         /* 返回值进行强制类型转换 */& b3 u9 R7 V- [8 y" s3 p
  9.         return (int)USART_ReceiveData(DEBUG_USARTx);2 q3 l3 `7 d8 @
  10. }
    % e  i4 e+ K/ J) u
复制代码
, a$ f9 z- f% d% H
————————————————
, x. |& L; x" [+ M版权声明:Aspirant-GQ
! D! @- u& j# C* Y" d, ~$ i9 S如有侵权请联系删除$ K( C: N) f3 P8 i; Q; t

& ?: Q1 j& l& b1 j( I; y) A8 e9 S" ]$ |: k
赞 收藏 评论0 发布时间:2023-3-18 16:33

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版