Skip to main content
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.