MBED RTOS将Float转换为字符串/字符阵列

MBED RTOS convert Float to String/Char array

本文关键字:字符串 字符 阵列 转换 RTOS Float MBED      更新时间:2023-10-16

我正在尝试将浮点数转换为字符串以通过串行连接发送。我已经使用了Sprintf,并且以前曾经工作过,但是现在我正在运行MBED RTO,该RTO悬挂在Sprintf系列时。

下面是代码在段循环中停止的行,即IM从端口中的MBED模拟收集数据,需要通过串行显示。

sprintf (buffer, ",%.2f,%.2f,%.2f,%.2f", sData1[0], sData1[1], sData1[2], sData1[3]);

我已经使用C_str((将字符串转换回RTOS下的浮点数。

是否有类似于C_STR((可以在不使用sprintf方法的情况下转换为字符串的东西?

printfsprintf函数的代码很大。嵌入式IDE通常提供这些功能的多个较小版本,这些版本不支持所有格式指定器,例如%f。您可能必须选择与项目选项中的printf的完整版本链接,以使%f格式指定器的工作。

printfsprintf功能还使用比平均功能更多的堆栈空间。增加程序的堆栈大小,以查看堆栈溢出是否阻止sprintf返回。

每个线程都有自己的堆栈,默认情况下可能要小得多,堆栈分配给了一个螺纹过程。许多sprintf()实现都使用大量堆栈 - 尤其是用于浮点数支持。

它可以简单地通过增加有关线程的堆栈来起作用,但是解决这个问题可能是很多资源。如果出现两个小数的位置就足够了,那么传递整数缩放x100的位置将更便宜:

int val_x100( float val )
{
    int i = (int)(val * 1000) ;
    if( i % 10 >= 5 )
    {
        i = (i / 10) + 1 ;
    }
    else if( i % 10 <= -5 )
    {
        i = (i / 10) - 1 ;
    }
    else
    {
        i /= 10 ;
    }
    return i ;
}

然后:

sprintf( buffer, ",%d,%d,%d,%d", 
         val_x100( sData1[0] ), 
         val_x100( sData1[1] ), 
         val_x100( sData1[2] ), 
         val_x100( sData1[3] ) ;