UART sessions ride on Socket.IO, so they are behind a cargo feature:
[dev-dependencies]lager = { package = "lager-net", version = "0.9", features = ["uart"] }
The uart feature implies blocking. For AsyncUart, enable uart and async
together. AsyncLagerBox::uart() and uart_with() open it, and its methods match
Uart, with read, wait_for, write and stop awaited.
use lager::LagerBox;let lager = LagerBox::from_env()?;let mut uart = lager.uart("uart1")?;
uart() and uart_with() are the only handle constructors that return a Result.
Every other net handle is inert until you call a method. They connect the session
and start streaming immediately, so they can fail right here.
To open with different serial settings for this session, pass a UartConfig:
lager.uart_sessions() returns one UartSession for each session holding a net. It
has netname, device_path, sid, heartbeat_age_seconds, client_connected and
reader_alive.
Accumulate until needle appears.Returns: everything up to and including the needle; the remainder stays
buffered. An empty needle returns immediately; a miss is Error::Timeout.
The most recent session status notification, updated during reads. While a USB serial
adapter re-enumerates — because a hub port was cycled, or the DUT was reflashed — this
reads "reconnecting" and then "reconnected". Checking it distinguishes “the DUT is
quiet” from “the adapter went away”.
use std::time::Duration;dbg.flash_bin("target/app.bin", 0x0)?; // the adapter may re-enumerate// The session reconnects on its own; watch the status while it does.let banner = uart.wait_for(b"ready", Duration::from_secs(30))?;println!("status during reflash: {:?}", uart.last_status());assert!(String::from_utf8_lossy(&banner).contains("ready"));
The box owns the port exclusively, and only one session per net or device is
allowed. A second opener gets Error::UartInUse. That includes a session your own
previous test leaked — call stop(). held_by names the net to release (box 0.49.0
or later). When two nets share one device, that is the other net.
The connect confirmation timeout is 15 seconds; failing it is Error::Timeout.
Bytes are raw. There is no line discipline, no echo handling and no encoding
conversion; wait_for works on bytes.
Sessions carry the gateway bearer token on the Socket.IO handshake, so a gated box
needs no extra setup.
On FTDI multi-channel parts, UART works on all four channels, unlike the MPSSE
protocols (debug, spi, i2c) which are limited to channels A and B. On a single-channel
FT232H, claiming UART makes the MPSSE roles unavailable and vice versa.