SEGGER_RTT相关的操作
SEGGER_RTT相关介绍:
https://blog.csdn.net/2402_83411382/article/details/151440730?spm=1001.2014.3001.5501
配置缓冲区的大小
1.虚拟终端的用法
a.实现分流
b.改变终端输出字体颜色
c.重定向
d.输出浮点数
rtt默认是不支持输出浮点数的
找到SEGGER_RTT_printf的实现
在SEGGER_RTT_vprintf的实现中加入输出浮点数的逻辑
case 'f':case 'F': {float fv = (float)va_arg(*pParamList, double); // 从参数列表获取float(可变参数默认提升为double)unsigned int decimal_part;unsigned int precision = NumDigits; // 使用NumDigits作为小数精度(解析格式时的.n),默认0位// 处理负号if (fv < 0.0f) {_StoreChar(&BufferDesc, '-');fv = -fv; // 转为正数处理,简化后续逻辑}// 处理整数部分(提取小数点前的数字)int int_part = (int)fv;_PrintInt(&BufferDesc, int_part, 10u, 0u, FieldWidth, FormatFlags); // 整数部分不需要NumDigits(精度),传0// 处理小数部分(默认至少1位小数,若未指定精度则按1位处理)if (precision == 0u) {precision = 1u; // 若未指定精度(如%f),默认保留1位小数}_StoreChar(&BufferDesc, '.'); // 输出小数点// 计算小数部分:将float放大 precision 倍,取整数后取模(避免浮点误差)float decimal_f = fv - (float)int_part; // 提取小数部分(0 <= decimal_f < 1)// 生成10^precision(如precision=2则为100),用于放大小数部分unsigned int scale = 1u;for (unsigned int i = 0u; i < precision; i++) {scale *= 10u;}decimal_part = (unsigned int)(decimal_f * scale + 0.5f); // +0.5f 实现四舍五入decimal_part %= scale; // 确保不超出precision位(防止浮点误差导致的溢出)// 输出小数部分,不足precision位时补前导0(如0.5 → 0.50 当precision=2时)_PrintUnsigned(&BufferDesc, decimal_part, 10u, precision, precision, 0u); break;}
测试: