2017-04-18 208 views
0

我想将浮点数转换为串行连接发送的字符串。 我已经使用sprintf,并且以前工作过,但是我现在正在运行mbed RTOS,它在到达sprintf行时挂起。MBED RTOS将浮点数转换为字符串/字符数组

以下是代码在while循环中停止的行,Im从端口中的mbed模拟器收集数据并需要通过串行显示它。

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

我已经使用c_str()在RTOS下成功地将字符串转换回浮点数。

是否有类似于c_str()从float转换为字符串而不使用sprintf方法?

+0

我们不知道,如果'buffer'是大到足以容纳结果字符串。请发布声明'buffer'的内容。 – PaulMcKenzie

+0

@PaulMcKenzie对不起,错过了。其声明为“char * buffer”; – NoLiver92

+2

是的,但缓冲区大小在哪里?你不能简单地声明一个未初始化的指针并将它传递给'sprintf'。如果你这样做,那么并不奇怪,事情并不奏效。也许一直以来的问题是,你正在逃避不明确的行为并相信事情正在发挥作用。 – PaulMcKenzie

回答

0

printfsprintf功能可以是非常大的代码明智的。嵌入式IDE通常提供这些函数的多个较小版本,不支持所有格式说明符,如%f。您可能需要选择在项目选项中链接printf的完整版本,才能使%f格式说明符正常工作。

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

+0

仅供参考,要查看mbed OS是否发生堆栈溢出,请检查串行输出是否存在0x0001错误。有关更多信息,请参阅[此处](https://developer.mbed.org/blog/entry/Tracing-stack-and-heap-overflow-errors/)。 –

0

每个线程都有自己的堆栈,默认情况下堆栈可能比分配给单个线程进程的堆栈小得多。许多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]) ;