0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

TI Driverlib 标准输出完整重定向的改进方案

Felix恺 来源:jf_58031680 作者:jf_58031680 2025-11-11 00:33 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

MCU:MSPM0G3507

前段时间在课内做实验的时候碰到了比较丰富的交互需求,遂打开UART#include "stdio.h",然后开始重定向。虽然网上有广为流传的重定向方案,但是常年玩STM32的我有点迷惑:为什么TI Driverlib的重定向需要定义三个函数呢?

Trial

按照 STM32 重定向的方法,先对fputc进行重定向:

int fputc(int _c, FILE *_fp) {
    while((UART0 - > STAT & UART_STAT_TXFF_MASK));
    UART0 - > TXDATA = _c;
    return _c;
}

观察到,在这种重定向的方案下,printf函数可以输出常字符串,但是无法进行变量的格式化输出。

根据网络上的方案,补充fputsputs函数,稍作修改:

int fputs(const char *restrict s, FILE *restrict stream) {
    uint16_t i, len;
    len = strlen(s);
    for (i = 0; i < len; i++) {
        fputc(s[i], stream);
    }
    return len;
}

int puts(const char *s) {
    int count = fputs(s, stdout);
    count += fputs("n", stdout);
    return count;
}

在这种重定向方法下,printf成功实现了完整的重定向,可以进行变量的格式化输出——但是,sprintf依然无法工作,为什么呢?

观察三个函数的输入参数,其中两个都包含了一个FILE*输入变量,但是我们在使用的时候却完全没用到。找到FILE的定义:

struct __sFILE {
    int fd;                    /* File descriptor */
    unsigned char* buf;        /* Pointer to start of buffer */
    unsigned char* pos;        /* Position in buffer */
    unsigned char* bufend;     /* Pointer to end of buffer */
    unsigned char* buff_stop;  /* Pointer to last read char in buffer */
    unsigned int   flags;      /* File status flags (see below) */
};

typedef struct __sFILE FILE;

可见,在TI的库中, FILE类型并没有被简单地改为简单的存储指针,而是依然保留了“数据流”的形式 。再结合debug中端点的触发情况,以及函数之间的调用关系,尝试对FILE*指针进行写入。若调用了puts,认为上层的标准输出走的是printf(),就向下传递空指针,将输出导向 UART。如果stream不是自己设定的空指针,就去编辑stream指向的缓冲区。

Result

对重定向的三个函数进行如下修改:

int fputc(int _c, FILE *_fp) {
    if(!(_fp)) {
        while((UART0 - > STAT & UART_STAT_TXFF_MASK));
        UART0 - > TXDATA = _c;
    }
    else
        *(_fp- >pos) = _c;
    return _c;
}

int fputs(const char* restrict s, FILE* restrict stream) {
    uint16_t i, len;
    len = strlen(s);
    for(unsigned int i=0; i < len; i++) {
        fputc(s[i], stream);
        if(stream) stream- >pos++;
    }
    return len;
}

int puts(const char *_ptr) {
    int count = fputs(_ptr,NULL);
    count += fputs("n",NULL);
    return count;
}

重定向成功,sprintfprintf均可以正常工作!

More…

那个结构体我还没用完,估计在重定向输入流的时候会用到更多的元素。但是知道这些已经足够了,可以搞点花招,比如把UARTx → TXDATA直接丢到stream里面去,当然FIFO只有一个入口,不需要地址偏移,这么看也是有点麻烦;或者直接把自己的指定buffer设为默认输出区域,等等,虽然更复杂了,但是相对于仅仅把FILE作为一个独立指针,还是更加灵活有趣的!

实力尚浅,还请多多指教!

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • uart
    +关注

    关注

    22

    文章

    1304

    浏览量

    106118
  • DriverLib
    +关注

    关注

    0

    文章

    3

    浏览量

    2058
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    跌落试验的核心:解析自由跌落、定向跌落等主要测试模式的区别

    从模拟随机意外的自由跌落到精准打击的定向跌落,每一种测试模式都是通往更高产品可靠性道路上不可或缺的一环。北京沃华慧通测控技术有限公司提供的不仅是一台冰冷的设备,更是一套完整的、可靠的测试解决方案
    的头像 发表于 11-17 08:00 942次阅读
    跌落试验的核心:解析自由跌落、<b class='flag-5'>定向</b>跌落等主要测试模式的区别

    UART在5.2.0版本E2S中的重定向

    随着FSP库版本更新到5.2.0,在开发过程中就会发现4.0.0版本的串口重定义并不适用于最新版本。继续使用原来的重定向代码时,编译器就会报错。根据报错的信息发现,缺少了几个函数的定义,这里补全定义即可。
    的头像 发表于 10-31 15:28 3748次阅读
    UART在5.2.0版本E2S中的<b class='flag-5'>重定向</b>

    【RA4E2开发板评测】FSP5.2之后的串口重定向问题解决方法

    _read(int fd, char *pBuffer, int size); /* 重定向 printf 输出 */ int _write(int fd, char *pBuffer, int
    发表于 08-29 07:02

    LWH12060YAH国产电源模块完美替代TI PTH12060YAH方案

    在电子元器件国产化替代浪潮下,Leadway推出的LWH12060YAH电源模块以其优异的性能参数和完全兼容的封装设计,成为TI PTH12060YAH的理想替代方案。关键参数对比指标
    发表于 08-28 09:23

    【RA-Eco-RA6M4开发板评测】移植xprintf实现标准输入输出

    代码 一. 前言前面我们实现了串口收发,为了方便调试 ,我们继续移植xprintf实现标准输入输出。虽说也可以重定向编译器使用的标准库的_read,_write等接口,但是移植xpr
    发表于 07-19 22:37

    20205新疆国际煤博会:矿用寻北仪提供高可靠定向解决方案

    2025新疆国际煤炭工业博览会的收官之日,我们的MEMS寻北仪与定向短节受到一致好评,专为复杂工业场景打造,尤其适用于煤炭井下定向掘进、钻探轨迹控制等关键环节,重新定义寻北技术标准
    的头像 发表于 07-18 15:43 440次阅读
    20205新疆国际煤博会:矿用寻北仪提供高可靠<b class='flag-5'>定向</b>解决<b class='flag-5'>方案</b>

    MEMS定向短节在HDD中如何精准定向

    MEMS定向短节以自寻北原理、最新MEMS陀螺技术和捷联惯导技术为复杂环境定向钻孔提供了可靠的解决方案,保证测量和输出精度。 用于定向钻孔/
    的头像 发表于 07-08 14:46 384次阅读

    为什么MEMS定向短节能引领钻探未来

    在采矿设备、定向钻孔、地质钻探等领域,精准的定向测量技术是保障作业效率与安全的核心。ER-MNS-09 MEMS定向短节凭借最新MEMS陀螺技术,以紧凑、可靠、高性能的设计,成为复杂环境下定向
    的头像 发表于 06-03 17:28 417次阅读
    为什么MEMS<b class='flag-5'>定向</b>短节能引领钻探未来

    101040010\\101040010K定向耦合器KRYTAR

    \\101040010K定向耦合器配有符合行业标准的2.4\\2.92mm母连接器。紧凑型包装尺寸仅为2.0英寸(长)x 0.40英寸(宽)x 0.65英寸(高),重量仅为1.3盎司。工作温度为-54°至+85
    发表于 04-16 09:19

    【瑞萨RA2L1入门学习】+Uasrt输出

    ,这是因为MCU使用的串口是TTL串口,而PC使用USB串口。 3.新建工程配置属性 重定向printf输出到串口 需要添加一段代码来将 printf 输出重定向到串口UAR
    发表于 03-31 13:47

    STM32CubeIDE STM32H743XIH6串口无法重定向,且发送内容波特率不对乱码怎么解决?

    STM32CubeIDE重定向无效果,且使用HAL_UART_Transmit(&huart1, (uint8_t *)\"0123rn\", sizeof
    发表于 03-11 06:42

    101040006/101040006K定向耦合器KRYTAR

    101040006/101040006K定向耦合器KRYTAR KRYTAR推出的101040006/101040006K定向耦合器,进一步丰富了多用途带状线设计的选项。101040006
    发表于 03-07 09:45

    恒流源输出漏电问题分析和解决方案

    这个问题是逛TI论坛时看到的一个恒流源输出漏电的问题,原帖没有给出合适的解决方案,并且这个问题比较经典,所以与各位道友一同分享我的看法和解决思路。
    的头像 发表于 03-03 09:47 1913次阅读
    恒流源<b class='flag-5'>输出</b>漏电问题分析和解决<b class='flag-5'>方案</b>

    DeepSeek获殊荣,成为ai.com重定向官网

    近日,记者发现,在浏览器中输入“ai.com”这一顶级域名时,页面将直接重定向至DeepSeek的官方网站。这一变化引起了业界的广泛关注,标志着DeepSeek在人工智能领域的地位得到了高度认可
    的头像 发表于 02-11 15:41 857次阅读

    全面掌握Linux重定向技巧:让命令行操作效率翻倍的秘密

    #1 linux输出重定向 $ command > file 2>1 这里的 ,表示重定向的目标不是一个 文件 ,而是一个 文件描述符 ,内置的文件描述符如下 1 => stdout2
    的头像 发表于 01-08 10:19 753次阅读