最近在玩 ESP32 ,顺手做了一个小工具:Wiremux 。
GitHub: https://github.com/magicdian/wiremux
ESP Registry:
- esp-wiremux
- wiremux-core
平时做嵌入式开发时,串口通常会同时承担很多事情:启动日志、运行日志、console 输入输出、日志诊断信息等等。
最近我在 ESP32 上接入了官方 console 模块,可以通过串口输入一些简单命令。但问题是,我的日志也输出到同一个控制台,所以 输入命令或看命令结果时,经常会被不断刷新的日志打断。
ESP32 虽然有多个 UART ,但开发板上的 USB Serial/JTAG 通常只对应一个默认串口。我又不想额外接线,所以就做了 Wiremux 。
Wiremux 做的事情很简单:在一个串口连接上复用多个逻辑通道。
比如:
- channel 1 用来跑 console
- channel 2 用来看日志
- channel 3 用来输出 telemetry
- channel 4 可以放 UTF-8 文本或其他业务数据
设备侧把不同类型的数据写到不同 channel ,电脑上的 host 工具负责解码和过滤。这样一个物理串口仍然只有一个,但使用时可以 像多个独立通道一样查看,互相不打断。
不配置过滤时,TUI 会显示所有通道,每条记录前面带有 channel 信息:
![[分享创造] [开源] 给串口用的 "tmux" 🤡](/proxy.php?url=https%3A%2F%2Fgithub.com%2Fmagicdian%2Fwiremux%2Fraw%2Fmain%2Fdocs%2Fimages%2Ftui_all.png)
切到 console 通道后,可以专心输入命令和看返回结果,不被日志刷屏影响:
![[分享创造] [开源] 给串口用的 "tmux" 🤡](/proxy.php?url=https%3A%2F%2Fgithub.com%2Fmagicdian%2Fwiremux%2Fraw%2Fmain%2Fdocs%2Fimages%2Ftui_channel1.png)
也可以单独查看日志或其他业务通道:
![[分享创造] [开源] 给串口用的 "tmux" 🤡](/proxy.php?url=https%3A%2F%2Fgithub.com%2Fmagicdian%2Fwiremux%2Fraw%2Fmain%2Fdocs%2Fimages%2Ftui_channel2.png)
UTF-8 文本通道也可以正常显示:
![[分享创造] [开源] 给串口用的 "tmux" 🤡](/proxy.php?url=https%3A%2F%2Fgithub.com%2Fmagicdian%2Fwiremux%2Fraw%2Fmain%2Fdocs%2Fimages%2Ftui_utf8.png)
目前项目里已经有 ESP-IDF component 和 demo ,可以直接通过 ESP Registry 安装;核心协议部分是独立 C 实现,后续也可以接到 其他串口类场景里。
host 侧可以通过类似 tmux 的快捷键进行 channel 的切换:ctrl + b + channel-id (例如 ctrl + b 1)