Python之pyserial模块 串口通信
python之pyserial模块
原文链接:https://www.cnblogs.com/sureZ-learning/p/17054481.html
pyserial 模块封装了对串口的访问,兼容各种平台(Windows、Linux、MACOS等)。
其支持的特性如下:
所有平台基于类的接口相同
端口可以通过python来设置
支持不同数据长度、停止位、奇偶校验位、流量控制、RTS/CTS 和 Xon/Xoff 特性
可以设置是否超时
读取/写数据很简单,调用read或write方法(同样支持readline、readlines等方法)
端口设置为二进制传输,没有空字节、CR-LF等处理,这使得这个模块比较好用
兼容io模块
1 模块安装
特别注意要安装库名为 pyserial。错安装serial库时,要将serial库卸载删除。
pip install pyserial
2 模块使用
2.1 模块的初始化
import serial import serial.tools.list_ports # 打印所有com列表 li = serial.tools.list_ports.comports() for ser in li: print(ser.name) # 打开com13,波特率115200 # 以下是windows平台,linux平台是不同的port名,如/dev/ttyS0等 ser = serial.Serial(port="COM13", baudrate=115200, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=0.5) # 判断是否打开成功 if ser.isOpen(): print (f'{ser.port} is Opened') else: print (f'{ser.port} is Closed') # 不用串口时可以关闭 # ser.close()
2.2 模块的读写
读取/写数据很简单,调用read或write方法(同样支持readline、readlines、writelines等方法),
由于端口设置为二进制数据流传输,所以需要通过encode与decode方法将数据流加工为人们易于阅读的utf-8格式。
import serial # 读串口 # read() - 默认一次读取一个字节,可以通过传入参数指定每次读取的字节数,返回值为bytes类型 # readall() - 读取串口接收的全部数据,返回值为bytes类型 # readlines() - 读取多行数据,返回值为list类型,列表元素类型为bytes类型 ser = serial.Serial("COM13", 115200, timeout=0.5) for line in ser.readlines(): print(line.decode('utf-8')) # 写一个字符串“hello” write_len = ser.write("hello".encode('utf-8')) ser.flush() # 等待所有数据写出 ser.close()
2.3 其它方法
方法 说明
ser.isOpen() 查看端口是否被打开
ser.open() 打开端口
ser.close() 关闭端口
ser.read() 从端口读字节数据,默认1个字节
ser.readall() 从端口接收全部数据 ,bytes类型
ser.write("hello".encode('utf-8')) 向端口写数据 ,bytes类型
ser.readline() 读一行数据 ,bytes类型
ser.readlines() 读多行数据,return 列表元素类型为bytes类型
in_waiting() 返回接收缓存中的字节数
flush() 等待所有数据写出
flushInput() 丢弃接收缓存中的所有数据
flushOutput() 终止当前写操作,并丢弃发送缓存中的数据参考:
1 pyserial官方文档
https://pyserial.readthedocs.io/en/latest/pyserial.html
2 python学习:python serial
https://blog.csdn.net/W295723987/article/details/128053688
二进制流处理及数据收发算法
bytes类型
举例:frame_bytes=b'\x01\x10\x00\x01\x00\x02\x10\x08'
通信信息是字符串,转为bytes序列用于串口接收与发送:
dataBytes = strData.encode("uft-8")#将字符串转为bytes,用于发送 strData = dataBytes .decode("uft-8")#将bytes转为字符串,用于接收
通信信息是数字序列,转为bytes序列用于串口接收与发送:
发送第一步:
reg_byte_array = array("B") # 定义8位数据类型的数组。 参数“B”含义见下表。
发送第二步:
遍历,将要发送的数组转为 8位数据类型的数组
reg_byte_array.append(data & 0xFF) # 利用append 方法添加数据
发送第三步:
将 8位数据类型的数组 转为 bytes
dataBytes = bytes(reg_byte_array) #将array转为bytes,用于发送
发送第四步:
调用pyserial库,发送数据
write_len = ser.write(dataBytes)
接收第一步:
调用pyserial库的in_waiting()方法,串口BUFF内是否有数据
接收第二步:
调用pyserial库的读串口方法,得到bytes类型数据
接收第三步:
遍历bytes类型数据,解析报文