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, ...)

构造给定 id 的 UART 对象。

方法

UART.init(baudrate=9600, bits=8, parity=None, stop=1, \*, ...)

使用给定的参数初始化 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()

备注

可以在同一个对象上多次调用 init() 以实现在运行时重新配置 UART。这允许使用单个 UART 外设为连接到不同 GPIO 引脚的不同设备提供服务。在这种情况下一次只能服务一个设备。也不要调用 deinit(),因为这将阻止再次调用 init()

UART.deinit()

关闭 UART 总线。

备注

deinit() 之后,你将无法在该对象上调用 init()。在这种情况下,需要创建一个新实例。

UART.any()

返回一个整数,计算可以在不阻塞的情况下读取的字符数。如果没有可用的字符,它将返回 0;如果有字符,将返回一个正数。即使有多个字符可供阅读,该方法也可能返回 1。

对于更复杂的可用字符查询,请使用 select.poll:

poll = select.poll()
poll.register(uart, select.POLLIN)
poll.poll(timeout)
UART.read([nbytes])

读取字符。如果指定了 nbytes,则最多读取那么多字节,否则尽可能多地读取数据。

返回值:包含读取的字节的 bytes 对象。超时时返回 None

UART.readinto(buf[, nbytes])

将字节读入 buf。如果指定了 nbytes,则最多读取该数量的字节。否则,最多读取 len(buf) 字节。

返回值:读取并存储到 buf 中的字节数,或超时时返回 None

UART.readline()

读取一行,以换行字符结束。

返回值:读取的行,或在超时时为 None

UART.write(buf)

将字节缓冲区写入总线。

返回值:写入的字节数,或在超时时为 None

UART.sendbreak()

在总线上发送一个中断条件。这使得总线低电平的持续时间比字符的正常传输所需的时间长。

UART.flush()

等待直到所有数据都已发送。如果发生超时,将引发异常。超时持续时间取决于 tx 缓冲区大小和波特率。除非启用了流控制,否则不应发生超时。

备注

对于 rp2、esp8266 和 nrf 移植版本,调用在最后一个字节发送时返回。如果需要,在调用脚本中必须添加一个字符的等待时间。

可用性:rp2、esp32、esp8266、mimxrt、cc3200、stm32、nrf 移植版本、renesas-ra

UART.txdone()

告诉是否所有数据已发送或没有数据传输正在进行。在这种情况下,它返回 True。如果数据传输正在进行中,它返回 False

备注

对于 rp2、esp8266 和 nrf 移植版本,即使传输的最后一个字节仍在发送,调用也可能返回 True。如果需要,在调用脚本中必须添加一个字符的等待时间。

可用性:rp2、esp32、esp8266、mimxrt、cc3200、stm32、nrf 移植版本、renesas-ra

常量

UART.RX_ANY

IRQ 触发源

可用性:WiPy。