class UART -- 双工串行通信总线¶
UART 实现了标准的 UART/USART 双工串行通信协议。在物理层面上它由 2 条线组成:RX 和 TX。通信的单位是一个字符(不要与字符串中的字符混淆),其宽度可以是 8 位或 9 位。
可以使用以下方式创建和初始化 UART 对象::
from machine import UART
uart = UART(3, 9600) # init with given baudrate
uart.init(9600, bits=8, parity=None, stop=1) # init with given parameters
Bits 可以是 7、8 或 9。Stop 可以是 1 或 2。当 parity=None 时,仅支持 8 位和 9 位。启用校验时,仅支持 7 位和 8 位。
UART 对象的行为类似于 stream 对象,读写操作使用标准的流方法完成::
uart.read(10) # read 10 characters, returns a bytes object
uart.read() # read all available characters
uart.readline() # read a line
uart.readinto(buf) # read and store into the given buffer
uart.write('abc') # write the 3 characters
构造函数¶
- class machine.UART(id: int, baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0)¶
构造一个具有给定 id 的 UART 对象。
方法¶
- init(baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0) None¶
使用给定的参数初始化 UART 总线:
baudrate 是时钟速率。
bits 是每个字符的位数,7、8 或 9。
parity 是校验位,
None、0(偶校验)或 1(奇校验)。stop 是停止位的数量,1 或 2。
某个移植版本可能支持的其他仅限关键字的参数有:
tx 指定要使用的 TX 引脚。
rx 指定要使用的 RX 引脚。
rts 指定用于硬件接收流控制的 RTS(输出)引脚。
cts 指定用于硬件发送流控制的 CTS(输入)引脚。
txbuf 以字符为单位指定 TX 缓冲区的长度。
rxbuf 以字符为单位指定 RX 缓冲区的长度。
timeout 指定等待第一个字符的时间(以毫秒为单位)。
timeout_char 指定字符之间的等待时间(以毫秒为单位)。
invert 指定要反转哪些线。
0不反转任何线(两条线的空闲状态均为逻辑高电平)。UART.INV_TX将反转 TX 线(此时 TX 线的空闲状态为逻辑低电平)。UART.INV_RX将反转 RX 线(此时 RX 线的空闲状态为逻辑低电平)。UART.INV_TX | UART.INV_RX将反转两条线(空闲状态为逻辑低电平)。
flow 指定要使用的硬件流控制信号。该值是一个位掩码。
0将忽略硬件流控制信号。UART.RTS将启用接收流控制,通过使用 RTS 输出引脚来指示接收 FIFO 是否有足够的空间来接受更多数据。UART.CTS将启用发送流控制,当 CTS 输入引脚指示接收方缓冲区空间不足时暂停发送。UART.RTS | UART.CTS将同时启用两者,实现完整的硬件流控制。
备注
可以对同一对象多次调用
init()以便动态重新配置 UART。这允许使用单个 UART 外设来服务连接到不同 GPIO 引脚的不同设备。但在这种情况下,每次只能服务一个设备。同时不要调用deinit(),因为它会阻止再次调用init()。
- any() int¶
返回一个整数,表示可以无阻塞读取的字符数。如果没有可用的字符,它将返回 0;如果有字符,则返回一个正数。即使有多个字符可供读取,该方法也可能返回 1。
若要更复杂地查询可用字符,请使用 select.poll::
poll = select.poll() poll.register(uart, select.POLLIN) poll.poll(timeout)
- read(nbytes: int | None = None, /) bytes | None¶
读取字符。如果指定了
nbytes,则最多读取这么多字节,否则尽可能多地读取数据。如果达到超时时间,它可能会提前返回。超时时间可在构造函数中配置。返回值:包含读入字节的 bytes 对象。超时时返回
None。
- readinto(buf: bytearray, nbytes: int | None = None, /) int | None¶
将字节读入
buf。如果指定了nbytes,则最多读取这么多字节。否则,最多读取len(buf)个字节。如果达到超时时间,它可能会提前返回。超时时间可在构造函数中配置。返回值:读取并存储到
buf中的字节数,超时时返回None。
- flush() None¶
阻塞直到当前发送缓冲区中的每个字节都已通过 TX 时钟输出。超时时引发
OSError;超时时间根据 TX 缓冲区大小和配置的波特率推导得出,因此除非启用了流控制且接收方停滞,否则该调用会在超时之前很久就返回。
- irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None¶
安装一个在 UART 事件时触发的回调。
handler是要调用的函数。它接收UART实例作为其唯一参数。传入None可移除先前安装的处理程序。trigger是一个或多个IRQ_*常量(见下方的常量)的位掩码,用于选择哪些事件触发回调。hard=True注册一个硬中断处理程序(延迟更低,但处理程序不得分配内存)。默认为计划回调。返回一个 irq 对象。
并非每个移植版本都提供每个 IRQ 源——请参阅各个
IRQ_*常量以了解每个移植版本的可用性。
常量¶