use bevy::prelude::*;
use bevy_serial::{
DataBits, FlowControl, Parity, SerialConfig, SerialPlugin, SerialReadMessage,
SerialWriteMessage, StopBits,
};
use std::sync::Arc;
use std::time::Duration;
#[derive(Resource)]
struct SerialWriteTimer(Timer);
const SERIAL_PORT: &str = "/dev/ttyUSB0";
const SERIAL_LABEL: &str = "my_serial";
fn main() {
App::new()
.add_plugins(MinimalPlugins)
.add_plugins(SerialPlugin::new_with_config(vec![SerialConfig {
label: Some(SERIAL_LABEL.to_string()),
port_name: SERIAL_PORT.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),
read_buffer_len: 2048,
read_result_handler: Some(Arc::new(|label, result| {
println!("Read result of {label}: {result:?}");
})),
write_result_handler: Some(Arc::new(|label, result| {
println!("Write result of {label}: {result:?}");
})),
}]))
.insert_resource(SerialWriteTimer(Timer::from_seconds(
1.0,
TimerMode::Repeating,
)))
.add_systems(Update, read_serial)
.add_systems(Update, write_serial)
.run();
}
fn read_serial(mut reader: MessageReader<SerialReadMessage>) {
for SerialReadMessage(label, buffer) in reader.read() {
let s = String::from_utf8(buffer.clone()).unwrap();
println!("Received packet from {label}: {s}");
}
}
fn write_serial(
mut writer: MessageWriter<SerialWriteMessage>,
mut timer: ResMut<SerialWriteTimer>,
time: Res<Time>,
) {
if timer.0.tick(time.delta()).just_finished() {
let buffer = b"Hello, bevy!";
writer.write(SerialWriteMessage(
SERIAL_LABEL.to_string(),
buffer.to_vec(),
));
}
}