文章目录
- 安装配置PL2303的串口驱动
- 安装minicon
- 在Ubuntu系统里minicom的开启、USB串口的调整及minicom的退出
- ubuntu 中查看串口信息
- 显示串口接受的数据命令
- ubuntu16.04上Python串口编程
最近项目需要利用OBD模块读取车机数据,作为一个一直看到硬件就绕开的算法党,也不得不开启了ubuntu下配置、读取、分析PL2303串口通信之路,开始了之后,发现果然有好多坑,感谢遇到问题时网上各博主之前写的帖子,都帮了大忙。这里我也记录分享下。
安装配置PL2303的串口驱动
在Ubuntu下利用minicom进行嵌入式开发时可能会用到USB转串口,这时就会用到USB转串口驱动,以前的Ubuntu是直接将此驱动编译进内核,但不知道从哪个版本开始Ubuntu将其从内核去掉了,所以要用到Ubuntu的minicom时只能由我们自己安装USB转串口驱动,方法如下:
(1)首先将PL2303驱动从/lib/modules/4.15.0-45-generic/kernel/drivers/usb/serial/下的pl2303.ko文件拷贝到/usr/src/Linux-headers-4.15.0-45-generic/drivers/usb/serial下:
sudo cp /lib/modules/4.2.0-27-generic/kernel/drivers/usb/serial/pl2303.ko /usr/src/linux-headers-4.2.0-27-generic/drivers/usb/serial
这里需要加上sudo, 要不然会报错Permission denied.
注意,内核如果不一样,此处路径也可能不同,要去你的本机电脑上找到安装的内核。
cd /usr/src/linux-headers-4.2.0-27-generic/drivers/usb/serial
(2)然后使用命令
sudo modprobe usbserial
(3)再使用命令
sudo modprobe pl2303
这时将USB转串口插入电脑USB,使用命令dmesg | tail可看到usb pl2303等信息。说明驱动安装成功。
给项目文件夹赋予权限
cu xiao
// 输入密码
sudo chown xiao /dev/ttyUSB0
安装minicon
sudo apt-get install minicom
安装过程中,若是报错:
dpkg 被中断,您必须手工运行 sudo dpkg –configure -a解决此问题
可以使用命令 sudo dpkg –configure -a,运行过后再执行 sudo apt-get install minicom一般就可以成功安装了。
若还是解决不了,可尝试以下解决方案
运行下面的命令即可解决
sudo rm /var/lib/dpkg/updates/*
sudo apt-get update
sudo apt-get upgrade
在Ubuntu系统里minicom的开启、USB串口的调整及minicom的退出
在Ubuntu系统里,通过 Ctrl+Alt+t 打开终端,输入 sudo minicom 打开串口显示 如果设备仍显示USB未连接,问题可能是USB接口设置错误。一般USB有:USB0,USB1,USB2,USB3.可以通过输入 sudo minicom -s 修改USB串口如下图所示:输入 A 便可修改USB串口,如果不知道自己的串口是USB几,本人只能说一个一个试(欢迎大神提供更好的办法)最后一定要选择 Save setup as df
然后 选择 exit 退出。此时 你便可以在终端查看自己的串口变化了。
注意红框中最初为/dev/tty8,需要插入USB串口之后,跟你你的串口进行修改,修改为
/dev/ttyUSB*
退出串口的快捷键是Ctrl+A 然后再按 X。
sudo apt-get install lrzsz
ubuntu 中查看串口信息
提示Permission denied,就是需要转换为超级用户打开
sudo su
1.使用ls -l ttyS*命令显示如下
crw-rw----. 1 root dialout 4, 64 5月 17 02:24 /dev/ttyS0
crw-rw----. 1 root dialout 4, 65 5月 17 02:24 /dev/ttyS1
crw-rw----. 1 root dialout 4, 66 5月 17 02:24 /dev/ttyS2
crw-rw----. 1 root dialout 4, 67 5月 17 02:24 /dev/ttyS3
但你不知到哪个是真实的串口,虽然一般都是ttyS0,但也不敢妄然确定。
2.使用cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:0 rx:0
1: uart:unknown port:000002F8 irq:3
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
我们发现串口0的uart值时16550A,tx值为0,rx值也为0,因此我们断定本机只有一个串口,是串口0,即ttyS0
3.也可以用dmesg | grep ttyS*,但这个不是很好用,当然你可以自己使用正则法则取找到。
注意:还应查看是否有USB转串口,这个就很简单了:ls ttyUSB*,全部搞定。
显示串口接受的数据命令
1.1 在终端输入 lsusb 显示所有连接的usb设备
1.2 在终端输入 ls /dev/ttyA* 显示所有连接的虚拟USB设备端口号
1.3 在终端输入 ls /dev/ttyU* 显示所有连接的USB设备端口号
1.4 显示串口信息的操作如下:
根据1.2 和 1.3 操作,查看自己的设备是 USB(端口号ttyUSB*)还是虚拟USB(端口号ttyACM*),假设是虚拟USB,则进行如下操作
一个终端下输入如下命令:
echo -e “at \r” >/dev/ttyA* //{echo -e可以发送回车等特殊字符;
这个是发送字符"at "到/dev/ttyS0即串口0;
新开一个终端下输入如下命令:
cat /dev/ttyA*
ubuntu16.04上Python串口编程
通过 ubuntu桌面串口软件 CuteCom与 程序端的实现串口通信。
硬件连接采用2条 USB转485的线,对连。 两条USB转485线: T/R+ ---------T/R+ , T/R- ---------T/R-
查询从系统启动到现在串口插拔的信息,显示串口Ubuntu连接的端口号:
在终端输入:
dmesg | grep ttyS*
ubuntu软件CuteCom桌面端:
sudo cutecom
在Ubuntu下装了CuteCom,但当打开 /dev/ttyUSB0 时,总提示错误,打开失败时:
用 Minicom 可以正常读取 ttyUSB0。
sudo chmod 666 /dev/ttyUSB0
这样修改后, CuteCom 就可以正常打开 USB 串口了。
Ubuntu下cutecom图像界面串口调试工具使用详细
可参考 https://blog.csdn.net/zhaoqi2617/article/details/72238546
python程序端代码-例程1:
#usr/bin/python3
# -*- coding: utf-8 -*-
import serial
from time import sleep
ser = serial.Serial('/dev/ttyUSB0', 57600, timeout=0.5)
def recv(serial):
global data
while True:
data = serial.read(30)
#data = serial .readline()
if data == '':
continue
else:
break
sleep(0.02)
return data
while True:
data = recv(ser)
ser.write(data)
例程2:
#usr/bin/python3
# -*- coding: utf-8 -*-
import serial
//打开串口0, 9600,8N1,连接超时0.5秒
ser=serial.Serial("/dev/ttyUSB0",57600,timeout=0.5) #使用USB连接串行口
ser=serial.Serial("/dev/ttyAMA0",57600,timeout=0.5) #使用树莓派的GPIO口连接串行口
ser=serial.Serial(1,9600,timeout=0.5)#winsows系统使用com1口连接串行口
ser=serial.Serial("com1",9600,timeout=0.5)#winsows系统使用com1口连接串行口
ser=serial.Serial("/dev/ttyS1",9600,timeout=0.5)#Linux系统使用com1口连接串行口
print ser.name#打印设备名称
print ser.port#打印设备名
ser.open() #打开端口
s = ser.read(10)#从端口读10个字节
ser.write("hello")#向端口些数据
ser.close()#关闭端口
data = ser.read(20) #是读20个字符
data = ser.readline() #是读一行,以/n结束,要是没有/n就一直读,阻塞。
data = ser.readlines()和ser.xreadlines()#都需要设置超时时间
ser.baudrate = 9600 #设置波特率
ser.isOpen() #看看这个串口是否已经被打开
serial 获取串行口的状态
name:设备名字
portstr:已废弃,用name代替
port:读或者写端口
baudrate:波特率
bytesize:字节大小
parity:校验位
stopbits:停止位
timeout:读超时设置
writeTimeout:写超时
xonxoff:软件流控
rtscts:硬件流控
dsrdtr:硬件流控
interCharTimeout:字符间隔超时
import serial
ser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5)
ser.open()
print ser.name
print ser.port
print ser.baudrate#波特率
print ser.bytesize#字节大小
print ser.parity#校验位N-无校验,E-偶校验,O-奇校验
print ser.stopbits#停止位
print ser.timeout#读超时设置
print ser.writeTimeout#写超时
print ser.xonxoff#软件流控
print ser.rtscts#硬件流控
print ser.dsrdtr#硬件流控
print ser.interCharTimeout#字符间隔超时
ser.close()
例程3
import serial
from time import sleep
def recv(serial):
while True:
data = serial.read_all()
if data == '':
continue
else:
break
sleep(0.02)
return data
if __name__ == '__main__':
serial = serial.Serial('COM5', 57600, timeout=0.5) #/dev/ttyUSB0
if serial.isOpen() :
print("open success")
else :
print("open failed")
while True:
data =recv(serial)
if data != b'' :
print("receive : ",data)
serial.write(data) #数据写回