use serial; use serial::prelude::*; use utilities::prelude::*; use std::ffi::OsStr; use std::time::Duration; fn main() -> VerboseResult<()> { let mut port = open("/dev/ttyACM0")?; write(&mut port, "hello world")?; let msg = read(&mut port)?; println!("{}", msg); Ok(()) } fn open + ?Sized>(port: &T) -> VerboseResult { let mut port = serial::open(port).map_err(|_| "could not open serial port")?; port.reconfigure(&|port_settings| { port_settings.set_baud_rate(serial::Baud9600)?; port_settings.set_char_size(serial::Bits8); port_settings.set_parity(serial::ParityNone); port_settings.set_stop_bits(serial::Stop1); port_settings.set_flow_control(serial::FlowNone); Ok(()) }) .map_err(|_| "failed configuring serial port")?; port.set_timeout(Duration::from_millis(1000)) .map_err(|_| "failed setting time out for serial port")?; Ok(port) } fn read(port: &mut T) -> VerboseResult { let mut buf: Vec = (0..255).collect(); port.read(&mut buf[..]) .map_err(|_| "failed reading serial port")?; Ok(String::from_utf8(buf).map_err(|_| "failed converting utf8 buffer")?) } fn write(port: &mut T, msg: &str) -> VerboseResult<()> { port.write(msg.as_bytes()) .map_err(|_| "failed writing to serial port")?; Ok(()) }