趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • STM32F401で遊んでみる(5)

    投稿日 2015年 1月 6日 コメントはありません

    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(と書き込み)を行って動作を確認しました。


    コメントをどうぞ(日本語のみ/Only in Japanese)

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)