|
CentOS 7 上串口能不能用,配置很多时候不取决于系统本身,串口而是配置你插上去的那根线、那颗芯片,串口甚至你用的配置是虚拟机还是物理机。我见过太多人上来就改 /etc/default/grub,串口结果重启完连 ttyS0 都找不到了。配置先别急,串口把线插好,配置打开终端敲一条命令: dmesg | grep tty 如果输出里出现 ttyS0、串口ttyUSB0 这类字样,配置说明内核已经认到了硬件。串口没有的配置话,检查 USB 转串口线是串口不是 CH340 或 PL2303 芯片,CentOS 7 默认内核 3.10 对这两类芯片支持还行,配置但有些廉价线用的是 FT232 假芯片,驱动会报错。我手头一根绿联的线,插上后 dmesg 显示 pl2303: probe of 1-1.2:1.0 failed with error -110,换根线立马就好。所以第一步永远是确认硬件识别。 物理串口在 CentOS 7 里通常对应 /dev/ttyS0 到 /dev/ttyS3,USB 转串口则是 /dev/ttyUSB0 起步。想确认哪个是哪个,用 ls -l /dev/serial/by-id/ 看软链接,比盲猜靠谱。比如: lrwxrwxrwx 1 root root 13 6月 12 10:23 usb-FTDI_FT232R_USB_UART_A50285BI-if00-port0 -> ../../ttyUSB0 名字里带 FTDI 就是 FT232 芯片,带 Prolific 就是 PL2303。这一步花十秒钟,省得后面调半天权限。 串口权限是个老坑。默认情况下 /dev/ttyUSB0 属于 dialout 组,root 和该组成员才能读写。普通用户想用,要么 sudo,要么把自己加进去: sudo usermod -aG dialout $USER 重新登录后生效。注意,有些系统里组名是 uucp 而不是 dialout,用 ls -l /dev/ttyUSB0 看第四列确认。改完组还不行,检查 SELinux 是不是拦了。临时放行: sudo setenforce 0 如果这样就能通,说明是 SELinux 策略问题。永久解决要么写策略模块,要么把串口设备打上 tty_device_t 标签,不过生产环境直接关 SELinux 的人也不少,看你自己权衡。 配置串口参数用 stty 最直接。比如要设成 115200 波特率、8 数据位、无校验、1 停止位: stty -F /dev/ttyUSB0 115200 cs8 -cstopb -parenb 想确认当前设置,stty -F /dev/ttyUSB0 -a 会打印一长串。注意 -F 指定设备,别漏了。有人习惯用 minicom 或 screen,那更省事: sudo yum install minicom sudo minicom -D /dev/ttyUSB0 -b 115200 minicom 里 Ctrl+A 然后 O 进配置,改完保存为默认。但 minicom 有个毛病,退出后串口参数可能被重置,所以脚本里还是 stty 稳。 如果你要开机自动配置串口,别塞 /etc/rc.local,CentOS 7 默认没启用那个文件。写个 udev 规则更干净。比如给特定 USB 串口固定名字并设权限: sudo vi /etc/udev/rules.d/99-usb-serial.rules 内容: SUBSYSTEM=="tty", ATTRS{ idVendor}=="067b", ATTRS{ idProduct}=="2303", SYMLINK+="ttyMySerial", MODE="0666" idVendor 和 idProduct 用 lsusb 查。这样插上后 /dev/ttyMySerial 永远指向那根线,脚本里写死这个名字,换 USB 口也不怕。 最后提一个实际踩过的坑:虚拟机里用串口,VMware 或 VirtualBox 要把 USB 设备直通给客户机,否则宿主机抢走驱动,CentOS 7 里根本看不到 ttyUSB0。VirtualBox 装扩展包,然后在虚拟机设置里加 USB 过滤器。物理机串口则要在 BIOS 里确认没禁用,有些服务器默认把 COM 口关掉,进系统后 dmesg 连 ttyS0 都不显示。 串口这东西,硬件通了就通了一大半。剩下的 stty、权限、SELinux 三板斧,挨个试一遍,总能跑起来。 |