simple/
simple.rs

1use bevy::prelude::*;
2use bevy_serial::{SerialPlugin, SerialReadMessage, SerialWriteMessage};
3
4// to write data to serial port periodically
5#[derive(Resource)]
6struct SerialWriteTimer(Timer);
7
8const SERIAL_PORT: &str = "/dev/ttyUSB0";
9
10fn main() {
11    App::new()
12        .add_plugins(MinimalPlugins)
13        // simply specify port name and baud rate for `SerialPlugin`
14        .add_plugins(SerialPlugin::new(SERIAL_PORT, 115200))
15        // to write data to serial port periodically (every 1 second)
16        .insert_resource(SerialWriteTimer(Timer::from_seconds(
17            1.0,
18            TimerMode::Repeating,
19        )))
20        // reading and writing from/to serial port is achieved via bevy's event system
21        .add_systems(Update, read_serial)
22        .add_systems(Update, write_serial)
23        .run();
24}
25
26// reading event for serial port
27fn read_serial(mut reader: MessageReader<SerialReadMessage>) {
28    // you can get label of the port and received data buffer from `SerialReadMessage`
29    for SerialReadMessage(label, buffer) in reader.read() {
30        let s = String::from_utf8(buffer.clone()).unwrap();
31        println!("Received packet from {label}: {s}");
32    }
33}
34
35// writing event for serial port
36fn write_serial(
37    mut writer: MessageWriter<SerialWriteMessage>,
38    mut timer: ResMut<SerialWriteTimer>,
39    time: Res<Time>,
40) {
41    // write msg to serial port every 1 second not to flood serial port
42    if timer.0.tick(time.delta()).just_finished() {
43        // you can write to serial port via `SerialWriteMessage` with label and buffer to write
44        let buffer = b"Hello, bevy!";
45        writer.write(SerialWriteMessage(SERIAL_PORT.to_string(), buffer.to_vec()));
46    }
47}