直接在虚拟机里敲一条命令或看一眼设备管理器,就能查到串口是否存在;但要让串口真正可用,Windows和Linux的配置路径完全不同,下面把查询和配置步骤拆开讲清楚。
虚拟机串口怎么查?先分清Windows和Linux的查询路径
很多人上来就打开虚拟机设置界面找串口,其实查串口最靠谱的方式是在虚拟机操作系统内部确认设备是否被识别,Windows和Linux的查询命令不同,但思路一致:先看硬件是否存在,再看驱动是否加载,最后看权限是否够用。
Windows虚拟机查串口:设备管理器与命令行双保险
Windows系统下,右键点击“此电脑”选择“管理”,进入“设备管理器”,展开“端口(COM和LPT)”,如果虚拟机里配置了串口,这里会显示类似 “Communications Port (COM1)” 的条目,没看到的话,点菜单栏的“操作”->“扫描检测硬件改动”,还不行就检查虚拟机设置里是否真的添加了串口硬件。
命令行方式更直接,按 Win + R 输入 cmd 回车,执行:
wmic path Win32_SerialPort get Name,DeviceID,Description
这个命令会列出所有可用串口及其描述,如果输出为空,说明系统层面没有识别到串口,问题多半出在虚拟机硬件配置层,再用 PowerShell 验证一下:
Get-CimInstance Win32_SerialPort | Select-Object Name,DeviceID
两条命令结果一致,基本可以确认串口驱动正常,此时如果你用的是 Windows 系统虚拟机串口设置方法,重点就转向了串口参数的配置。
Linux虚拟机查串口:dmesg和ls /dev/ttyS
Linux下查串口有两个经典命令,打开终端,先看内核是否发现设备:
dmesg | grep -i ttyS
正常会输出类似 ttyS0 at I/O 0x3f8 的信息,后面跟着中断号和端口号,如果没有任何输出,说明串口设备没被内核识别。
然后查看设备节点是否存在:
ls -l /dev/ttyS
看到 crw-rw---- 1 root dialout 4, 64 这样的字符设备文件,就是串口节点,注意权限字段里的 dialout 用户组,当前用户不在这个组里就无法打开串口,用 groups 命令查看自己属于哪些组,没有 dialout 就执行:
sudo usermod -aG dialout $USER
注销重新登录生效,这套操作就是标准的 Linux 虚拟机串口配置步骤,硬件识别、设备节点、用户权限三件事缺一不可。
Windows系统虚拟机串口设置方法:从添加硬件到映射命名管道
Windows虚拟机里查到了串口,但连不上外部设备,通常是虚拟机软件层面的配置问题,以 VMware Workstation 为例,整个设置过程分三步。
在虚拟机设置里添加串口硬件
关闭虚拟机,在 VMware 中打开“虚拟机设置”,选择“添加设备”,点击“串行端口”,添加后可以看到两类连接方式:使用物理串口 和 使用命名管道。
如果你宿主机有真实 COM 口,选“使用物理串口”,下拉菜单里选择对应端口,COM1,注意勾选“打开电源时连接”,以免开机后设备未激活。
大多数场景下,我们用的是命名管道方式,让虚拟机串口和宿主机上的其他程序通信,选择“使用命名管道”,输入一个管道名,
\.pipevm_serial
管道名的命名规则类似文件路径,不能有中文或空格,另一端选 “另一台程序”,因为通常是一个串口工具在生产端等待连接。
配置串口参数并解决常见连接失败
添加完硬件,进入虚拟机系统,在设备管理器里确认 COM 端口号后,还需要设置波特率、数据位等参数,右键串口设备选择“属性”,在“端口设置”标签页里配置:
- 波特率:常见 115200 或 9600,取决于你调试的设备
- 数据位:默认 8
- 校验位:无
- 停止位:1
- 流控制:无
这些参数必须和宿主机端串口工具完全一致,否则会出现乱码或数据错乱,业内专家指出,命名管道方式下最容易犯的错是宿主机端串口工具没有提前创建管道服务,导致虚拟机开机后串口一直处于未连接状态,解决方法是先打开宿主机的串口调试工具,选择“连接命名管道”并输入完全相同的管道名,然后再启动虚拟机。
验证Windows虚拟机串口是否生效
参数配好后,最简单的验证方法是使用 Windows 自带的 mode 命令:
mode COM1
如果输出 BAUD=115200 PARITY=N DATA=8 STOP=1,说明串口可访问,再配合写入测试:
echo test > COM1
这条命令会把字符串发到串口缓冲区,如果宿主机端串口工具能收到,整个链路就通了,注意 echo 重定向到 COM 口在某些 Windows 版本下会提示“拒绝访问”,这时候先检查串口是否被其他程序占用。
Linux虚拟机串口配置步骤详解:修改配置文件与启动串口登录
Linux 虚拟机查串口通常很容易,但配置起来比 Windows 更依赖文本操作,除了在图形化虚拟机软件里添加串口硬件外,你还需要在系统内部做两件事:让 getty 服务监听串口,以及设置正确的权限。
修改虚拟机配置文件增加串口设备
以 VMware 为例,虚拟机对应的 .vmx 文件可以用记事本打开,添加以下内容:
serial0.present = "TRUE"
serial0.fileType = "pipe"
serial0.fileName = "/tmp/vm_serial"
serial0.yieldOnMsrRead = "TRUE"
fileName 是宿主机上的管道路径,Linux 宿主机下通常放在 /tmp 或 /var/run,如果你用的是 VirtualBox,对应命令是:
VBoxManage modifyvm "虚拟机名称" --uart1 0x3F8 4 --uartmode1 server /tmp/vm_serial
修改配置文件后重启虚拟机,然后回到系统内执行 dmesg | grep ttyS,看到新设备出现就说明硬件配置成功,这个过程可以概括为 Linux 虚拟机串口配置步骤 里的“加硬件”环节。
使用systemd或getty启动串口登录
很多时候我们想让虚拟机串口作为调试控制台,开机就能看启动日志,这时需要让 systemd 在串口上启动一个 getty 服务,执行:
sudo systemctl enable serial-getty@ttyS0.service
sudo systemctl start serial-getty@ttyS0.service
如果串口号不是 ttyS0,把命令里的数字改掉,设置完成后,宿主机的串口工具连接到这个虚拟串口,重启虚拟机就能看到完整的引导日志。
Linux下串口权限和速度设置
访问串口需要读写权限,除了加用户组,还可以用 chmod 临时开放:
sudo chmod 666 /dev/ttyS0
重启后权限会恢复,所以临时调试够用,长期使用还是建议用 udev 规则永久配置,设置串口速度用 stty:
stty -F /dev/ttyS0 115200 cs8 -cstopb -parenb
设置后可以用 stty -F /dev/ttyS0 -a 查看当前参数,会输出类似 speed 115200 baud; 的确认信息,这里要注意,Linux 下串口工具和虚拟机里的波特率必须匹配,否则就会出现能打开但收不到数据的尴尬情况。
虚拟机串口无法连接宿主机?排查这四处
查到了串口、配好了参数,但数据就是不通,根据经验,绝大多数问题来自以下四个环节。
检查管道模式是否匹配
Windows 下 VMware 串口设置里,“另一端”有两种选择:“另一台程序” 和 “虚拟机”,如果宿主机端是串口调试助手,必须选“另一台程序”,选了“虚拟机”表示两个虚拟串口互连,数据根本不会暴露给宿主机,这两者的区别很多第一次接触的人会搞混。
确认宿主机的安全软件拦截
Windows 宿主机上,防火墙或安全软件经常阻止进程访问命名管道,调试时临时关闭相关监控,或者在安全软件里添加串口工具的放行规则,Linux 宿主机则要检查 AppArmor 或 SELinux 策略,行业共识认为,虚拟机串口与宿主机管道通信属于进程间通信,SELinux 默认策略可能限制 virtio_console 相关访问。
查看虚拟机内串口是否被占用
Windows 下,串口工具或后台服务占用了 COM1,你的程序就打不开,用命令行查看占用:
netstat -an | findstr "COM"
Linux 下用 lsof /dev/ttyS0 查看哪个进程占用了串口,有进程占用时,先停掉它再测试。
对比物理串口的性能差异
虚拟机串口走的是虚拟化层,延迟比物理串口高,这是正常现象,如果你做的是高速数据采集,比如波特率超过 921600,虚拟机串口很可能丢包,物理串口直接挂在中断上,而虚拟串口需要经过宿主机的 IO 线程调度,实时性差不少。虚拟机串口和物理串口区别 的本质在于,前者适合调试和低速通信,后者适合对时序敏感的场景。
关于虚拟机串口查询与配置的常见问题
虚拟机串口用不了,宿主机能看到串口吗?
宿主机看不到虚拟机的串口,因为虚拟串口是虚拟机软件模拟出来的设备,并不真实存在于宿主机的设备列表里,你只能在虚拟机操作系统内部查看,如果虚拟机内也看不到,打开虚拟机设置,确认串口设备已经添加并且勾选了“连接”,再检查命名管道名是否填写正确。
Linux虚拟机串口权限不够怎么修复?
提示 Permission denied 时,先执行 ls -l /dev/ttyS0 看设备的用户组,主要方式是把当前用户加入 dialout 组,执行 sudo usermod -aG dialout 用户名,重新登录后用 groups 验证,临时使用可以 sudo chmod 666 /dev/ttyS0,但重启后失效。
虚拟机串口查到了但连接不上串口工具,怎么办?
从三个方向排查:第一,确认串口工具连接的管道名或物理端口和虚拟机配置完全一致;第二,确认串口参数,包括波特率、数据位、停止位和流控制,两边必须统一;第三,确认没有其他进程占用该串口,以上都正常,可以先把虚拟机暂停再恢复,有时候虚拟串口的热插拔功能会异常。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/616209.html





