Ubuntu 20.04内核6.1.0环境下EMP2-X404模块驱动安装后无/dev/ttyXR设备的问题咨询
看起来你遇到了RS485模块驱动安装后设备节点不出现的典型问题,结合你的环境和给出的信息,我整理了几个可能的原因和对应的排查步骤,你可以一步步来试:
一、先确认驱动模块是否真的正常加载
虽然/proc/tty/drivers里有xrserial的条目,但这不代表驱动模块已经成功绑定到硬件上。你可以先执行这个命令检查模块状态:
lsmod | grep xrserial
如果没有任何输出,说明驱动模块根本没加载,尝试手动加载看看有没有报错:
sudo modprobe xrserial
如果加载时出现类似“Invalid module format”或者“Unknown symbol”的错误,大概率是厂商提供的驱动和你的6.1.0内核版本不兼容——毕竟Ubuntu 20.04默认内核是5.4,你升级到了6.1,驱动可能没适配新内核的API变化。这种情况你需要找厂商要适配6.1.x版本的驱动源码,自己重新编译安装,或者确认驱动是否支持这个内核版本。
二、查看内核日志找硬件识别问题
如果模块已经加载,但设备节点没出现,那很可能是驱动没能成功识别到你的EMP2-X404模块。赶紧看看内核日志里的相关信息:
dmesg | grep -i xrserial # 或者更宽泛地搜RS485相关 dmesg | grep -i rs485
如果日志里出现“probe failed”“no device found”这类提示,说明驱动找不到对应的硬件设备。这时候要考虑:
- minipcie模块是否插紧,有没有供电异常(有些RS485模块需要额外供电,看看模块上的指示灯是否亮);
- 可能是ACPI兼容性问题,你可以尝试修改grub启动参数:编辑
/etc/default/grub,把GRUB_CMDLINE_LINUX_DEFAULT里加上acpi_osi=!或者acpi_enforce_resources=lax,然后执行sudo update-grub重启系统,再看日志有没有变化。
三、手动创建设备节点(临时测试)
有时候驱动加载正常,但udev没自动生成/dev下的设备节点,你可以手动创建来测试:
从你给出的/proc/tty/drivers信息来看,xrserial的主设备号是30,次设备号范围是0-255。比如创建第一个RS485端口的设备节点:
sudo mknod /dev/ttyXR0 c 30 0 sudo chmod 666 /dev/ttyXR0
创建后你可以用screen /dev/ttyXR0 9600这类工具测试能不能访问,如果能正常使用,那问题就出在udev规则上。这时候你可以添加一个永久的udev规则:
在/etc/udev/rules.d/目录下创建99-xrserial.rules文件,内容如下:
KERNEL=="ttyXR*", MODE="0666"
然后重新加载udev规则:
sudo udevadm control --reload-rules && sudo udevadm trigger
之后重启或者重新插拔模块,应该就能自动生成/dev/ttyXR*节点了。
四、排查硬件本身问题
如果上面的步骤都没解决,建议换个minipcie插槽试试,排除插槽接触不良的问题;也可以把模块插到其他机器上测试,确认模块本身没有故障。
备注:内容来源于stack exchange,提问作者Vimer

