Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

1バイトを送信する

最初の課題は、シリアル接続を介してマイクロコントローラーからコンピューターへ1バイトを送信することです。

そのために、次のスニペットを使います(これはすでに 11-uart/examples/send-byte.rs にあります):

#![no_main]
#![no_std]

use cortex_m::asm::wfi;
use cortex_m_rt::entry;
use panic_rtt_target as _;
use rtt_target::rtt_init_print;

use microbit::{
    hal::uarte,
    hal::uarte::{Baudrate, Parity},
};

use serial_setup::UartePort;

#[entry]
fn main() -> ! {
    rtt_init_print!();
    let board = microbit::Board::take().unwrap();

    let mut serial = {
        let serial = uarte::Uarte::new(
            board.UARTE0,
            board.uart.into(),
            Parity::EXCLUDED,
            Baudrate::BAUD115200,
        );
        UartePort::new(serial)
    };

    serial.write(b'X').unwrap();
    serial.flush().unwrap();

    loop {
        wfi();
    }
}

ここで使われているライブラリの1つである serial_setup モジュールは、crates.io 由来ではなく、このプロジェクトのために書かれたものだと気づくかもしれません。serial_setup の目的は、UARTE ペリフェラルを扱いやすくラップすることです。必要なら、このモジュールが具体的に何をしているのか確認しても構いませんが、この章全体を理解するうえでは必須ではありません。

次に、UARTE の初期化について説明します。UARTE は次のコードで初期化します:

uarte::Uarte::new(
    board.UARTE0,
    board.uart.into(),
    Parity::EXCLUDED,
    Baudrate::BAUD115200,
);

この関数は、Rust における UARTE ペリフェラルの表現 (board.UARTE0) と、ボード上の TX/RX ピン (board.uart.into()) の所有権を受け取ります。これにより、それらを使用している間は、ほかの誰も UARTE ペリフェラルやピンを勝手に触れなくなります。その後、コンストラクタに2つの設定オプションを渡します。ボーレート(これはもうおなじみでしょう)と、「パリティ」と呼ばれるオプションです。パリティは、シリアル通信回線が受信したデータが伝送中に破損していないかを確認できるようにする仕組みです。ここではそれを使いたくないので、単に除外します。その後、使えるようにそれを UartePort 型でラップします。

初期化の後、新しく作成した UART インスタンス経由で X(ASCII のバイト値 88)を送信します。これらのシリアル関数は「ブロッキング」です。データが送信されるまで待ってから戻ります。これは常に望ましいとは限りません。マイクロコントローラーは、バイトが線上に送出されるのを待っている間にも多くの処理を行えるからです。しかし、この場合はそのほうが都合がよく、そもそもほかにやる作業もありませんでした。

最後に、flush() でシリアルポートをフラッシュします。これは、UARTE が送信するバイト数がある程度たまるまで出力をバッファリングする可能性があるためです。flush() を呼び出すと、さらに待つのではなく、その時点で保持しているバイトをすぐに書き出すよう強制できます。

テストする

これをフラッシュする前に、必ず minicom/PuTTY を起動しておいてください。シリアル通信で受信したデータは保存されたりしないので、その場で確認する必要があります。シリアルモニターの準備ができたら、第5章と同じようにプログラムを書き込めます:

$ cargo embed --example send-byte
  (...)

書き込みが終わると、minicom/PuTTY の端末に文字 X が表示されるはずです。おめでとうございます!

見逃した場合は、MB2 の背面にあるリセットボタンを押してください。するとプログラムが最初から開始され、再び X を送信します。