今までのプログラムでシリアルポートを使ってターゲット側からPCにデータを送れることが確認できました。ここではPCからターゲット側にデータを送るテストをしてみましょう。しかしPCから送ったデータが正しくターゲット側に届いたことをどうすれば確認できるのでしょうか。
最も簡単な方法の1つが、ターゲット側でエコーバックするプログラムを書くことです。エコーバックとはPCから送ったデータを受け取ったターゲットが送り返し、それをPC側で確認することで双方の送信/受信機能を診断することができます。
図7がエコーバックのプログラムです。新たにechoというプログラムを作成しました。画面左のProgram Workspaceに追加されていますね。それでは右のソースコードエディタに目を移してください。7行目のcは文字型の変数でシリアルポートから受け取った一文字を格納するための変数です。ボーレートは書き込み速度と同じ115200bpsにしています。永久ループの中ではシリアルポートから一文字受け取ってそれをそのままシリアルポートに送り出しています。リスト4がターゲット側の動作をPC側のターミナルソフトで確認したときのログです。PC側でタイプしたaaabbbcccdddeeeがそのまま返ってきていることが分かります。
>lpc21isp -bin echo_LPC1114.bin -term com2 115200 14746 lpc21isp version 1.97 File echo_LPC1114.bin: loaded... image size : 11732 Image size : 11732 Synchronizing (ESC to abort). OK Read bootcode version: 1 7 Read part ID: LPC1114.../102, 32 kiB FLASH / 4 kiB SRAM (0x1A40902B) Will start programming at Sector 1 if possible, and conclude with Sector 0 to en sure that checksum is written last. Erasing sector 0 first, to invalidate checksum. OK Sector 1: ...........................|.........................|.........................|......................... Sector 2: ...........................|.........................|.........................|............. Sector 0: ..........................|.........................|.........................|......................... Download Finished... taking 3 seconds Now launching the brand new code Terminal started (press Escape to abort) aaabbbcccdddeee Terminal stopped
ただこれだけでは以前の記事の書込み器のテストで紹介したループバックと見た目はほとんど変わりませんし、どこかでショートカットされていても分かりませんよね。それで、ターゲット側で受け取った文字を少し加工して送り出すプログラムに改造してみましょう。これならターゲット側が関与しているか一目瞭然です。
文字の加工の方法ですが、小文字の英字を送ると大文字になって返ってくるプログラムに改造します。ただ大文字の場合は大文字のまま返ってきます。それにはどうすればよいでしょうか。まずASCIIコード表を見てみましょう(図8)。
これは英数字のASCIIコード表なので8bit目が定義されていないですね。最上位ビットは常に0として話を進めます。例えば小文字のaは2進数で011-00001、これに対して大文字のAは010-00001です。“z”は011-11010、“Z”は010-11010です。この表でいうところのB6(6番目のビット)を0にすることで小文字を大文字に変換できそうです。ただアルファベットだけではなく“{”も“[”に変換されてしまいますね。そこのところは多少目をつぶるとして、この原理をプログラムとして実装してみましょう。
図9がそのプログラム例です。ソースコードの11行目でシリアルポートから受け取った1文字分の変数と0xdfで論理積(AND)を取っています。これはマスクといわれる処理で、マスク側の定数のビットが立っていない変数側のビットをクリアします。0xdfは2進で110111111ですから変数側の6ビット目だけを0にしています。この処理で小文字のアルファベットを大文字に変換しているのです。リスト5がこのプログラムの書き込みと実行した動作を確認したログです。” AAAABBBBBCCCCC”と表示されているものはPC側からは小文字で打ったものです。
>lpc21isp -bin echo_LPC1114_1.bin -term com2 115200 14746 lpc21isp version 1.97 File echo_LPC1114_1.bin: loaded... image size : 11736 Image size : 11736 Synchronizing (ESC to abort). OK Read bootcode version: 17 Read part ID: LPC1114.../102, 32 kiB FLASH / 4 kiB SRAM (0x1A40902B) Will start programming at Sector 1 if possible, and conclude with Sector 0 to en sure that checksum is written last. Erasing sector 0 first, to invalidate checksum. OK Sector 1: ...........................|.........................|.........................|......................... Sector 2: ...........................|.........................|.........................|............. Sector 0: ..........................|.........................|.........................|......................... Download Finished... taking 3 seconds Now launching the brand new code Terminal started (press Escape to abort) AAAABBBBBCCCCC Terminal stopped
今回はlPC1114の数あるペリフェラルの中でもシリアルインタフェースについて勉強しました。mbedが用意しているクラスを使うと、意外とお手軽に使える感じがしませんでしたか? 筆者はこのクラスのマイコンでprintfが使えたのに感動を覚えました。今後、他のペリフェラルの動作をPC側で確認するときにもこのシリアル通信機能は使いますので、この機会にバッチリ習得しておいてください。
Copyright © ITmedia, Inc. All Rights Reserved.