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 退出。此时 你便可以在终端查看自己的串口变化了。

ubuntu16.04 下Python串口通信配置与代码实现(PL2303串口)_第1张图片

注意红框中最初为/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*

ubuntu16.04 下Python串口通信配置与代码实现(PL2303串口)_第2张图片

ubuntu软件CuteCom桌面端:

sudo cutecom

ubuntu16.04 下Python串口通信配置与代码实现(PL2303串口)_第3张图片
在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*

你可能感兴趣的:(linux,Python)