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