2015年1月6日火曜日

STM32F401で遊んでみる(5)

9.printf()やgetc()を使ってみる

mbedを挿入した際のログをdmesgコマンドでみてみました。
[15886.601036] usb 2-1.4.3: USB disconnect, device number 9
[15888.075962] usb 2-1.4.3: new full-speed USB device number 10 using ehci_hcd
[15888.225240] scsi7 : usb-storage 2-1.4.3:1.1
[15888.225648] cdc_acm 2-1.4.3:1.2: This device cannot do calls on its own. It is not a modem.
[15888.225670] cdc_acm 2-1.4.3:1.2: ttyACM0: USB ACM device
[15889.223047] scsi 7:0:0:0: Direct-Access     MBED     microcontroller  1.0  PQ: 0 ANSI: 2
[15889.224257] sd 7:0:0:0: Attached scsi generic sg2 type 0
[15889.226709] sd 7:0:0:0: [sdb] 1072 512-byte logical blocks: (548 kB/536 KiB)
[15889.227459] sd 7:0:0:0: [sdb] Write Protect is off
[15889.227464] sd 7:0:0:0: [sdb] Mode Sense: 03 00 00 00
[15889.227958] sd 7:0:0:0: [sdb] No Caching mode page found
[15889.227963] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[15889.230723] sd 7:0:0:0: [sdb] No Caching mode page found
[15889.230728] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[15889.235618]  sdb:
[15889.237988] sd 7:0:0:0: [sdb] No Caching mode page found
[15889.237993] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[15889.237996] sd 7:0:0:0: [sdb] Attached SCSI removable disk

よくみると、USBストレージだけではなく、ttyACM0というデバイスが追加されていることがわかります。
調べてみると、Serialクラスでprintf()やgetc()などが使えそうです。プログラムの方は、
#include "mbed.h"

Serial pc(USBTX,USBRX);
DigitalOut myled(PA_5);
DigitalIn button(USER_BUTTON);

int main() {
    int c=200;
    char k;
    pc.baud(115200);
    pc.printf("This is TEST!!\r\n");
    while(1) {
        if(pc.readable()){
            k = pc.getc();
            if((k=='a') && c<1000) c+=50;
            if((k=='z') && c>100) c-=50;
            pc.printf("Value of c: %d\r\n",c);
        }
        if(button){
            myled = 1; // LED is ON
            wait((double)c/2.0/1000);
            myled = 0; // LED is OFF
            wait((double)c/2.0/1000);
        } else {
            pc.printf("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
        }
    }
}

としてみました。内容は、
  • シリアルコンソールを115.2kbpsで開いて、メッセージを出力します。
  • 読み出せるキャラクタがあるかreadable()で確認
    (これをやらないとgetc()はキーが押されるまで動作をブロックします)
  • 読み出せる場合にはgetc()で読み出し
  • 入力文字を判別してcの値を増減
    (キーの値が読めているか確認するため)
  • ボード上のUSERスイッチが押されていない場合はcの値に応じてLEDを点滅
  • ボード上のUSERスイッチが押されている場合には文字を多数出力
    (本当に115.2kbpsでているか確認したいため)
としています。
プログラムを作成したらコンソールを一つ開いて、
$ screen /dev/ttyACM0 115200
としてシリアルコンソールを115.2kbpsで開きます。
その後、compile(と書き込み)を行って動作を確認しました。

0 件のコメント: