将 printf 与两个 UART 一起使用

2024-01-13

我已经实施了fputc and fgetc在 retarget.c 中,通过 Cortex-M3 上的 UART0 成功使用 printf。

但是,我想要第二个 UART 通道来获取额外的调试信息。我怎样才能像使用 printf 集成 UART0 一样很好地集成它?

例如,使用 fprintf 到自定义目标并签入fputc将角色发送到哪个目标.. 例如。正常输出fprintf(UART0,"..");以及调试输出fprintf(UART1,"..");

但我看不到 fopen 是否被调用为标准输出,所以我正在努力了解如何手动实现它。 (如果我只是打电话fprintf(RANDOM_VALUE,..),我不知道这会如何表现。

我想一旦我将它定向到不同的“文件”,那么只需检查 fputc 中指向的内容即可,但这是我正在努力解决的 FILE 指针的初始设置。

也许有某种方法可以区分 stdout 和 stderr,尽管我在从两个单独的通道获取输入时仍然遇到相同的问题。

fprintf 也在 microlib 中吗?如果没有,是否有更好的方法来实现这一点?

Thanks!


fputc() 接受一个流指针参数,有两个标准输出流 stdin、stdout 和 stderr。在重定向的较低级别,它们分别与文件描述符 0、1 和 2 关联,您可以使用此信息将 stderr 与设备驱动程序级别的备用 UART 关联。

然后,您可以使用 stderr 输出调试数据:

fprintf (stderr, "Error reading file" ) ;

例如。

最小重定向(特定于 Keil ARM-MDK/RealView)可能如下所示:

struct __FILE 
{
    int handle;  
};

enum 
{
    STDIN_HANDLE,
    STDOUT_HANDLE,
    STDERR_HANDLE
} ;

FILE __stdin = {STDIN_HANDLE} ;
FILE __stdout = {STDOUT_HANDLE} ;
FILE __stderr = {STDERR_HANDLE} ;

int fputc(int ch, FILE *f) 
{
    int ret = EOF ;

    switch( f->handle )
    {
        case STDOUT_HANDLE :
            // Write character to UART0
            ...
            ret = ch ;
            break ;

        case STDERR_HANDLE :
            // Write character to UART1
            ...
            ret = ch ;
            break ;

        default :
            break ;

    return ret ;
}

显然,如果需要,这也是您可以挂接文件系统的地方,在这种情况下,您的 __FILE 结构无疑会有其他成员。

如果您不想为此目的使用 stderr,则必须重新定位 fopen() 以将设备名称(例如“dbg:”)转换为所需端口的文件描述符,然后使用 stdio 输出到关联的流。

fprintf 也在 microlib 中吗?如果没有,是否有更好的方法来实现这一点?

文档会告诉你,但是是的。 Microlib stdio 支持由控制#pragma import(__use_full_stdio)指令,文档不清楚如果不使用该指令会排除什么。尝试不使用它,如果缺少任何东西就使用它。这就是说,我想 printf() 是作为 stdout 流的 fprintf() 实现的,所以如果你有 printf(),你就有 fprintf()。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 printf 与两个 UART 一起使用 的相关文章

随机推荐

  • 为什么无法从 Excel 互操作中设置强制转换对象?

    尝试获取对工作表的引用 使用 Excel 互操作 Excel Application xl new Excel ApplicationClass Excel Workbooks xlWorkBooks xl Workbooks Excel
  • Cytoscape.js - 将核心背景设置为深色?

    我正在尝试将边缘渲染为白色 因此希望在 cytoscape js 视口中使用黑色背景 我尝试修改 div 上的 cssid cy 但这似乎被覆盖了 在文档中 我只能找到在导出到图像时设置背景颜色的功能 例如cy jpg 但这不是我想要的 我
  • (未使用的)GLSL 制服/输入/输出是否有助于调节压力?

    我不知道制服在记忆中是如何表示的 制服似乎会占用宝贵的寄存器空间 但它们最终会传入 通过 传出到全局内存中 对吧 制服未使用后情况会发生变化吗 编译器可以优化它们吗 在这种情况下 我作为绑定位置变得无效 1 所以我假设是的 制服以 GLSL
  • gnu ld 链接整个目标文件还是仅链接所需的函数?

    我们有一个库和一个可执行文件 那就是静态地链接到库 我们希望最小化最终可执行文件的程序空间 根据 avr libc 的文档 链接器链接该函数所在的整个对象模块 http www nongnu org avr libc user manual
  • 提高 mysql LOAD DATA / mysqlimport 的性能?

    我正在批处理CSV15GB 30mio 行 成mysql 8数据库 问题 任务大约需要 20 分钟 吞吐量约为 15 20 MB s 而硬盘能够以 150 MB s 的速度传输文件 我有一个 20GB 的 RAM 磁盘 用于保存我的 csv
  • Automake - 安装版本“automake-1.14.1”时遇到困难

    我在 Rapbian 2014 09 09 wheezy raspbian 发行版上安装 automake 1 14 1 时遇到问题 我写sh configure然后我写了make然后终端写信给我 make CDPATH ZSH VERSI
  • 删除 Unix 文件中的 ^@ 字符

    我有一个关于删除不可见字符的问题 这些字符只有当我们尝试使用 vi 命令查看文件时才能看到 我们有一个由 Datastage 应用程序生成的文件 源是 DB2 表 gt 目标是 txt 文件 文件包含不同数据类型的数据 我遇到的问题是只有
  • 更改 Java 临时 Internet 文件存储位置

    我正在尝试更改 Java Web Start 的存储位置 我读到可以通过java控制面板更改位置 我到达那里 我可以看到 临时互联网文件 的路径 但 更改 按钮是灰色的 为什么我不能改变这条路径 我需要将其更改为另一个硬盘驱动器 I goo
  • dplyr::mutate 的并行版本是什么?

    鉴于我有一个非常大的数据框 请告知R中是否有一个函数可以使dplyr mutate并行多核运行 Like furrr包 你可以在其中设置plan并运行多核 None
  • Laravel 缓存获取所有带标签的项目

    在 Laravel 中 您可以使用以下标签将项目放入缓存中 Cache tags bans gt put result gt ip result gt reason 但我似乎无法找到一种方法来获取带有特定标签的所有项目 是否可以检索带有特定
  • 在此特定示例中如何将 Javascript 变量传递给 Twig

    以下代码在我的Twig模板 它用于加载CSS文件或其他文件 具体取决于用户选择的主题 这在一个简单的HTML页面但是当我尝试将其带到Twig我的模板Symfony应用程序我找不到通过的方法CSS路线 与Twig 到Javascript do
  • 如何在android studio中仅允许特定指纹

    我正在构建一个应用程序 我只想允许每个设备使用特定的指纹 指纹是原始的 真实的 有没有什么方法可以实现这个想法 也许可以转换成一个数字 我可以将其存储在数据库中并在需要时进行匹配 关于你的问题有几点 您可以使用根据设备中当前注册的指纹生成的
  • POST/GET 变量命名规则?

    在命名表单中的 POST 变量或查询字符串中的 GET 变量时 是否需要遵循任何规则 Thanks 从字面上回答这个问题 我所知道的命名确实没有 规则 POST and GETphp ini 中的数组键它是一个像其他数组一样的数组 看一眼键
  • 从州-县字符变量中提取州和县

    我在单个字符串变量中有州和县名称州 县 我想将它们分开以创建两个不同的变量 states and county 有些州有两个 甚至三个 单词 县也是如此 gt states county names df states county 1 C
  • 在 Google AppEngine 中检索 .txt 文件内容

    我正在尝试使用以下命令上传文本文件
  • 如何在asp.net core中修改HttpContext.Request.Form

    我有一个 HttpContext Request 对象 其表单中的数据是错误的 我想修复它并发送正确的 HttpContext HttpContext Request Form 是只读的 但如果不是 我就会简单地执行以下操作 HttpCon
  • Ionic 应用程序 - Cordova - Safari 调试不起作用

    过去 我能够在 iPhone 上运行 Ionic Cordova 应用程序并将其插入 Mac 然后在 Mac 上打开 Safari 并转到 Develop gt PHONE NAME gt localhost 来检查我的应用程序 目前 当我
  • 在两点之间创建 svg 弧

    我想要connect使用圆弧绘制两个 SVG 点 例如两个圆的中心 如果只有一个连接 则行
  • 给定一个十进制数,找到给出整数结果的最小整数乘数

    最好用一个例子来描述问题 假设我有一个十进制值 100 227273 100 227273 X Y 我需要找到给出整数 Y 的最小正整数 X 如果 100 227273 只是一个近似值 并且您想获得最佳有理近似值 请使用连分数 http e
  • 将 printf 与两个 UART 一起使用

    我已经实施了fputc and fgetc在 retarget c 中 通过 Cortex M3 上的 UART0 成功使用 printf 但是 我想要第二个 UART 通道来获取额外的调试信息 我怎样才能像使用 printf 集成 UAR