2017-04-18 202 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]) ;