说到Linux下的串口调试,不少人第一反应就是物理串口不够用,或者手头根本没有硬件。这时候虚拟串口软件就成了绕不开的工具。所谓虚拟串口,就是在系统里用软件模拟出一对串口,数据从一个口进,从另一个口出,完全不用依赖真实硬件。对嵌入式开发、工业控制、物联网设备调试来说,这几乎是个标配需求。
哪些Linux虚拟串口软件免费又好用

Linux生态里免费的工具其实不少,关键看你怎么挑。socat算是元老级的命令行工具,功能非常强大,一条命令就能创建一对虚拟串口。比如socat -d -d pty,raw,echo=0 pty,raw,echo=0,跑完就能看到生成了两个设备节点,比如/dev/pts/2和/dev/pts/3,直接拿它们当真实串口用就行。这个工具轻量、稳定,几乎任何Linux发行版都能用包管理器装上。
还有个叫tty0tty的模块,它直接在内核层面虚拟串口linux 虚拟串口软件,性能比socat更好linux 虚拟串口软件,对时序要求高的场景更合适。不过tty0tty需要编译内核模块,安装过程稍微麻烦点,适合有点Linux基础的人。装好之后会在/dev目录下生成tnt0到tnt7一共8个虚拟串口,两两配对,用起来很顺手。

虚拟串口软件在开发调试中怎么用
实际调试时,虚拟串口的价值体现在很多细节上。比如你写了一个串口通信程序,没有硬件怎么测试?用虚拟串口把程序的两个实例连起来,一个发数据,一个收数据,整个通信链路就通了。甚至可以用一个终端开minicom连虚拟串口A,另一个终端开cat命令读虚拟串口B,手动敲数据测试协议解析。

更进阶一点的用法是结合脚本做自动化测试。拿socat举例,你可以把虚拟串口对接到网络端口上,让远程设备的数据通过TCP转发过来,本地程序就像在操作本地串口一样。这在远程调试嵌入式设备时特别有用,省得来回跑现场。
遇到权限问题怎么快速解决
虚拟串口用起来最头疼的就是权限问题。默认生成的虚拟串口设备节点通常属于root用户和dialout组,普通用户读写会报Permission denied。简单粗暴的办法是把用户加到dialout组里,sudo usermod -a -G dialout $USER,然后退出重新登录。或者直接用sudo运行调试程序,但这样不太安全,适合临时用。

还有个更灵活的办法是用udev规则。写一条规则自动把虚拟串口的所属组改成你的用户组,或者设成666权限让所有人可读写。比如创建/etc/udev/rules.d/99-virtual-serial.rules,内容写KERNEL=="tnt*", MODE="0666",重载udev规则后,所有tnt开头的虚拟串口就都没权限限制了。
虚拟串口软件选哪个取决于具体场景
没有绝对最好的虚拟串口软件,只有最适合你当前需求的。做简单的两机通信测试,socat足够轻量灵活,一条命令搞定。要是做压力测试或者需要高频率收发数据,tty0tty的内核模块方案更靠谱。还有种场景是跟Windows虚拟机里的串口软件配合,这时可以考虑用串口重定向工具,比如com0com的Linux移植版,或者用socket把串口数据桥接到Windows那边。

另外提醒一下,有些商业软件也提供Linux版本的虚拟串口,比如VSPE的Linux版linux系统镜像下载,虽然功能花哨,但免费版有限制。如果只是个人学习或小团队开发,开源工具完全够用,没必要花那个冤枉钱。
虚拟串口软件说到底就是个桥梁,把软件和硬件之间的物理依赖解耦了。理解了这个本质linux主机,选工具就不会被花哨的功能带偏。先想清楚你的数据流从哪里来到哪里去,然后挑个顺手的方式把通道建起来,剩下的都是细节。
