強火で進め このページをアンテナに追加 RSSフィード

整理された情報は こちら へどうぞ。

2010年11月29日

[]デバッグ。printf()やgetc()を使う

LEDを点滅させる様な簡単なプログラムが書けたので段々と大規模なプログラムに進もうかと思う所ですが大規模なプログラムになるとコードを目視しただけでのデバッグは辛くなるのでちゃんとデバック方法をチェックしておこうと Debugging のページをチェックしました。

printf()を使う

Debugging - Handbook | mbed

http://mbed.org/handbook/Debugging

ココを見ると printf() が使えるとの事なので早速この様なプログラムで試してみました。最初に printf() で test と出力した後にLEDを点滅させるプログラムです。

#include "mbed.h"

DigitalOut myled1(LED1);

int main() {
    printf("test\n");
    while(1) {
        myled1 = 1;
        wait(0.2);
        myled1 = 0;
        wait(0.2);
    }
}

ターミナルを開いた状態でこちらのプログラムを実行したのですがターミナルには何も表示されませんでした。

「うーむ、こりゃ事前に何かコマンド打っとかないといけないっぽいかな?」と思いこちらのページからリンクが張ってあったこちらのページやGoogle検索をした結果、以下の手順が必要な事が分かりました。

1. まずターミナルで以下のコマンドを実行してmbedがどこに接続されているか確認。

ls /dev/tty.usbmodem*

2. 次に screen コマンドを以下の様な記述で実行。

screen /dev/tty.usbmodem412 9600

※ /dev/tty.usbmodem412 の部分は実際には 1. で確認したパスを設定。

※screenの実行を終了するには Ctrl+a を押した後に \ を押す。確認メッセージが出るので y を押す。

その結果はこちら

f:id:nakamura001:20101130042555p:image:w500

何やら改行が上手く処理されて無いみたいですね。改行の\nがCR(行頭に復帰)+LF(改行)ではなくLF(改行)として解釈されているっぽいですね。

色々、検索してみたのですがどのサイトでも screen のこの改行の解釈を変更する方法が記載されていませんでした。どのサイトでも screen コマンドを使う代わりに別のアプリを使用する事で解決していました。

という事で自分もアプリを導入して解決する事にして色々試してみました。しかし、どれも結構メンドクサイ。最終的にこちらのページのコメント欄で紹介されている「CoolTerm」を使う事にしました。インストールも使用方法も簡単で良いアプリでした。

Terminals - Handbook | mbed

http://mbed.org/handbook/Terminals

アプリはこちらのサイトから「CoolTerm」というアプリを探してDLして下さい。

Roger Meier's Freeware

http://freeware.the-meiers.org/

DLしたら解凍し、フォルダごとアプリケーションフォルダに移動するだけでインストールは完了です。mbedを接続した状態で起動して下さい。

なお、 screen コマンドで接続中のままだとこちらのアプリで繋げない様なのでまだ接続している場合は先にそちらは終了させておいて下さい。

起動すると Connect のアイコンをクリック。これだけで準備完了です。むちゃくちゃ簡単ですね。

f:id:nakamura001:20101130044334p:image:w500

この状態でmbedのリセットボタンを3回押したらこの様に表示されました。

f:id:nakamura001:20101130044401p:image:w500

理想的な結果ですね。

getc()を使う

printf() 以外にも getc() も使えるみたいなのでこちらも試してみました。

取り敢えず、こちらのサンプルの以下のプログラムをコピペして実行してみました。

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx
PwmOut led(LED1);

float brightness = 0.0;

int main() {
    pc.printf("Press 'u' to turn LED1 brightness up, 'd' to turn it down\n");

    while(1) {
        char c = pc.getc();
        if((c == 'u') && (brightness < 0.5)) {
            brightness += 0.01;
            led = brightness;
        }
        if((c == 'd') && (brightness > 0.0)) {
            brightness -= 0.01;
            led = brightness;
        } 

    }
}

プログラムを読むとPCのキー入力でLEDの明るさを変更するプログラムの様です。uキーを押すと明るくなり、dキーを押すと暗くなる様です。

実行したところバッチリ反応しました。しかし、これだと現在どの位の値に成っているのかが分から無いので以下の様にdキーの入力判定処理の後に printf() で表示させてみました。

        if((c == 'd') && (brightness > 0.0)) {
            brightness -= 0.01;
            led = brightness;
        } 
        pc.printf("brightness=%f\n", brightness);
    }
}

これを実行した結果がこちら。とても分り易くなりましたね。

f:id:nakamura001:20101130045305p:image:w500

mbed、printf()やgetc()が使えるのは良いですね。これはデバックやちょっとしたテストにとても重宝しそうです。

関連ページ

Serial Communication with a PC(翻訳) | mbed

http://mbed.org/users/kokotaro/notebook/Serial-Communication-with-a-PC-ja/

SerialPC - Handbook | mbed

http://mbed.org/handbook/SerialPC

Terminals - Handbook | mbed

http://mbed.org/handbook/Terminals

Debugging - Handbook | mbed

http://mbed.org/handbook/Debugging

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。