Python中使用pyserial实现串口通信

简介

pyserial是基于Python实现的,用于操作串口的第三方库,它支持 Windows、Linux、OSX、BSD等多个平台。

本文主要讲解在Windows环境下使用pyserial来实现串口通信的基本方法。

安装

环境

  • Python 2.7 或 Python 3.4+
  • Windows 7+

pip安装

pip install pyserial

基本操作步骤

确定串口号

本地电脑通过usb连接设备,打开设备管理器可以在端口中看到如下信息

usb-to-serial

上面的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官方文档查阅。

posted @ 2022-11-03 16:30  蓝莓薄荷  阅读(4615)  评论(0编辑  收藏  举报