SEGGER_RTT_printf()函数实现打印浮点、负数-示例

2023-11-19

概述

最近公司项目换另一款gsensor,用到了浮点数打印。又不想使用串口来打印数据,在此做个笔录,通过修改源码方式实现。

一、修改源码

1、在 SEGGER_RTT_printf.c 中 的 int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList)函数,增加以下
 case 'f':
 case 'F': 语句

/*********************************************************************
*
*       SEGGER_RTT_vprintf
*
*  Function description
*    Stores a formatted string in SEGGER RTT control block.
*    This data is read by the host.
*
*  Parameters
*    BufferIndex  Index of "Up"-buffer to be used. (e.g. 0 for "Terminal")
*    sFormat      Pointer to format string
*    pParamList   Pointer to the list of arguments for the format string
*
*  Return values
*    >= 0:  Number of bytes which have been stored in the "Up"-buffer.
*     < 0:  Error
*/
int SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList) {
  char c;
  SEGGER_RTT_PRINTF_DESC BufferDesc;
  int v;
  unsigned NumDigits;
  unsigned FormatFlags;
  unsigned FieldWidth;
  char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE];

  BufferDesc.pBuffer        = acBuffer;
  BufferDesc.BufferSize     = SEGGER_RTT_PRINTF_BUFFER_SIZE;
  BufferDesc.Cnt            = 0u;
  BufferDesc.RTTBufferIndex = BufferIndex;
  BufferDesc.ReturnValue    = 0;

  do {
    c = *sFormat;
    sFormat++;
    if (c == 0u) {
      break;
    }
    if (c == '%') {
      //
      // Filter out flags
      //
      FormatFlags = 0u;
      v = 1;
      do {
        c = *sFormat;
        switch (c) {
        case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break;
        case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO;     sFormat++; break;
        case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN;   sFormat++; break;
        case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE;    sFormat++; break;
        default:  v = 0; break;
        }
      } while (v);
      //
      // filter out field with
      //
      FieldWidth = 0u;
      do {
        c = *sFormat;
        if ((c < '0') || (c > '9')) {
          break;
        }
        sFormat++;
        FieldWidth = (FieldWidth * 10u) + ((unsigned)c - '0');
      } while (1);

      //
      // Filter out precision (number of digits to display)
      //
      NumDigits = 0u;
      c = *sFormat;
      if (c == '.') {
        sFormat++;
        do {
          c = *sFormat;
          if ((c < '0') || (c > '9')) {
            break;
          }
          sFormat++;
          NumDigits = NumDigits * 10u + ((unsigned)c - '0');
        } while (1);
      }
      //
      // Filter out length modifier
      //
      c = *sFormat;
      do {
        if ((c == 'l') || (c == 'h')) {
          sFormat++;
          c = *sFormat;
        } else {
          break;
        }
      } while (1);
      //
      // Handle specifiers
      //
      switch (c) {
      case 'c': {
        char c0;
        v = va_arg(*pParamList, int);
        c0 = (char)v;
        _StoreChar(&BufferDesc, c0);
        break;
      }
      case 'd':
        v = va_arg(*pParamList, int);
        _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags);
        break;
      case 'u':
        v = va_arg(*pParamList, int);
        _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags);
        break;
      case 'x':
      case 'X':
        v = va_arg(*pParamList, int);
        _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags);
        break;
      case 's':
        {
          const char * s = va_arg(*pParamList, const char *);
          do {
            c = *s;
            s++;
            if (c == '\0') {
              break;
            }
           _StoreChar(&BufferDesc, c);
          } while (BufferDesc.ReturnValue >= 0);
        }
        break;
      case 'p':
        v = va_arg(*pParamList, int);
        _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u);
        break;
      case '%':
        _StoreChar(&BufferDesc, '%');
        break;
	  // Add the ability to output floating point numbers. It has two decimal places by default.
	  #if 0
	  case 'f':
	  case 'F':
	  {
	  	char ch[10]={0};
	  	const char * s=ch;
	  	double a = va_arg(*pParamList, double);
	  	sprintf(ch,"%4.3f",a);
	  	do{
			c = *s;
			s++;
			if (c == '\0') break;
			_StoreChar(&BufferDesc, c);
		}while(BufferDesc.ReturnValue >= 0);
	  }break;
	  #else
	  case 'f':
	  case 'F': {
		float fv = (float)va_arg(*pParamList, double);    // Retrieves the input floating point value
		if(fv < 0) _StoreChar(&BufferDesc, '-');          // Judge the sign
		v = abs((int)fv);                                 // Take the positive integer part
		_PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags);  // According to an integer
		_StoreChar(&BufferDesc, '.');                                        // Display decimal point
		v = abs((int)(fv * 1000));               
		v = v % 1000;
		_PrintInt(&BufferDesc, v, 10u, 3, FieldWidth, FormatFlags);          // Display three decimal places
	  }break;
	  #endif
      default:
        break;
      }
      sFormat++;
    } else {
      _StoreChar(&BufferDesc, c);
    }
  } while (BufferDesc.ReturnValue >= 0);

  if (BufferDesc.ReturnValue > 0) {
    //
    // Write remaining data, if any
    //
    if (BufferDesc.Cnt != 0u) {
      SEGGER_RTT_Write(BufferIndex, acBuffer, BufferDesc.Cnt);
    }
    BufferDesc.ReturnValue += (int)BufferDesc.Cnt;
  }
  return BufferDesc.ReturnValue;
}

二、运行结果:

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

SEGGER_RTT_printf()函数实现打印浮点、负数-示例 的相关文章

  • 使用 Eclipse 的 C 项目上的链接器错误

    我想为 STM32F217IG 微控制器创建一个项目 所以我安装了 Eclipse 和GNU for ARM 嵌入式 GCC 交叉编译器 https launchpad net gcc arm embedded 我不认为这是 Code So
  • 在 GNU 汇编器中处理或记住 cmp 的向后参数的好方法是什么?

    以下是一些采用 Intel 语法的汇编代码 Jump to done if rsi gt rax cmp rsi rax jae done 这对我的大脑来说是有道理的 如果 rsi 高于或等于 rax 你就会跳 匹配中参数的顺序cmp操作说
  • 如何制作自己的 P2P 软件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我怎样才能制作自己的napster 这些 p2p 程序使用哪个库 我不太熟悉套接字编程的概念 你能用Qt4制作p2p程序吗 从 Napst
  • GNU Arm 汇编器将 ORR 更改为 MOVW

    我正在组装以下汇编器 syntax unified cpu cortex m4 thumb section text orr r1 12800 orr r1 12801 本质上 只有两个 OR 指令 如果我查看结果objdump I get
  • -D_DEFAULT_SOURCE 的作用是什么?

    之前我收到过来自gcc std c99 that usleep 被隐含地声明了 然后我偶然发现这个 stackoverflow 帖子 https stackoverflow com a 10053817 2002146 这导致我使用 D B
  • WebRTC:匹配最近的同行

    给定一个公共 IP 地址 对等点 A 和许多其他公共 IP 地址 IPv4 和 IPv6 地址的混合 列表 将对等点 A 的 IP 地址匹配的最简单方法是什么 n最近的对等点 而无需让对等点手动相互 ping 通以进行延迟基准测试 我认为使
  • 如何让配置脚本检查依赖关系

    我使用 autoconf 生成了一个配置脚本来构建我的项目 除非我没有安装一些所需的库 否则它工作正常 当缺少某些文件时 Make 返回错误 但我认为应该由配置脚本实际检查它 所以我的问题是 如何修改 autoconf 生成的脚本来寻找依赖
  • GNU、GCC 和 MinGW 之间有什么区别?

    我得知 GCC 不仅是一个编译器c questions tagged c但也适用于许多其他语言 这是真的吗 如果是这样 那么它是如何完成的呢 GNU 不是编译器 它是一个操作系统和一组自由软件 旨在 类 Unix 而不使用 Unix GNU
  • sed 使用:预期上下文地址

    我用sedmacOS 上的命令包含以下文本 cat pets txt This is my cat my cat s name is betty This is your dog your dog s name is frank This
  • GNU 汇编器:访问损坏的共享库错误

    我正在读一本书 专业汇编语言 我想用动态链接 我正在使用 AT T 语法和 GNU 汇编器 我的电脑有 Ubuntu 12 04 64 位系统 我正在尝试使用 cpuid 汇编器操作码显示供应商 ID 字符串 并且printf C函数代替l
  • 如何以最小的开销实现简单的无服务器 p2p 浏览器到浏览器消息传递?

    我正在尝试创建一些简单游戏的基本实现 井字游戏是起始项目 这些游戏可以通过互联网玩 而不需要中央服务器 该页面甚至不需要托管 可以在计算机上本地运行 也可以托管在 Web 服务器上 托管游戏时 页面会通知主机他的 IP 地址 然后可以通过任
  • g++ 既是 C++ 编译器又是链接器吗?

    我正在查看 Eclipse 中构建的输出 我正在针对 ColdFire 处理器进行交叉编译 编译行如下所示 m68k elf g O2 falign functions 4 IC nburn include IC nburn MOD52 接
  • 通过多点连接发送和接收邀请

    我知道这个问题之前已经被问过 但我只是想知道为什么它在我的特定情况下不起作用 我正在尝试从一个视图控制器的多点连接发送邀请 并在另一个视图控制器上接收它 我的发送代码是 self invitePeer selectedPeerID toSe
  • `int` 是原子类型吗?

    Quoting gnu https www gnu org software libc manual html node Atomic Types html 实际上 您可以假设 int 是原子的 您还可以假设指针类型是原子的 非常方便 这两
  • GNU GAS 汇编中是否有代表当前地址的符号?

    我很想知道是否有任何特殊的 GAS 语法可以实现与 NASM 示例中相同的效果 SECTION data msg db Hello World 10 0 the 0 terminated string len equ msg means c
  • 如何通过peerJS 点对点连接接收数据?

    我正在尝试使用peerJS 连接两个对等点 我几乎只是在遵循他们的 入门 但我仍然在挣扎 下面是我到目前为止得到的代码
  • 将 gcc libs .data 放在特定部分?

    我正在尝试为我们的嵌入式系统切换到 GNU GCC 编译器 但由于我们芯片的内存布局被分割 我在链接该项目时遇到了问题 RAM section 1 0x10000 0x12FFF RAM section 2 0x18000 0x1BFFF
  • Linux/ 将目录作为文件打开

    我一直在阅读 Brian Kernighan 和 Dennis Ritchie C 编程语言 第 8 6 章是关于 UNIX 操作系统下的目录列表的 他们说一切 甚至目录都是文件 这意味着我应该能够将目录作为文件打开 我已经尝试使用 std
  • HTML5 Websockets 可以在不使用服务器的情况下直接连接 2 个客户端(浏览器)吗? (P2P)[重复]

    这个问题在这里已经有答案了 使用 HTML5 Websockets 我可以直接在 2 个客户端 浏览器 之间打开套接字 假设我知道它们的 IP 地址并且不存在 NAT 遍历问题 我想将一些数据直接从一个浏览器发送到另一个浏览器 本质上是创建
  • 让 GNU C 编译器在 iOS 6.x 上运行

    我有一台越狱 evasi0n 第四代 iPad 带有 iOS 6 1 固件 通过 Cydia 我安装了移动终端 版本 520 2 然后 遵循this http iklive org cc compiling on ios 教程中 我已经下载

随机推荐

  • 核方法、核密度估计与核函数

    核方法 核密度估计与核函数 核方法 Kernel Methods 是一类常用于机器学习和统计学中的非参数方法 主要用于特征转换和模式识别 核方法通过将数据映射到高维特征空间 使得线性不可分的问题在高维空间中变得线性可分 其中 核函数 Ker
  • 未来展望——学习规划

    不知不觉就来到了研二 找工作和科研两座大山压在身上 我的专业是机械设计及理论 主要研究的方向是新能源汽车电驱动系统设计 平时主要的工作就是先在Matlab Simulink里搭建出PMSM的控制模型 观测器模型等 再将其转化为C代码烧录到D
  • 什么是GPT?初学者如何使用GPT?GPT入门学习

    灵魂发问 GPT科研中没有那么神 GPT账号不能轻松使用 GPT怎样才融合到我的科研中 别人用的非常酷 为什么我用的不行 让GPT成为您的科研加速器 GPT对于每个科研人员已经成为不可或缺的辅助工具 不同的研究领域和项目具有不同的需求 如在
  • tp-wr886n虚拟服务器在哪,新版TP-LINK TL-WR886N默认登录地址是多少?【图解】

    新版TP LINK TL WR886N默认登录地址是多少 问 最近刚买的普联TP LINK新款无线路由器 请问tplink TL WR886N默认登录地址是多少 想要登录这台TL WR886N不知道管理IP地址如何登录呢 答 TP LINK
  • iOS进阶_kvc使用注意事项

    细节1 我们在项目中使用kvc 在设置model属性的时候 注意尽量不要使用基本数据类型 实例 数据模拟 注意age是null类型的 Person h import
  • robotframework安装使用

    一 Robot Framework 介绍 Robot Framework 是一款基于 Python 的功能自动化测试框架 它具备良好的可扩展性 支持关键字驱动 可以同时测试多种类型的客户端或者接口 可以进行分布式测试执行 主要用于轮次很多的
  • 解决问题方法汇总:ROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysq

    var lib mysql mysql sock 这个目录是my cnf中配置的 连接localhost通常通过一个Unix域套接字文件进行 即这个mysql sock文件 如果套接字文件被删除了 本地客户就不能连接 systemctl s
  • el-upload上传阿里云(oss上传)

    oss上传 在你的项目安装oss npm install ali oss save 初始化oss 配置文件 新建一个js文件 内容如下 代表你所申请的参数 问运维要 let OSS require ali oss export let cl
  • Oracle函数集锦

    一 case when then 用法 case具有两种格式 简单case函数和case搜索函数 简单case函数 case sex when 1 then 男 when 2 then 女 else 其他 end case搜索函数 case
  • OpenGL GLFW入门篇 - 画矩形2

    上一篇介绍了如何渲染矩形 这一篇介绍如何将叠加的部分透明显示 效果图 主体代码 void DrawRectangle void GLfloat xl yt xr yb w h glPushMatrix glLoadIdentity glTr
  • [vue3]用element封装一个抽屉组件

    需求 因为抽屉组件在后台管理系统是非常常见的 那么封装起来怎么样 可以传入标题 size 提交按钮的文字 传入部分即便超出范围也不会挤掉下面的按钮 会出现滚动条 如图
  • 文件目录和目录文件的作用区别和联系 & C语言文件相关操作 FILE用法

    一 文件目录和目录文件的作用区别和联系 1 他们各自的概念和联系 文件目录 把所有的FCB组织在一起 就构成了文件目录 即文件控制块的有序集合 FCB 为了能对一个文件进行正确的存取 操作系统必须为文件设置用于描述和控制文件的数据结构 称之
  • setlocale()/_wsetlocale()函数的使用

    在C运行库提供的多字节字符 宽字符转换函数 mbstowcs wcstombs 中 需要用到全局变量locale locale encoding 以指定多字节字符的编码类型 1 功能 用来定义全局变量 locale locale encod
  • linux进阶52——pthread_cond_t

    1 概念 条件变量是线程可用的另一种同步机制 条件变量给多个线程提供了一个会合的场所 条件变量与互斥量一起使用时 允许线程以无竞争的方式等待特定的条件发生 条件变量是线程中的东西 就是等待某一条件的发生 和信号一样 2 使用场景 条件变量要
  • Elasticsearch实战(二十二)---ES数据建模与Mysql对比 一对一模型

    Elasticsearch实战 ES数据建模与Mysql对比实现 一对一模型 文章目录 Elasticsearch实战 ES数据建模与Mysql对比实现 一对一模型 1 一对一 模型 1 1 Mysql建模 1 2 Index ES 模型
  • JetBrains IDE 全新UI申请体验

    JetBrains 宣布为其 IDE 系列产品更新默认 UI 申请 目前需要去官网申请才能获得试用 申请地址 https www jetbrains com lp intellij new ui preview 试用资格 在官网申请之后 就
  • 安装或者升级cmake版本

    1 cmake至少需要3 20 的版本 可以去官网 https cmake org files 下载 也可以通过wget下载并解压 如果下载很慢或打不开官网 可评论留邮箱发你 wget 下载 wget https cmake org fil
  • jq 用val()获取input的值无效

    用id获取input标签 取不到该input的value值 用改标签的name属性就可以 4个下面这种input 懒得复制了 就贴一个
  • 【JavaSE学习笔记】Java中的多态及其引出的Upcast和Downcast问题

    JavaSE学习笔记 JAVA中的多态及其引出的Upcast和Downcast 文章目录 JavaSE学习笔记 JAVA中的多态及其引出的Upcast和Downcast 前言 一 JAVA中的多态 二 Upcast Downcast 三 总
  • SEGGER_RTT_printf()函数实现打印浮点、负数-示例

    概述 最近公司项目换另一款gsensor 用到了浮点数打印 又不想使用串口来打印数据 在此做个笔录 通过修改源码方式实现 一 修改源码 1 在 SEGGER RTT printf c 中 的 int SEGGER RTT vprintf u