python串口学习

python串口:PySerial学习一

  • pySerial
    • 综述
    • pyserial功能
    • 打开串口1
    • 打开串口2
    • 串口号获取
    • 一个完整的收发程序

pySerial

综述

pySerial模块封装串口的访问权限。 它为在Windows、OSX、Linux、BSD(可能是任何POSIX兼容系统)和IronPython上运行的Python提供后端。 名为“serial”的模块会自动选择适当的后端。

pyserial功能

在所有受支持的平台上基于相同类的接口。
通过Python属性访问端口设置。
支持不同字节大小,停止位,奇偶校验和流量控制RTS/CTS和/或Xon/Xoff。
使用或不使用接收超时。
文件的API与“读”和“写”(“readline”等也支持)。
这个包中的文件是100%纯Python的。
端口设置为二进制传输。 没有NULL字节剥离,CR-LF转换等(这是POSIX多次启用的)。 这使得该模块普遍有用。
兼容io库
RFC 2217客户端(实验性),服务器在示例中提供。

打开串口1

python serial模块使用,是pyserial而非serial一定注意

import serial
ser = serial.Serial("COM3")  #打开COM3其他参数默认9600 8 N 1 无超时 无流控制
print(ser.is_open)   #打印串口打开情况
ser.write(b"Hello")  #打印串口打开情况

程序运行结果

True

这样我们的串口助手就可以收到数据
python串口学习_第1张图片
很多文章都讲到这里,但是对于初学者只能依葫芦画瓢无法理解是怎么回事,比如为什么波特率是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。

打开串口2

根据“打开串口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)
串口以打开

串口助手显示内容
python串口学习_第2张图片
至此我们实现了串口数据的收发

你可能感兴趣的:(python串口学习,python,开发语言)