Ubuntu 串口通信
#1 环境
Ubuntu 16.04(Mac的虚拟机)
Python 3.5
#1.1 安装插件
- Ubuntu串口助手
sudo apt install cutecom
- Python第三方库
pip3 install pyserial
#2 目的
- 在Ubuntu中虚拟出串口
- 使用虚拟串口通信(收/发)
#3 开始
#3.1 虚拟串口
为什么要虚拟串口???
因为我的电脑上并没有串口设备,所以需要虚拟出串口,才能进行串口通信,这一点非常非常重要!!!,如果电脑上没有接串口外设,又没有虚拟出可用的串口,是不能进行串口通信的!
#! /usr/bin/env python
#coding=utf-8
import pty
import os
import select
def mkpty():
master1, slave = pty.openpty()
slaveName1 = os.ttyname(slave)
master2, slave = pty.openpty()
slaveName2 = os.ttyname(slave)
print('\nslave device names: ', slaveName1, slaveName2)
return master1, master2
if __name__ == "__main__":
master1, master2 = mkpty()
print(master1, master2)
while True:
rl, wl, el = select.select([master1,master2], [], [], 1)
for master in rl:
print(master)
data = os.read(master, 128)
if master==master1:
os.write(master2, data)
else:
os.write(master1, data)
slave device names: /dev/pts/18 /dev/pts/20
其中/dev/pts/18
和/dev/pts/20
就是在Ubuntu上虚拟传来的串口设备
验证虚拟串口是否可用:
- 打开cutecom
// Ubuntu 18开始, 似乎不太兼容
sudo cutecom
- 使用
虚拟出的串口可以正常使用 !
#3.2 接收串口数据
接收代码:
#usr/bin/python3
# -*- coding: utf-8 -*-
import serial
ser=serial.Serial("/dev/pts/18",115200,timeout=0.5)
print("serial_name:",ser.name)
ser.close()
ser.open()
print(ser.isOpen())
while True:
s = ser.read(10) # 每隔10个字符读一次
# s = ser.readline() #是读一行,以/n结束,要是没有/n就一直读,阻塞。
print(s)
ser.close()#关闭端口
serial API:
serial方法 | 说明 | 备注 |
---|---|---|
serial.Serial | 实例化一个串口对象 | ser=serial.Serial(“/dev/pts/18”,115200,timeout=0.5) |
ser.name | 串口名 | |
ser.open() | 打开串口(如果打开失败,在打开前先关闭) | |
ser.close() | 关闭串口 | |
ser.read(x) | 是读x个字符 | |
ser.readline() | 读一行,以/n结束,要是没有/n就一直读,阻塞。 | |
ser.readlines() | 读多行,需要设置超时时间 | |
ser.xreadlines() | 读多行,需要设置超时时间 | |
ser.write(“x”) | 写数据 | |
ser.baudrate | 波特率 | |
ser.bytesize | 字节大小 | |
ser.parity | 校验位 | |
ser.stopbits | 停止位 | |
ser.timeout | 读超时设置 | |
ser.writeTimeout | 写超时 | |
ser.xonxoff | 软件流控 | |
ser.rtscts | 硬件流控 | |
ser.interCharTimeout | 字符间隔超时 |
#3.3 写串口数据
写代码:
#usr/bin/python3
# -*- coding: utf-8 -*-
import serial
ser=serial.Serial("/dev/pts/18",115200,timeout=0.5)
print("serial_name:",ser.name)
ser.close()
ser.open()
print(ser.isOpen())
# while True:
ser.write(b"hello") # 二进制
ser.close()#关闭端口