RTT的使用
略
添加浮点数功能
注:
- 如下代码暂时不支持数据左补零,正浮点数前面显示
+
等功能;- 不指定位宽时按实际位宽显示,不指定小数位数时按
2
位小数显示。
- 在
SEGGER_RTT_printf.c
文件的SEGGER_RTT_vprintf()
函数中,添加如下代码:
#if 1 // support float by djd 20221114, current do NOT support some FormatFlags param, eg: '0', '+' '#'.
case 'f':
{
double dv = 0, dv_doub = 0;
int dv_int = 0, dv_int_bit_num = 1, i = 10, num_bit = 0;
if(NumDigits == 0) {
NumDigits = 2; // 默认显示两位小数
}
dv = va_arg(*pParamList, double); // 取出数据
dv_int = (int)dv; // 数据的整数部分
dv_doub = dv - dv_int; // 数据的小数部分
if(dv_doub < 0) {
dv_doub = -dv_doub; // 小数部分不需要符号
}
while(dv_int / i != 0) { // 求出整数部分的位数
dv_int_bit_num++;
i *= 10;
}
for(i = 0; i < NumDigits; i++) {
dv_doub *= 10; // 将需要显示的小数部分扩大成整数
}
num_bit = dv_int_bit_num + 1 + NumDigits; // 计算出整个浮点数需要多少个位置(整数部分+小数点+小数部分)
// SEGGER_RTT_printf(0, "dv_int[%d], dv_doub[%d], dv_int_bit_num[%d], NumDigits[%d], FieldWidth[%d]\r\n", dv_int, (int)dv_doub, dv_int_bit_num, NumDigits, FieldWidth); // 仅用于调试
if(FieldWidth > num_bit && !(FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY)) { // 当指定位宽比实际位宽大,且数据非左对齐时
for(i = 0; i < FieldWidth - num_bit; i++)
_StoreChar(&BufferDesc, ' '); // 使用空格占位多余的空间
}
_PrintInt(&BufferDesc, dv_int, 10u, dv_int_bit_num, dv_int_bit_num, 0); // 打印浮点数的整数部分
_StoreChar(&BufferDesc, '.'); // 打印浮点数的小数点
_PrintUnsigned(&BufferDesc, (unsigned)dv_doub, 10u, NumDigits, NumDigits, 0); // 打印浮点数的小数部分
if(FieldWidth > num_bit && (FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY)) { // 当指定位宽比实际位宽大,且数据左对齐时
for(i = 0; i < FieldWidth - num_bit; i++)
_StoreChar(&BufferDesc, ' '); // 使用空格占位多余的空间
}
break;
}
#endif
- 在应用程序中调用
SEGGER_RTT_printf()
函数测试:
SEGGER_RTT_printf(0, "test float: [%5.3f][%5d][%f]\r\n", 308.1415, 1234, -450.1234); // test float: [308.141][ 1234][-450.12]