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。