mbed(4) USBポートでシリアル通信

今回は、デバックにも使用できるように、mbed基板についているUSBポートを使ってシリアル通信できるようにします。

●シリアルポート

mbedには通常のUART(非同期シリアル)ポートが3chあり、RS-232Cのレベルコンバータ(WSN126など)をつなぐとシリアル通信ができます。それ以外に、USB I/Fを仮想シリアルポートとして使用することもできます。この方法は、別にハードウェアを用意する必要がないため手軽に使用できます。

●USB I/Fを仮想シリアルポートとして使うには

PC(Windows)側に専用のドライバをあらかじめインストールしておく必要があります。ドライバは下記URLでダウンロードできます。

http://mbed.org/handbook/Windows-serial-configuration

exeファイルがダウンロードできますので、これを実行するとインストールできます。インストール前にUSBケーブルでmbedをPCと接続しておきます。

正常にインストールが完了すると、Windowsのデバイスマネージャのポート(COMとLPT)のところに”mbed Serial Port(COMx)”と表示され、確認できます。このときのCOMx(COM3など)がシリアルのCOMポートの番号となります。

●ターミナルソフト

シリアル通信するためには、PC側にターミナルソフトを用意する必要があります。WindowXPあたりまでは、ハイパーターミナルというターミナルソフトが標準でついていましたが、Vista以降はついていません。フリーのソフトがいろいろあるので、それを利用します。

私は、”Tera Term”というアプリを使用しています。vectorなどで無料ダウンロードできます。

http://www.vector.co.jp/

●シリアル通信のインスタンス

USB I/Fをシリアルポートとして使用するには以下のようにしてインスタンスを生成します。

Serial pc(USBTX, USBRX); // USBシリアルポートのインスタンス

ここでは、インスタンス名を”pc”としています。

引数の”(USBTX、USBRS)”は、USBポートを使う場合の値です。USBポートではなく、シリアルポートを使う場合は、アサインされているシリアル信号のポート番号”(p9, p10)”、”(p13, p14)”、”(p28, p27)”のどれかを設定します。

●通信パラメータ

“format(bits, paritey, stop_bits)” で設定します。デフォルトでは9600bps, パリティなしに設定されています。

送受信

1文字送信には”putc()”、1文字受信には”getc()”を使います。

また、文字列を出力したい場合は、”printf()”が使えます。書式指定可能です。

なお、割込みを使わないで受信する場合は、”readable()”を使って受信データがあるかどうか確認してから”getc()”で1文字取り出すようにします。使用例参照。

●割込み

送信割込みはあまり使わないかもしれませんが、受信割込みは使用頻度が高いと思います。

割込みを使用する場合は、割込みサービスルーチン(割込みハンドラ)を用意し、それをあらかじめ登録しておく必要があります。登録には”attach”を使います。送信割込みハンドラを”isrTx()”、受信割込みハンドラを”isrRx()”とすると、次のように登録します。

    pc.attach(isrTx, Serial::TxIrq);    // 送信割込みハンドラ登録
    pc.attach(isrRx, Serial::RxIrq);    // 送信割込みハンドラ登録

●単純に文字列を出力する例

3秒毎に固定文字列を送信する処理の例です。

#include "mbed.h"

Serial pc(USBTX, USBRX); // USBシリアルポートのインスタンス

int main() {
    while (1) {
        pc.printf("hello mbed!\r\n");
        wait(3);
    }
}

●受信した文字を送り返す(エコーバック)例 (割込み不使用)

受信した文字を送り返す処理です。PCターミナルソフトのキーボードから何か文字を打ち込むと、ターミナルソフトへその文字が表示されます(エコーバック)。

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx

int main() {
    char ch;
    while(1) {
        if(pc.readable()) {    // 受信確認
            ch = pc.getc();    // 1文字取り出し
            pc.putc(ch);       // 送信
        }
    }
}

おそらく、送受信ともリングバッファになっていると思うので、普通は割込み使わずにこの受信方法でも問題ないと思います。

●受信した文字を送り返す(エコーバック)例 (割込み使用)

割込みを使った場合のエコーバック処理の例です。PCターミナルソフトのキーボードから何か文字を打ち込むと、ターミナルソフトへその文字が表示されます。

#include "mbed.h"

Serial pc(USBTX, USBRX); // USBシリアルポートのインスタンス

// 受信割込みハンドラ
void isrRx() {
    char ch;
    ch = pc.getc();         // 1文字受信バッファより取り出し
    pc.putc(ch);            // 送信
}

int main() {
    pc.attach(isrRx, Serial::RxIrq);   // 割込みハンドラ登録
    while (1) {}
}

コメントは受け付けていません。