ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MicroPython pyb.UART 串口编程完全指南:Pyboard 全系串口配置、流式读写与 RTS/CTS 硬件流控深度解析

MicroPython pyb.UART 串口编程完全指南:Pyboard 全系串口配置、流式读写与 RTS/CTS 硬件流控深度解析 MicroPython pyb.UART 串口编程完全指南Pyboard 全系串口配置、流式读写与 RTS/CTS 硬件流控深度解析【免费下载链接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems项目地址: https://gitcode.com/gh_mirrors/mi/micropython本篇技术指南以 MicroPython 官方文档中pyb.UART类为核心系统讲解在 Pyboard含 Pyboard Lite 与 Pyboard D上如何使用 UART/USART 双工串行通信从构造器与板级引脚映射、init()全参数配置波特率、数据位、校验、停止位、超时、流控、接收缓冲到流式读写 API 与 RTS/CTS 硬件流控的完整行为语义。结合仓库源码 machine_uart.c 与官方测试用例 uart.py读者将掌握可落地的串口编程方案并理解底层实现约束如波特率精度、缓冲阈值、流控引脚极性。UART 基础双线双工、字符宽度与适用场景pyb.UART实现标准的 UART/USART 双工串行通信协议。物理层面仅由两条信号线构成RX接收接收对端数据TX发送发送数据到对端。通信的基本单元是字符character注意它不等同于 Python 字符串中的字符。一个 UART 字符的宽度可以是8 位或 9 位结合校验位使用时则支持 7 位或 8 位这决定了每帧携带的信息量与最高传输速率之间的权衡。UART 是嵌入式系统中最基础的外设之一典型应用包括与 PC 上位机通信配合 USB 转串口、连接 GPS/GSM 模块、传感器调试日志输出、板间通信等。在 MicroPython 中UART 对象实现了标准流stream接口因此可以像操作文件一样进行读写并可与select、asyncio等高层机制配合。快速上手创建与初始化 UART 对象标准用法如下与 pyb.UART 文档 保持一致from pyb import UART uart UART(1, 9600) # 以给定波特率创建并初始化 uart.init(9600, bits8, parityNone, stop1) # 使用给定参数重新初始化参数取值范围bits7、8 或 9parityNone无校验、0偶校验 even或1奇校验 oddstop停止位1 或 2。重要限制当parityNone时仅支持 8 位和 9 位启用校验位后仅支持 7 位和 8 位。换言之9 位数据帧无法与校验位共存——因为 9 位数据 1 位校验会超出帧结构。构造器与板级引脚映射UART(bus, ...)在指定总线上构造 UART 对象。若不提供额外参数对象仅被创建而不初始化保留该总线上次初始化时的设置如有若传入额外参数则立即按init()的语义初始化。PyboardV1/V1.1引脚映射总线位置(TX, RX)(PAx, PAx) 映射UART(4)XA(X1, X2)(PA0, PA1)UART(1)XB(X9, X10)(PB6, PB7)UART(6)YA(Y1, Y2)(PC6, PC7)UART(3)YB(Y9, Y10)(PB10, PB11)UART(2)—(X3, X4)(PA2, PA3)Pyboard Lite 引脚映射Pyboard Lite 仅支持UART(1)、UART(2)、UART(6)总线位置(TX, RX)映射UART(1)XB(X9, X10)(PB6, PB7)UART(6)YA(Y1, Y2)(PC6, PC7)UART(2)—(X1, X2)(PA2, PA3)Pyboard D 引脚映射Pyboard D 仅支持UART(1)、UART(2)、UART(3)、UART(4)总线位置(TX, RX)映射UART(4)XA(X1, X2)(PA0, PA1)UART(1)YA(Y1, Y2)(PA9, PA10)UART(3)YB(Y9, Y10)(PB10, PB11)UART(2)—(X3, X4)(PA2, PA3)特别注意Pyboard D 的UART(1)位于YA与 Pyboard / Pyboard Lite 上UART(1)位于 XB、UART(6)位于 YA 的布局不同。移植代码到 Pyboard D 前务必核对引脚。构造时传入不存在的总线标识会抛出ValueError这在官方测试 tests/ports/stm32/uart.py 中得到验证UART(-1, 9600)、UART(0, 9600)、UART(100, 9600)、UART(doesnotexist, 9600)均触发ValueError。init() 参数详解从波特率到接收缓冲init()的完整签名UART.init(baudrate, bits8, parityNone, stop1, *, timeout0, flow0, timeout_char0, read_buf_len64)参数语义baudrate时钟速率波特率。bits每字符位数7、8 或 9。parityNone、0偶、1奇。stop停止位数1 或 2。flow流控类型可为0、UART.RTS、UART.CTS或UART.RTS | UART.CTS见下文硬件流控章节。timeout等待写入/读取第一个字符的超时时间单位毫秒。timeout_char写入或读取时相邻字符之间的等待超时单位毫秒。read_buf_len接收缓冲区的字符长度0表示禁用缓冲。波特率精度与最低波特率init()在无法将波特率设置在目标值5% 误差范围内时会抛出异常。最低可达波特率由总线所在的外设时钟频率决定UART(1)与UART(6)挂接在APB2总线上默认总线频率下最低波特率约1300其余 UART 挂接在APB1总线上默认频率下最低波特率约650。若需要更低的波特率可使用 pyb.freq 降低对应总线时钟频率注意这会影响同总线上的其他外设。超时与缓冲的底层实现细节源码视角从 machine_uart.c 的参数解析代码可以印证文档行为并补充若干实现事实read_buf_len默认值为64且被标记为 legacy 参数实际分配缓冲时会在用户指定值上1size_t len args.read_buf_len.u_int 1; // 1 to adjust for usable length of buffer以保证环形缓冲可用的最大长度打印输出时也会做-1修正timeout_char并非任意值都生效源码强制其不小于13000 / baudrate 2毫秒这是保证两个字符之间中断调度可完成的最短间隔低于该值会被自动抬高参数表中还可见较新的rxbuf关键字参数会覆盖 legacy 的read_buf_len在 STM32H7 系列上还额外支持invert0及INV_TX/INV_RX信号极性反转见 machine_uart.c文档所列 API 之外的进阶能力。deinit() 与对象状态查看UART.deinit()关闭 UART 总线释放外设打印 UART 对象会输出其完整配置如UART(1, baudrate9600, bits8, parityNone, stop1, flow0, timeout1000, timeout_char0, rxbuf63)实现于 machine_uart.c实际显示内容取决于该对象是否已启用。流式读写 APIread / readline / readinto / writeUART 对象是一个流对象stream读写采用标准流方法uart.read(10) # 读取 10 个字符返回 bytes 对象 uart.read() # 读取当前所有可用字符 uart.readline() # 读取一行以换行符结尾 uart.readinto(buf) # 读取并存入给定缓冲区 uart.write(abc) # 写入 3 个字符各方法语义严格对应 pyb.UART 文档read([nbytes])指定nbytes时最多读取该字节数若缓冲区已有足够数据则立即返回否则等待数据到齐或超时。不指定nbytes时读取尽可能多的数据在timeout到期后返回。返回bytes对象超时返回None。readline()读取以换行符结尾的一行已存在完整行则立即返回超时后无论是否含换行都返回已收集数据。无数据且超时返回None。readinto(buf[, nbytes])读入buf指定nbytes时最多读该字节数否则最多读len(buf)字节。返回实际读入字节数超时返回None。write(buf)写入缓冲区。7/8 位字符时每字节即一个字符9 位字符时每个字符占用两个字节小端序buf必须包含偶数个字节。返回写入字节数超时且未写入任何字节时返回None。9 位字符的读写对称性read时若为 9 位字符每字符占两字节nbytes必须为偶数实际字符数为nbytes/2write时同样要求偶数字节数。9 位模式常用于需要传输带标志位帧如 9 位地址帧多机通信的场景。单字符与查询方法uart.readchar() # 读取 1 个字符以整数形式返回 uart.writechar(42) # 写入 1 个字符整数 uart.any() # 返回等待读取的字符数readchar()返回读到的字符整数超时返回-1。writechar(char)char为要写入的整数返回None。若启用了 CTS 流控见下文特殊说明。any()返回缓冲区中等待读取的字节数可能为 0可用于轮询式接收避免阻塞。sendbreak()在总线上发送一个中断条件break condition——将总线拉低约13 位时长返回None。常用于唤醒对端设备或触发线路状态中断。版本兼容性提醒流式方法read、write等自 MicroPythonv1.3.4起引入更早版本使用uart.send与uart.recv在新版本中已不再适用。RTS/CTS 硬件流控深度解析流控常量与可用总线UART.RTS与UART.CTS常量用于init(flow...)选择流控类型可单独或组合使用UART.RTS | UART.CTS。在源码中它们被定义为硬件寄存器位值machine_uart.c 中的UART_HWCONTROL_RTS/UART_HWCONTROL_CTS。支持硬件流控的引脚下文目标指与 Pyboard 相连的对端设备Pyboard V1 / V1.1UART(2)与UART(3)支持 RTS/CTS。UART(2)(TX, RX, nRTS, nCTS) (X3, X4, X2, X1) (PA2, PA3, PA1, PA0)UART(3)(TX, RX, nRTS, nCTS) (Y9, Y10, Y7, Y6) (PB10, PB11, PB14, PB13)Pyboard Lite仅UART(2)支持(TX, RX, nRTS, nCTS) (X1, X2, X4, X3) (PA2, PA3, PA1, PA0)连接方式与信号极性当init(flow...)指定 RTS 和/或 CTS 时相关引脚被配置为流控用途nRTS低电平有效active low输出nCTS低电平有效输入内部上拉使能。接线规则是交叉连接Pyboard 的nCTS连接目标的nRTSPyboard 的nRTS连接目标的nCTS。CTS目标设备控制 Pyboard 的发送启用 CTS 流控后write()的行为调用UART.write(buf)时只要nCTS为False低有效表示对端繁忙发送即暂停若在超时时间内整个缓冲区未能发完则发生超时。方法返回已写入的字节数用户可据此续发剩余数据发生超时时UART 中会残留一个正在等待nCTS的字符该字符的字节数包含在返回值中。writechar()的特殊行为若在nCTS为False时调用writechar()方法会等待若目标未及时拉高nCTS则超时并抛出OSError 116ETIMEDOUT一旦目标拉高nCTS该字符立即被发送。RTSPyboard 控制目标设备的发送启用 RTS 流控后的行为取决于是否使用接收缓冲使用缓冲read_buf_len 0入站字符进入缓冲区当缓冲区写满后下一个到达的字符会使nRTS变为False通知目标暂停发送从缓冲区读取字符后nRTS恢复为True。文档给出一个精确的计数示例设缓冲长度为N字节。缓冲满后再到达一个字符nRTS被置False此时any()返回计数N。当字符被读出后这个多出来的字符会被放入缓冲区并在后续any()调用中计入结果。不使用缓冲read_buf_len 0每到达一个字符nRTS立即变为False直到该字符被读出为止——即逐字符流控适合对延迟敏感、由应用立即消费的接收场景。流控使用的时机建议硬件流控适合两类典型场景一是与无缓冲/小缓冲传感器或模块通信时防止数据丢失二是高速率如 921600 及以上长距离传输时避免软件层来不及取走数据。若对端不支持 RTS/CTS务必保持flow0默认。从源码到测试pyb.UART 的实现与验证路径实现位置Python 层封装pyb模块中的 UART 由 machine_uart.c 实现STM32 移植版其头文件与底层 HAL 适配见 uart.h 与 uart.cREPL 串口Pyboard 的 USB VCP 之外的调试串口由 main.c 初始化例如pyb_uart_repl_obj使用MICROPY_HW_UART_REPL_BAUD波特率、timeout_char2并将 UART 挂接到 REPLuart_attach_to_repl这解释了为何某些板载 UART(1) 默认被 REPL 占用测试 uart.py 中对 STM32WB 平台直接SKIP的原因。官方测试要点tests/ports/stm32/uart.py 覆盖了本文所述核心行为非法总线标识触发ValueError构造、init()变参重初始化、print(uart)输出规范化波特率取整到偶数以跨 MCU 一致any()/write()/writechar()/sendbreak()的返回值验证非阻塞模式timeout0下的写行为与read(100)返回Nonerxbuf8/rxbuf0与 legacyread_buf_len4/read_buf_len0的缓冲配置切换。对于连接了真实硬件回环TX-RX 短接的板子可自行验证read/readinto/readline的完整读写闭环。实战要点总结选对总线优先使用UART(1)/UART(6)APB2默认最低波特率 1300需要更低波特率时先调低总线时钟pyb.freq再验证init()是否在 5% 误差内成功。帧格式匹配对端为 8N18 数据位、无校验、1 停止位时用init(9600)9 位地址帧模式记得读写时按每字符 2 字节处理且保证nbytes为偶数。超时设计timeout管首字符timeout_char管字符间隔接收侧推荐轮询any()或使用带rxbuf的缓冲读取避免read()长时间阻塞。流控接线交叉连接 nRTS↔nCTS注意均为低电平有效CTS 会导致write()返回部分写入数、writechar()可能抛OSError 116代码需容忍并处理。兼容性老代码中的send/recv需改写为write/readPyboard D 的引脚布局与 V1 不同跨板移植必须重新核对 引脚映射。【免费下载链接】micropythonMicroPython - a lean and efficient Python implementation for microcontrollers and constrained systems项目地址: https://gitcode.com/gh_mirrors/mi/micropython创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表