美文网首页pythonPython
pySerial 串口工具简介

pySerial 串口工具简介

作者: 水之心 | 来源:发表于2020-11-27 09:09 被阅读0次

    参考 pySerial

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

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

    安装很简单:

    pip install pyserial
    

    前提:首先有一个串口硬件接入电脑,然后,查看其端口号:

    在 Windows10 搜索栏搜索设备管理器

    可以看到端口有 USB Serial Port(COM3)。本文就以它为例探索串口通信。

    1 打开端口,无 timeout

    import serial
    port = 'COM3'
    ser = serial.Serial(port)  # 打开端口
    print(ser)
    
    ser.write(b'hello')  # 写入字符串
    ser.close()  # 关闭端口
    

    输出:

    Serial<id=0x20f8cdd76a0, open=True>(port='COM3', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
    

    2 打开端口,1 秒 timeout

    port = 'COM3'
    baudrate = 9600  # 设置波特率
    timeout = 1
    with serial.Serial(port, baudrate, timeout=timeout) as ser:
        x = ser.read()          # read one byte
        s = ser.read(10)        # read up to ten bytes (timeout)
        line = ser.readline()   # read a '\n' terminated line
    

    3 非阻塞的硬件握手

    non blocking HW handshaking(非阻塞的硬件握手):

    port = 'COM3'
    baudrate = 38400  # 设置波特率
    timeout = 0
    ser = serial.Serial(port, baudrate, timeout=timeout,
                        parity=serial.PARITY_EVEN, rtscts=10)
    s = ser.read(100)       # read up to one hundred bytes
    # or as much is in the buffer
    

    4 通过属性设定配置端口

    获取一个 Serial 实例并稍后配置/打开它:

    ser = serial.Serial()
    ser.baudrate = 19200 
    ser.port = 'COM3'
    ser
    

    输出:

    Serial<id=0x20f8ce17d60, open=False>(port='COM3', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
    

    下面试验打开、关闭:

    ser.open() # 打开端口
    print('端口状态:', ser.is_open)
    ser.close() # 关闭端口
    print('端口状态:', ser.is_open)
    

    输出:

    端口状态: True
    端口状态: False
    

    也支持上下文管理:

    with serial.Serial() as ser:
        ser.baudrate = 19200
        ser.port = 'COM3'
        ser.open()
        ser.write(b'hello')
    

    5 Readline

    使用readline()时要小心。在打开串行端口时,请务必指定一个超时时间,否则,如果没有收到换行符,它将永远阻塞。另请注意,readlines()仅适用于超时。readlines()取决于是否存在超时,并将其解释为EOF(文件末尾)。如果未正确打开端口,则会引发异常。

    6 EOL

    要为readline()指定 EOL 字符或使用通用换行模式,建议使用 io.TextIOWrapper

    import serial
    import io
    ser = serial.serial_for_url('loop://', timeout=1)
    sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))
    
    sio.write("hello\n")
    sio.flush()  # it is buffering. required to get the data out *now*
    hello = sio.readline()
    print(hello == "hello\n")
    

    7 测试端口

    7.1 列车可用端口

    python -m serial.tools.list_ports 将打印可用端口列表。也可以添加一个正则表达式作为第一个参数,并且列表将仅包含匹配的条目。

    7.2 访问端口

    pySerial 包含一个基于小型控制台的终端程序,称为 serial.tools.miniterm。可以使用 python -m serial.tools.miniterm <port_name>(使用选项 -h 获取所有选项的列表)启动。

    相关文章

      网友评论

        本文标题:pySerial 串口工具简介

        本文链接:https://www.haomeiwen.com/subject/ibbtwktx.html