組み込み機器・ハードウェアの設計開発から装置製作まで社内一貫対応!

組み込み機器・ハードウェア設計製作.com
組み込み機器・ハードウェア設計製作.com

produced by株式会社アイディアイ

設計のポイント

sprintf関数を使う

設計内容分類組み込みソフトウェアにおけるC言語記述

実現したい仕様・課題

変数に格納された値を使ってログ文字列や表示文字列、通信コマンドを生成する場面は組み込みでも頻出します。数値から文字列への変換や文字列の連結を自前のコードで組み立てると、記述が煩雑になり桁処理などのバグも入りやすくなります。書式化された文字列を簡潔に生成したいというのが課題です。

設計のポイント

変数に格納された値を使用して文字列を生成する際はsprintf関数が便利です。sprintf関数は、書式文字列の中に変数の値を埋め込んで、指定したバッファへ格納します。出力フォーマットの指定により、10進(%d)、16進(%02X のような桁数・ゼロ埋め指定付き16進)、文字列(%s)など、数値を指定した形式の文字列へ変換できます。ログ出力、LCD等への表示文字列、ATコマンドのような通信コマンドの組み立てまで、幅広く活用できます。組み込みで安全に使うための注意点として、まずバッファあふれ対策があります。sprintfは書き込みサイズの上限を指定できないため、可変の文字列(%s)を扱う場合はサイズ上限を指定できるsnprintf(buf, sizeof(buf), …) の使用を推奨します。また、浮動小数点の書式(%f)を使うとライブラリのコードサイズが大きく増える処理系があるため、リソースの小さいマイコンでは整数化して出力する(例:小数1桁なら10倍した整数を%d.%dで出す)方法も検討します。処理時間も比較的大きい関数のため、割り込みハンドラ内での使用は避け、メインループ側で整形する設計とします。書式指定と引数の型の不一致は不正動作の原因になるため、コンパイラの書式チェック警告を有効にしておくことも有効です。

【コード例】

#include <stdio.h>

int  value = 123;
char str[] = "test";
char buf[256];

sprintf(buf, "dec=%d, hex=0x%02X, text=%s", value, value, str);
printf("%s", buf);
// 出力結果: dec=123, hex=0x7B, text=test

// 可変文字列を含む場合はサイズ上限付きのsnprintfを推奨
snprintf(buf, sizeof(buf), "name=%s", name);

補足情報

当事例のような、マイコンのファームウェアにおけるC言語記述のポイントをまとめた冊子の無料DLが可能です。
是非以下よりご確認ください。

マイコンのファームウェア C言語記述のポイント

>>ダウンロードはこちら!

お問い合わせ

組み込み機器・ハードウェア 設計製作.comを運営する株式会社アイディアイは、組み込み機器・ハードウェアの設計開発代行サービスを提供しています。
試験装置や制御機器、組み込みボードなど、設計・開発委託先をお探しの皆様、お気軽に当社に御相談ください。

技術資料のダウンロードはこちらから 技術資料ダウンロ―ド メールフォームでのお問い合わせはこちらから ご相談・お問合せ