ubuntu16.04 下Python串口通信配置与代码实现(PL2303串口)

文章目录安装配置PL2303的串口驱动安装minicon在Ubuntu系统里minicom的开启、USB串口的调整及minicom的退出ubuntu中查看串口信息显示串口接受的数据命令ubuntu16.04上Python串口编程python程序端代码-例程1:例程2:serial获取串行口的状态例程3注意事项每次USB口重新插拔后最近项目需要利用OBD模块读取车机数据,作为一个一直看到硬件就绕开的...

ubuntu16.04 下Python串口通信配置与代码实现(PL2303串口)


最近项目需要利用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 updatesudo 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 serialfrom 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 serialser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5)ser.open()print ser.nameprint ser.portprint 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 serialfrom time import sleepdef recv(serial): while True:  data = serial.read_all()  if data == '':continue  else:break  sleep(0.02) return dataif __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) #数据写回
注意事项每次USB口重新插拔后

1.端口号可能会变更,需要查看下当前的端口号是什么

dmesg | grep ttyUSB*

2.程序调用端口号出现权限问题
需要 sudo chmod 666 /dev/ttyUSB*,否则会出现你调用的串口拒绝访问

 sudo chmod 666 /dev/ttyUSB*
源文地址:https://www.guoxiongfei.cn/csdn/7933.html