启用该 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 类角色不可用,反之亦然。

