参考 pySerial。
pySerial
模块封装了对串行端口(serial port)的访问。它提供了在 Windows,OSX,Linux,BSD(可能是任何 POSIX 兼容系统)和 IronPython 上运行的 Python 的后端。模块名为“serial
”会自动选择适当的后端。
- 在所有支持的平台上基于相同类的接口。
- 通过 Python 属性访问端口设置。
- 通过 RTS/CTS 和/或 Xon/Xoff 支持不同的字节大小,停止位,奇偶校验和流程控制。
- 有或没有超时的功能设定。
- 像 API 这样的文件,带有“
read
”和“write
”(也支持“readline
”等)。 - 该软件包中的文件是 100% 纯 Python。
- 该端口已设置为二进制传输。没有 NULL 字节剥离,CR-LF 转换等(对于 POSIX 启用了很多次)。这使该模块具有通用性。
- 与
io
库兼容 - 示例中提供的 RFC 2217 客户端(实验)服务器。
安装很简单:
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
获取所有选项的列表)启动。
网友评论