埋め込み C で sprintf() で float を使用する

組み込みプラットフォームを使用しているため、printf() のすべての機能を利用できない可能性は十分にあります。 -スタイル関数。

フロートがまったくあると仮定すると (埋め込み用に必ずしも与え​​られているわけではありません)、次のようなものでエミュレートできます:

char str[100];
float adc_read = 678.0123;

char *tmpSign = (adc_read < 0) ? "-" : "";
float tmpVal = (adc_read < 0) ? -adc_read : adc_read;

int tmpInt1 = tmpVal;                  // Get the integer (678).
float tmpFrac = tmpVal - tmpInt1;      // Get fraction (0.0123).
int tmpInt2 = trunc(tmpFrac * 10000);  // Turn into integer (123).

// Print as parts, note that you need 0-padding for fractional bit.

sprintf (str, "adc_read = %s%d.%04d\n", tmpSign, tmpInt1, tmpInt2);

整数のサイズに基づいて、小数点以下の文字数を制限する必要があります。たとえば、16 ビットの符号付き整数では、4 桁に制限されます (9,999 は、表現できる最大の 10 のべき乗 -1 です)。

ただし、必要な精度が得られるまで、小数部分をさらに処理し、毎回 4 桁ずつシフトする (そして整数部分を使用/減算する) ことによって、これを処理する方法があります。

更新:

avr-gcc を使用していると述べた最後のポイント 他の回答の1つへの回答で。 %f を使用するために必要なことを説明しているように見える次の Web ページを見つけました。 あなたの printf()

私が最初に思ったように、浮動小数点をサポートするには追加の作業が必要です。これは、組み込みのものが浮動小数点をほとんど必要としないためです (少なくとも、私がこれまでに行ったことはありません)。これには、メイクファイルに追加のパラメーターを設定し、追加のライブラリとリンクすることが含まれます。

ただし、一般的な出力形式を処理する必要があるため、コード サイズがかなり大きくなる可能性があります。浮動小数点数の出力を小数点以下 4 桁以下に制限できる場合は、コードを関数に変換し、それを使用することをお勧めします。これにより、必要なスペースがはるかに少なくなる可能性があります。

リンクが消えた場合に備えて、gcc コマンドに "-Wl,-u,vfprintf -lprintf_flt -lm が含まれていることを確認する必要があります。 "。これは次のように変換されます:

  • vfprintf を最初は未定義にします (リンカーが解決する必要があるようにします)。
  • 浮動小数点 printf() を指定します 検索用ライブラリ
  • 検索する数学ライブラリを指定します。

このようなものは本当に簡単ではありませんか:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char str[10];
float adc_read = 678.0123;

dtostrf( adc_read, 3, 4, temp );
sprintf(str,"adc_read = %10s \n", temp);
printf(temp);

はい、できます。ただし、リンク先の C ライブラリに依存するため、その結果に注意する必要があります。

組み込みアプリケーション用にプログラミングしているので、浮動小数点サポートは多くの組み込みアーキテクチャ用にエミュレートされていることに注意してください。この浮動小数点サポートでコンパイルすると、実行可能ファイルのサイズが大幅に増加します。