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()

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