1. 报错描述
使用Ubuntu+Python3 外接USB转TTL,通过串口发送数据。运行Python时报错如下:
from: can't read /var/mail/serial
或者:
from serial import Serial ModuleNotFoundError: No module named 'serial'
通常是找不到串口,或者串口没有权限
2. 解决方法
首先查看串口:
ls /sys/class/tty/ttyUSB* -l
得到:
../../devices/pci0000:00/0000:00:14.0/usb1/1-11/1-11:1.0/ttyUSB0/tty/ttyUSB0
可以看到串口的名字是ttyUSB0
2.1 增加串口权限
在终端中输入:
sudo chmod +777 ttyUSB0
2.2 手动指定串口
打开你的Python代码,
设置如下:
ser = Serial('/dev/ttyUSB0',baudrate=115200,parity='N',stopbits=1)
#分别指定串口、波特率、无奇偶校验、截止位为1
3. 原因分析
根据盛齐师兄的指导,linux把各种硬件都看做一个一个的文件,串口也是被看做了一个叫“ttyUSB0”的文件,但是,系统没有给文件读写的权限,所以我们要么给它增加权限,要么在root用户下运行,这里+777对所有用户(包括root、组、其他用户)开放了所有的权限(读写、修改、执行等)。
为了验证上述分析,我们在/dev文件夹下使用ls命令可以查看所有的权限、所有者、修改时间、设备名。在终端输入如下:
cd /dev/
ls -l
得到的结果其中一行是:
crwxrwxrwx 1 root dialout 188, 0 12月 7 15:10 ttyUSB0
从左到右依次是:权限 别名 所有者 时间 硬件名字
其中权限分别记录了对于root、组、其他用户的读写、修改、运行权限,这里的字母全写上了,说明权限完全开放了。与前面描述相符。
而手动指定串口,是因为通常我们在打开串口时选择自动查找串口,有可能自动找到的并不是我们想要的那个串口,而前面我们已经查到了串口的名字,这里不妨手工指定串口。