pythonPython

pySerial 串口工具简介

2020-11-27  本文已影响0人  水之心

参考 pySerial

pySerial 模块封装了对串行端口(serial port)的访问。它提供了在 Windows,OSX,Linux,BSD(可能是任何 POSIX 兼容系统)和 IronPython 上运行的 Python 的后端。模块名为“serial”会自动选择适当的后端。

安装很简单:

pip install pyserial

前提:首先有一个串口硬件接入电脑,然后,查看其端口号:

在 Windows10 搜索栏搜索设备管理器

可以看到端口有 USB Serial Port(COM3)。本文就以它为例探索串口通信。

1 打开端口,无 timeout

import serial
port = 'COM3'
ser = serial.Serial(port)  # 打开端口
print(ser)

ser.write(b'hello')  # 写入字符串
ser.close()  # 关闭端口

输出:

Serial<id=0x20f8cdd76a0, open=True>(port='COM3', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

2 打开端口,1 秒 timeout

port = 'COM3'
baudrate = 9600  # 设置波特率
timeout = 1
with serial.Serial(port, baudrate, timeout=timeout) as ser:
    x = ser.read()          # read one byte
    s = ser.read(10)        # read up to ten bytes (timeout)
    line = ser.readline()   # read a '\n' terminated line

3 非阻塞的硬件握手

non blocking HW handshaking(非阻塞的硬件握手):

port = 'COM3'
baudrate = 38400  # 设置波特率
timeout = 0
ser = serial.Serial(port, baudrate, timeout=timeout,
                    parity=serial.PARITY_EVEN, rtscts=10)
s = ser.read(100)       # read up to one hundred bytes
# or as much is in the buffer

4 通过属性设定配置端口

获取一个 Serial 实例并稍后配置/打开它:

ser = serial.Serial()
ser.baudrate = 19200 
ser.port = 'COM3'
ser

输出:

Serial<id=0x20f8ce17d60, open=False>(port='COM3', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

下面试验打开、关闭:

ser.open() # 打开端口
print('端口状态:', ser.is_open)
ser.close() # 关闭端口
print('端口状态:', ser.is_open)

输出:

端口状态: True
端口状态: False

也支持上下文管理:

with serial.Serial() as ser:
    ser.baudrate = 19200
    ser.port = 'COM3'
    ser.open()
    ser.write(b'hello')

5 Readline

使用readline()时要小心。在打开串行端口时,请务必指定一个超时时间,否则,如果没有收到换行符,它将永远阻塞。另请注意,readlines()仅适用于超时。readlines()取决于是否存在超时,并将其解释为EOF(文件末尾)。如果未正确打开端口,则会引发异常。

6 EOL

要为readline()指定 EOL 字符或使用通用换行模式,建议使用 io.TextIOWrapper

import serial
import io
ser = serial.serial_for_url('loop://', timeout=1)
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))

sio.write("hello\n")
sio.flush()  # it is buffering. required to get the data out *now*
hello = sio.readline()
print(hello == "hello\n")

7 测试端口

7.1 列车可用端口

python -m serial.tools.list_ports 将打印可用端口列表。也可以添加一个正则表达式作为第一个参数,并且列表将仅包含匹配的条目。

7.2 访问端口

pySerial 包含一个基于小型控制台的终端程序,称为 serial.tools.miniterm。可以使用 python -m serial.tools.miniterm <port_name>(使用选项 -h 获取所有选项的列表)启动。

上一篇下一篇

猜你喜欢

热点阅读