1バイトを受信する
これまではマイクロコントローラーからコンピューターへデータを送信してきました。今度は逆、つまりコンピューターからデータを受信してみましょう。幸い、この場合も embedded-hal が対応してくれています。
#![no_main]
#![no_std]
use cortex_m_rt::entry;
use rtt_target::{rtt_init_print, rprintln};
use panic_rtt_target as _;
#[cfg(feature = "v1")]
use microbit::{
hal::prelude::*,
hal::uart,
hal::uart::{Baudrate, Parity},
};
#[cfg(feature = "v2")]
use microbit::{
hal::prelude::*,
hal::uarte,
hal::uarte::{Baudrate, Parity},
};
#[cfg(feature = "v2")]
mod serial_setup;
#[cfg(feature = "v2")]
use serial_setup::UartePort;
#[entry]
fn main() -> ! {
rtt_init_print!();
let board = microbit::Board::take().unwrap();
#[cfg(feature = "v1")]
let mut serial = {
uart::Uart::new(
board.UART0,
board.uart.into(),
Parity::EXCLUDED,
Baudrate::BAUD115200,
)
};
#[cfg(feature = "v2")]
let mut serial = {
let serial = uarte::Uarte::new(
board.UARTE0,
board.uart.into(),
Parity::EXCLUDED,
Baudrate::BAUD115200,
);
UartePort::new(serial)
};
loop {
let byte = nb::block!(serial.read()).unwrap();
rprintln!("{}", byte);
}
}
バイト送信プログラムと比べて変更された箇所は、main() の最後にあるループだけです。ここでは embedded-hal が提供する read() 関数を使って、1バイトが利用可能になるまで待機し、それを読み取ります。続いて、そのバイトを RTT デバッグコンソールに表示し、実際にデータが届いているかどうかを確認します。
なお、このプログラムを書き込んで minicom 内で文字を入力し、それをマイクロコントローラーに送信すると、RTT コンソールには数値しか表示されません。これは、受信した u8 を実際の char に変換していないためです。u8 から char への変換はとても簡単なので、RTT コンソール上で文字を表示したい場合は、この作業は皆さんにお任せします。