Open a streaming session against a serial port on the box and drive your DUT’s
console from a test.
Enabling the feature
UART sessions ride on Socket.IO, so they are behind a cargo feature:
The uart feature implies blocking. There is no async equivalent.
Handle
uart() is the only handle constructor that returns a Result. Every other net
handle is inert until you call a method; this one connects the session and starts
streaming immediately, so it can fail right here.
Methods
Method Reference
read(timeout: Duration) -> Result<Vec<u8>>
Bytes arriving within timeout. May return empty.
read() waits out the full timeout when the device is idle. Use try_read() in
a poll loop, or every iteration costs the whole timeout.
try_read() -> Result<Vec<u8>>
Bytes already received, without waiting.
wait_for(needle: &[u8], timeout: Duration) -> Result<Vec<u8>>
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.
write(data: &[u8]) -> Result<()> and write_str(s: &str) -> Result<()>
Write to the device.
last_status() -> Option<&str>
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”.
stop() -> Result<()>
Stop cleanly and close the port on the box. Consumes the session. Dropping it also
stops the session, but stop() surfaces errors.
Examples
Wait for a boot banner, then drive the console
Survive a reflash without losing the session
Supported Hardware
Notes
- The box owns the port exclusively, and only one session per net or device is
allowed. A second opener gets
Error::Stream saying the port is already in use.
That includes a session your own previous test leaked — call stop().
- 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.