bevy_serial
bevy_serial is a plugin to add non-blocking serial communication to bevy. This plugin is based on mio-serial
that can realize non-blocking high performance I/O.
Reading and writing from/to serial port is realized via bevy's event system. Each serial port is handled via port
name or a unique label you choose.
Simple Example
Here is a simple example:
use bevy::prelude::*;
use bevy_serial::{SerialPlugin, SerialReadEvent, SerialWriteEvent};
struct SerialWriteTimer(Timer);
fn main() {
App::build()
.add_plugins(MinimalPlugins)
.add_plugin(SerialPlugin::new("COM5", 115200))
.insert_resource(SerialWriteTimer(Timer::from_seconds(1.0, true)))
.add_system(read_serial.system())
.add_system(write_serial.system())
.run();
}
fn read_serial(mut ev_serial: EventReader<SerialReadEvent>) {
for SerialReadEvent(label, buffer) in ev_serial.iter() {
let s = String::from_utf8(buffer.clone()).unwrap();
println!("received packet from {}: {}", label, s);
}
}
fn write_serial(
mut ev_serial: EventWriter<SerialWriteEvent>,
mut timer: ResMut<SerialWriteTimer>,
time: Res<Time>,
) {
if timer.0.tick(time.delta()).just_finished() {
let buffer = b"Hello, bevy!";
ev_serial.send(SerialWriteEvent("COM5".to_string(), buffer.to_vec()));
}
}
Multiple Serial Ports with Additional Settings
You can add multiple serial ports with additional settings.
use bevy::prelude::*;
use bevy_serial::{
DataBits, FlowControl, Parity, SerialPlugin, SerialReadEvent, SerialSetting, SerialWriteEvent,
StopBits,
};
use std::time::Duration;
struct SerialWriteTimer(Timer);
fn main() {
App::build()
.add_plugins(MinimalPlugins)
.add_plugin(SerialPlugin {
settings: vec![SerialSetting {
label: Some("my_serial".to_string()),
port_name: "COM5".to_string(),
baud_rate: 115200,
data_bits: DataBits::Eight,
flow_control: FlowControl::None,
parity: Parity::None,
stop_bits: StopBits::One,
timeout: Duration::from_millis(0),
}],
})
.insert_resource(SerialWriteTimer(Timer::from_seconds(1.0, true)))
.add_system(read_serial.system())
.add_system(write_serial.system())
.run();
}
fn read_serial(mut ev_serial: EventReader<SerialReadEvent>) {
for SerialReadEvent(label, buffer) in ev_serial.iter() {
let s = String::from_utf8(buffer.clone()).unwrap();
println!("read packet from {}: {}", label, s);
}
}
fn write_serial(
mut ev_serial: EventWriter<SerialWriteEvent>,
mut timer: ResMut<SerialWriteTimer>,
time: Res<Time>,
) {
if timer.0.tick(time.delta()).just_finished() {
let buffer = b"Hello, bevy!";
ev_serial.send(SerialWriteEvent("my_serial".to_string(), buffer.to_vec()));
}
}
License
MIT