="LPC1114 gets() / puts() 関数を使って会話をしよう

 NXPセミコンダクタ社LPCXpresso 基板は, printf() 関数を使って,開発環境にメッセージを表示できます.でも,それだけじゃあ,ないんです.

LPCXpresso は, scanf() 関数も使える

 前回, LPCXpresso 開発環境のコンソール・ビューに printf() 関数を使ってメッセージを表示しました.表示することができるのなら,入力だってできそうです. printf() 関数に対応する入力関数といったら, scanf() 関数ですね.もちろん, LPCXpresso では, scanf() 関数も使えます.

 使い方は,通常の PC で動作する C 言語と同じです.コンソール・ビューからメッセージを入力したら,フォーマットにしたがって,その値を返してきます.プロジェクト "proj02" を変更して,以下のようなプログラムを実行してみました.

/*
===============================================================
 Name        : main.c
 Author      : noritan
 Version     :
 Copyright   : Copyright (C) 2010 noritan.org
 Description : main definition
===============================================================
*/

#ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

#include <stdio.h>

int main(void) {
    char line[20];

    // Show message
    printf("HELLO WORLD\n");

    do {
      // Get a line
      scanf("%20s", line);

      // Put a line
      printf("%s ", line);
    } while (line[0] != '.');

    while (1) {
    }
    return 0;
}

 すると,コンソール・ビューから入力したメッセージがそのまま表示されてきます.つまり,エコーバック・プログラムです.

コンソール・ビューから入出力

 コンソール・ビューでは, scanf() により入力した文字が緑色で, printf() で出力した文字が黒で表示されています.

最後のピリオドは,入力の最後を示すために付けたものです.プログラムは,ピリオドが入力されると,無限ループに入ります.

scanf() 関数と printf() 関数を実行する無限ループとする方法もあります.しかし, scanf() 関数実行中にデバッガを停止させるとデバッガが制御不能に陥る現象が見られ,それを解決することができませんでした.しかたなく,苦肉の策としてピリオドによりプログラムを終了させる方式をとったしだいです.

printf()関数とscanf()関数は,高機能すぎる

 ここまでプログラムを作成したところで,できあがったプログラムのサイズを見てみます. Build "proj02" で確認すると,これだけのことをするだけなのに,なんと,23520バイトも必要になっています.

ビルドしてサイズを確認する プログラムのサイズ

 これは, printf() 関数と scanf() 関数が,浮動小数点を含む複雑なフォーマットに対応した高機能な関数だからです.今,必要としているのは,デバッガのコンソール・ビューからの入力機能なので,もっと低機能な関数で十分です.

fputs()関数とfgets()関数を使ってみる

 そこで,もっと機能の少ない fputs() 関数と fgets() 関数を使ってみます.これらの関数は,文字列の入出力を行う関数なので,文字列と数値の間の変換などは行いません.今は,メッセージの入出力だけが目的なので,この関数でも十分です.プロジェクト "proj02" をさらに変更して試してみました.

/*
===============================================================
 Name        : main.c
 Author      : noritan
 Version     :
 Copyright   : Copyright (C) 2010 noritan.org
 Description : main definition
===============================================================
*/

#ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

#include <stdio.h>

int main(void) {
    char line[20];

    // Show message
    fputs("HELLO WORLD\n", stdout);

    // Get a line
    fgets(line, sizeof line, stdin);

    // Put a line
    fputs(line, stdout);

    while (1) {
    }
    return 0;
}
エコーバック・プログラム

 これで,入力されたメッセージのエコーバックができました.

プログラムのサイズ

 また,プログラムのサイズは, 7416バイトと scanf() 関数と printf() 関数を使った場合に比べて,大幅に小さくなっています.

 次回は,もっと高度なプログラムを使ってみます.

田中範明(noritan.org)


トラックバック(0)

このブログ記事を参照しているブログ一覧: LPCXpresso で HELLO WORLD (2)

このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/4127





カテゴリ


Copyright (C) 2006-2015 CQ Publishing Co.,Ltd. All Rights Reserved.