Asynchronous Serial Host protocol, version 2
The official protocol description can be found at silabs.com.
This library provides the Actor struct which implements the actor model
for the ASHv2 protocol.
It is to be initialized with the underlying serial port, response channel sender and messaging channel size.
use ashv2::{Actor, BaudRate, FlowControl, open};
use tokio::sync::mpsc::channel;
#[tokio::main]
async fn main() {
// Open the serial port connected to the NCP.
let serial_port = open("/dev/ttymxc3", BaudRate::RstCts, FlowControl::Hardware)
.expect("Failed to open serial port");
// Crate a response channel with a specified size.
let (response_tx, response_rx) = channel(64);
// Create the ASHv2 actor, passing in the response transmitter
// and a messaging channel size.
let actor = Actor::new(serial_port, response_tx, 64).expect("Failed to create actor");
// Spawn the actor's tasks to handle communication.
// This also returns a proxy to communicate with the actor.
let (tasks, proxy) = actor.spawn();
// Send a data frame to the NCP using the proxy.
// Example: EZSP version command
let request_data = vec![0x00, 0x00, 0x00, 0x02];
proxy
.send(request_data.into_iter().collect())
.await
.expect("Failed to send request")
.await
.expect("Failed to receive response")
.expect("Actor reported an error");
// Receive a response from the NCP.
if let Some(response) = response_rx.recv().await {
println!("Received response: {response:?}");
}
// Optionally terminate the actor tasks when done.
// This will return the original serial port on successful termination.
let _serial_port = tasks.terminate().await.expect("Actor tasks failed to join");
}Expected result:
Received response: [0, 128, 0, 8, 2, 48, 106]
This project is free software and is not affiliated with Silicon Labs.
- Use
cargo fmt - Check code with
cargo clippy
- Special thanks to Simon Farnsworth, Kevin Reid and the rest of the great community at users.rust-lang.org.