pySerial模块封装串口的访问权限。 它为在Windows、OSX、Linux、BSD(可能是任何POSIX兼容系统)和IronPython上运行的Python提供后端。 名为“serial”的模块会自动选择适当的后端。
在所有受支持的平台上基于相同类的接口。
通过Python属性访问端口设置。
支持不同字节大小,停止位,奇偶校验和流量控制RTS/CTS和/或Xon/Xoff。
使用或不使用接收超时。
文件的API与“读”和“写”(“readline”等也支持)。
这个包中的文件是100%纯Python的。
端口设置为二进制传输。 没有NULL字节剥离,CR-LF转换等(这是POSIX多次启用的)。 这使得该模块普遍有用。
兼容io库
RFC 2217客户端(实验性),服务器在示例中提供。
python serial模块使用,是pyserial而非serial一定注意
import serial
ser = serial.Serial("COM3") #打开COM3其他参数默认9600 8 N 1 无超时 无流控制
print(ser.is_open) #打印串口打开情况
ser.write(b"Hello") #打印串口打开情况
程序运行结果
True
这样我们的串口助手就可以收到数据
很多文章都讲到这里,但是对于初学者只能依葫芦画瓢无法理解是怎么回事,比如为什么波特率是9600,数据位是8位等
我们来看一下官方文档是怎么描述的
serial.Serial 类
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)
参数:
port -设备名称或无。
波特率(int)—波特率,如9600或115200等。
bytesize—数据位数。 取值范围:FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS(5, 6, 7, 8 )
parity—启用奇偶校验。 可选值: PARITY_NONE, PARITY_EVEN, PARITY_ODD PARITY_MARK, PARITY_SPACE( ‘N’, ‘E’, ‘O’, ‘M’, ‘S’ )
stopbits—停止位个数。 可选值:STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO(1, 1.5, 2)
timeout (float)—设置读超时值。
xonxoff (bool)—开启软件流控。
rtscts (bool) -启用硬件(RTS/CTS)流量控制。
dsrdtr (bool)—启用硬件(DSR/DTR)流量控制。
write_timeout (float)—设置写超时值。
inter_byte_timeout (float)—字符间超时,默认为None。
根据“打开串口1”我们可以打开一个串口,ser = serial.Serial(“COM3”)语句我们就打开了com3其他使用了默认配置。实际使用中我们也可以在程序里面配置串口参数
import serial
ser = serial.Serial()
ser.port = "COM3"
ser.baudrate = 9600
ser.parity = serial.PARITY_NONE
ser.stopbits = serial.STOPBITS_ONE
ser.bytesize = serial.EIGHTBITS
ser.open()
print(ser.is_open) #打印串口打开情况True/False
print(ser)
ser.write(b"Hello") #打印串口打开情况
运行结果:
True
Serial<id=0x1ba7102aee0, open=True>(port='COM3', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
注意程序里面的serial.PARITY_NONE可以替换为“N”,serial.STOPBITS_ONE可以替换为1,serial.EIGHTBITS替换为8
import serial
ser = serial.Serial()
ser.port = "COM3"
ser.baudrate = 9600
ser.parity = "N"
ser.stopbits = 1
ser.bytesize = 8
ser.open()
print(ser.is_open) #打印串口打开情况True/False
print(ser)
ser.write(b"Hello") #打印串口打开情况
ser.close()
同样可以是可以的运行结果和上一段程序相同
可以使用类里面的list_ports获取计算机上所有的硬件串口
import serial
import serial.tools.list_ports
ser = serial.Serial()
serPortName = serial.tools.list_ports.comports() #获取计算硬件所有的串口
if 0==len(serPortName):
print("无可用串口")
else:
for i in range(len(serPortName)): #计算机上所有的串口编号
print(serPortName[i])
运行结果
COM15 - 蓝牙链接上的标准串行 (COM15)
COM3 - ELTIMA Virtual Serial Port (COM3->COM4)
COM4 - ELTIMA Virtual Serial Port (COM4->COM3)
COM16 - 蓝牙链接上的标准串行 (COM16)
实现功能接收到数据然后再发过去
import serial
import serial.tools.list_ports
ser = serial.Serial()
serPortName = serial.tools.list_ports.comports()
def getPorName():
serPortName = serial.tools.list_ports.comports()
if 0==len(serPortName):
print("无可用串口")
else:
for i in range(len(serPortName)):
print(serPortName[i])
def openSer():
ser.port = 'COM3'
ser.bytesize = serial.EIGHTBITS
ser.stopbits = serial.STOPBITS_ONE
ser.parity = serial.PARITY_NONE
ser.baudrate = 9600
if ser.is_open == False:
try:
ser.open()
except:
print("串口被占用")
if ser.is_open ==True:
print("串口以打开")
else:
print("串口打开失败")
def writSer():
if ser.writable() == True:
ser.write(ser.read(1))
if __name__ == "__main__":
getPorName()
openSer()
while True:
writSer()
输出结构
COM15 - 蓝牙链接上的标准串行 (COM15)
COM3 - ELTIMA Virtual Serial Port (COM3->COM4)
COM4 - ELTIMA Virtual Serial Port (COM4->COM3)
COM16 - 蓝牙链接上的标准串行 (COM16)
串口以打开