ubuntu使用python读串口_ubuntu16.04 下Python串口通信配置与代码实现(PL2303串口)

文章目录

安装配置PL2303的串口驱动

安装minicon

在Ubuntu系统里minicom的开启、USB串口的调整及minicom的退出

ubuntu 中查看串口信息

显示串口接受的数据命令

ubuntu16.04上Python串口编程

python程序端代码-例程1:

例程2:

serial 获取串行口的状态

例程3

注意事项

每次USB口重新插拔后

最近项目需要利用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) #数据写回

注意事项

每次USB口重新插拔后

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

dmesg | grep ttyUSB*

2.程序调用端口号出现权限问题

需要 sudo chmod 666 /dev/ttyUSB*,否则会出现你调用的串口拒绝访问

sudo chmod 666 /dev/ttyUSB*


版权声明:本文为weixin_39940425原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。