Skip to main content
对 Box 上的某个串口打开一个流式会话,并从测试中驱动被测设备的控制台。

启用该 feature

UART 会话基于 Socket.IO,因此它位于一个 cargo feature 之后:
uart feature 隐含启用 blocking。要使用 AsyncUart,请同时启用 uart 和 async。AsyncLagerBox::uart() 和 uart_with() 会打开它,它的方法与 Uart 相同,其中 read、wait_for、write 和 stop 需要 .await。

句柄

uart() 和 uart_with() 是仅有的返回 Result 的句柄构造方法。其他每个 Net 句柄在您调用方法之前都是静止的,而它们会连接会话并立即开始流式传输,因此在这一步就可能失败。
要让本次会话使用不同的串口设置,请传入一个 UartConfig:
保留为 None 的字段沿用 Net 保存的设置,保存的 Net 本身不会被修改。

方法

类型

UartConfig

UartSession

lager.uart_sessions() 为每个占用 Net 的会话返回一个 UartSession,包含 netname、device_path、sid、heartbeat_age_seconds、client_connected 和 reader_alive。

方法参考

read(timeout: Duration) -> Result<Vec<u8>>

在 timeout 时间内到达的字节。该调用可能返回空 vector。
设备空闲时,read() 会把整个超时时间等满。在轮询循环里请用 try_read(),否则每一轮迭代都要花掉整个超时时长。

try_read() -> Result<Vec<u8>>

已经收到的字节,不等待。

wait_for(needle: &[u8], timeout: Duration) -> Result<Vec<u8>>

一直累积,直到出现 needle。 返回: 直到该标记为止、并且包含该标记的全部内容;剩余部分继续留在缓冲区里。空标记会立即返回;没找到则是 Error::Timeout。

write(data: &[u8]) -> Result<()> 和 write_str(s: &str) -> Result<()>

向设备写入。

last_status() -> Option<&str>

最近一次会话状态通知,在读取过程中更新。当一个 USB 串口适配器正在重新枚举时 —— 因为某个集线器端口被断电重启,或者被测设备被重新烧录 —— 它读到的是 "reconnecting",然后是 "reconnected"。检查它可以区分”被测设备很安静”和”适配器不见了”。

stop() -> Result<()>

干净地停止,并关闭 Box 上的该端口。它会消耗掉该会话。把会话 drop 掉同样会停止它,但 stop() 会把错误暴露出来。

LagerBox::uart_sessions() -> Result<Vec<UartSession>>

列出占用 Net 的会话,并附带存活状态的详细信息。需要 Box 软件 0.46.0 或更高版本。较旧的 Box 会返回 Error::UnsupportedByBox。

LagerBox::release_uart_session(name: &str) -> Result<Vec<String>>

强制释放占用某个 Net 的会话。需要 Box 软件 0.46.0 或更高版本。

示例

等待启动横幅,然后驱动控制台

在重新烧录过程中保住会话

释放被泄漏会话占用的 Net

受支持的硬件

说明

  • Box 独占该端口,并且每个 Net 或设备只允许一个会话。 第二个打开者会得到 Error::UartInUse。这也包括您自己上一个测试泄漏下来的会话 —— 请调用 stop()。held_by 指明要释放的 Net(Box 0.49.0 或更高版本)。当两个 Net 共用一台设备时,它指的是另一个 Net。
  • 连接确认的超时是 15 秒;超过它是 Error::Timeout。
  • 字节是原始的。没有行规程、不处理回显、也不做编码转换;wait_for 是按字节工作的。
  • 会话会在 Socket.IO 握手时带上网关 bearer 令牌,因此受网关保护的 Box 无需额外配置。
  • 在 FTDI 多通道芯片上,UART 四个通道都能用,这与只限于通道 A 和 B 的 MPSSE 协议(debug、spi、i2c)不同。在单通道的 FT232H 上,占用 UART 会让 MPSSE 类角色不可用,反之亦然。