Python中使用pyserial实现串口通信
简介
pyserial是基于Python实现的,用于操作串口的第三方库,它支持 Windows、Linux、OSX、BSD等多个平台。
本文主要讲解在Windows环境下使用pyserial来实现串口通信的基本方法。
安装
环境
- Python 2.7 或 Python 3.4+
- Windows 7+
pip安装
pip install pyserial
基本操作步骤
确定串口号
本地电脑通过usb连接设备,打开设备管理器
可以在端口
中看到如下信息
上面的COM75
就是对应的串口号
或者执行以下代码列出当前连接的串口设备
import serial.tools.list_ports
ports_list = list(serial.tools.list_ports.comports())
for comport in ports_list:
print(comport[0], comport[1])
结果如下:
COM1 通信端口 (COM1)
COM75 Prolific USB-to-Serial Comm Port (COM75)
打开串口
参数说明
__init__(port=None, baudrate=9600, bytesize=EIGHTBITS, parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, write_timeout=None, dsrdtr=False, inter_byte_timeout=None, exclusive=None)
- port – 串口名称或
None
- baudrate (int) – 波特率, 如 9600、115200等
- bytesize – 数据位,可取值为:
FIVEBITS
,SIXBITS
,SEVENBITS
,EIGHTBITS
- parity – 校验位,可取值为:
PARITY_NONE
,PARITY_EVEN
,PARITY_ODD
PARITY_MARK
,PARITY_SPACE
- stopbits – 停止位,可取值为:
STOPBITS_ONE
,STOPBITS_ONE_POINT_FIVE
,STOPBITS_TWO
- timeout (float) – 读超时时间,可取值为 None, 0 或者其他具体数值(支持小数)。当设置为 None 时,表示阻塞式读取,一直读到期望的所有数据才返回;当设置为 0 时,表示非阻塞式读取,无论读取到多少数据都立即返回;当设置为其他数值时,表示设置具体的超时时间(以秒为单位),如果在该时间内没有读取到所有数据,则直接返回
- xonxoff (bool) – 软件流控,可取值为 True, False
- rtscts (bool) – 硬件 [RTS(请求发送)/CTS(清除发送)] 流控,可取值为 True, False
- dsrdtr (bool) – 硬件 [DSR(数据终端准备好)/DTR(数据准备好)] 流控,可取值为 True, False
- write_timeout (float) – 写超时时间,可取值为 None, 0 或者其他具体数值(支持小数)
简单示例
import serial.tools.list_ports
s = serial.Serial('COM75', 115200, timeout=0.5)
print(s.isOpen()) # True
发送数据
发送数据使用write()
方法,发送的数据只能是bytes类型,因此需要对发送的字符串进行编码操作
cmd = 'ifconfig\r\n' # 命令带换行符
length = s.write(cmd.encode('utf-8'))
print(length) # 发送的字节数为10
读取数据
读取数据可以使用以下方法
- read() - 默认一次读取一个字节,可以通过传入参数指定每次读取的字节数,返回值为bytes类型
- readall() - 读取串口接收的全部数据,返回值为bytes类型
- readlines() - 读取多行数据,返回值为list类型,列表元素类型为bytes类型
print(s.read(1024))
# print(s.readlines())
# print(s.readall())
关闭串口
关闭串口很简单,直接调用 close()
方法即可
s.close()
其他方法
- in_waiting():返回接收缓存中的字节数。
- flush():等待所有数据写出。
- flushInput():丢弃接收缓存中的所有数据。
- flushOutput():终止当前写操作,并丢弃发送缓存中的数据。
完整代码
import serial
s = serial.Serial('COM75', 115200, timeout=0.5)
cmd = 'ifconfig\r\n'
s.write(cmd.encode('utf-8'))
res = s.readall().decode()
print(res)
s.close()
其它
以上就是pyserial库的基本使用方法,想了解更多可以去pyserial官方文档查阅。