class UART – 双工串行通信总线¶
UART 实现了标准的 UART/USART 双工串行通信协议。在物理层面上,它由 2 条线组成:RX 和 TX。通信的单位是一个字符(不要与字符串字符混淆),可以是 8 位或 9 位宽。
可以使用以下方式创建和初始化 UART 对象:
from pyb import UART
uart = UART(3, 9600, timeout_char=1000)                         # init with given baudrate
uart.init(9600, bits=8, parity=None, stop=1, timeout_char=1000) # init with given parameters
位数可以是 7、8 或 9。奇偶校验可以是 None、0(偶数)或 1(奇数)。停止位可以是 1 或 2。
注意: 当奇偶校验为 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
可以使用以下方式读取/写入单个字符:
uart.readchar()     # read 1 character and returns it as an integer
uart.writechar(42)  # write 1 character
要检查是否有待读取的内容,请使用:
uart.any()          # returns the number of characters waiting
注意: 流函数 read、write 等是 MicroPython v1.3.4 中新增的。早期版本使用 uart.send 和 uart.recv。
构造¶
- class pyb.UART(bus, ...)¶
- 在给定总线上构造一个UART对象。 - bus可以是1或3。如果没有额外的参数,则创建但不初始化UART对象(它具有总线上最后一次初始化的设置,如果有的话)。如果提供了额外的参数,则会初始化总线。有关初始化参数,请参阅- init。- 对于OpenMV Cam,UART总线的物理引脚为: - UART(3):- (TX, RX) = (P4, P5) = (PB10, PB11)
 - OpenMV Cam M7 和 H7 上 UART 总线的物理引脚是: - UART(1):- (TX, RX) = (P1, P0) = (PB14, PB15)
- UART(3):- (TX, RX) = (P4, P5) = (PB10, PB11)
 
方法¶
- UART.init(baudrate, bits=8, parity=None, stop=1, \*, timeout=1000, flow=0, timeout_char=0, read_buf_len=64)¶
- 使用给定的参数初始化 UART 总线: - baudrate是时钟速率。
- bits是每个字符的位数,为 7、8 或 9。
- parity是奇偶校验,- None、0(偶数)或 1(奇数)。
- stop是停止位数,为 1 或 2。
- flow设置流控制类型。可以是 0,- UART.RTS,- UART.CTS或- UART.RTS | UART.CTS。
- timeout是等待写入/读取第一个字符的超时时间(毫秒)。
- timeout_char是写入或读取时等待字符之间的超时时间(毫秒)。
- read_buf_len是读取缓冲区的字符长度(0 禁用)。
 - 如果无法在期望值的 5% 内设置波特率,则此方法将引发异常。 - 注意: 当奇偶校验为 None 时,仅支持 8 和 9 位。启用奇偶校验时,仅支持 7 和 8 位。 
- UART.deinit()¶
- 关闭 UART 总线。 
- UART.any()¶
- 返回等待的字节数(可能为 0)。 
- UART.read([nbytes])¶
- 读取字符。如果指定了 - nbytes,则最多读取该数量的字节。如果缓冲区中有足够数量的- nbytes,则立即返回,否则在足够的字符到达或超时后返回。- 如果未给出 - nbytes,则该方法读取尽可能多的数据。在超时后返回。- 注意: 对于 9 位字符,每个字符占两个字节, - nbytes必须是偶数,字符的数量为- nbytes/2。- 返回值:包含读取的字节的 bytes 对象。超时时返回 - None。
- UART.readchar()¶
- 在总线上接收单个字符。 - 返回值:读取的字符,作为整数。超时时返回 -1。 
- UART.readinto(buf[, nbytes])¶
- 将字节读入 - buf。如果指定了- nbytes,则最多读取该数量的字节。否则,最多读取- len(buf)字节。- 返回值:读取并存储到 - buf中的字节数,或超时时返回- None。
- UART.readline()¶
- 读取一行,以换行符结束。如果存在这样的行,则立即返回。如果超时,则返回所有可用数据,而不管是否存在换行符。 - 返回值:读取的行或超时时返回 - None(如果没有可用数据)。
- UART.write(buf)¶
- 将字节缓冲区写入总线。如果字符宽度为 7 或 8 位,则每个字节为一个字符。如果字符宽度为 9 位,则每个字符使用两个字节(小端序),并且 - buf必须包含偶数个字节。- 返回值:写入的字节数。如果发生超时并且没有写入任何字节,则返回 - None。
- UART.writechar(char)¶
- 在总线上写入单个字符。 - char是要写入的整数。返回值:- None。如果使用了 CTS 流控制,请参阅下面的注意事项。
- UART.sendbreak()¶
- 在总线上发送中断条件。这将使总线低电平持续 13 位时间。返回值: - None。
常量¶
流控制¶
UART(3) 使用以下接口支持 RTS/CTS 硬件流控制:
UART(3)开启 :(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2) = (PB10, PB11, PB14, PB13)
在以下段落中,“目标”一词指的是连接到 UART 的设备。
当调用 UART 的 init() 方法并将 flow 设置为 UART.RTS 和 UART.CTS 中的一个或两个时,相关的流控制引脚将被配置。nRTS 是一个低电平输出,nCTS 是一个启用了上拉的低电平输入。要实现流控制,Pyboard 的 nCTS 信号应连接到目标的 nRTS,Pyboard 的 nRTS 应连接到目标的 nCTS。
CTS: 目标控制 OpenMV Cam 发射机¶
如果启用了 CTS 流控制,则写入行为如下:
如果调用 OpenMV Cam 的 UART.write(buf) 方法,则在 nCTS 为 False 时,传输将暂停。如果在超时期间未传输整个缓冲区,则会导致超时。该方法返回写入的字节数,使用户可以在需要时写入剩余数据。在超时情况下,一个字符将保留在 UART 中等待 nCTS。组成此字符的字节数将包括在返回值中。
如果在 nCTS 为 False 时调用 UART.writechar(),则该方法将超时,除非目标及时断言 nCTS。如果超时,将引发 OSError 116。字符将在目标断言 nCTS 后立即传输。
RTS: OpenMV Cam 控制目标的发射机¶
如果启用了 RTS 流控制,则行为如下:
如果使用了缓冲输入(read_buf_len > 0),则会对输入的字符进行缓冲。如果缓冲区变满,下一个到达的字符将导致 nRTS 变为 False:目标应停止传输。当从缓冲区中读取字符时,nRTS 将变为 True。
请注意,any() 方法返回缓冲区中的字节数。假设缓冲区长度为 N 字节。如果缓冲区变满,并且另一个字符到达,则 nRTS 将被设置为 False,并且 any() 将返回计数 N。当读取字符时,附加字符将放置在缓冲区中,并将包含在随后的 any() 调用结果中。
如果未使用缓冲输入(read_buf_len == 0),则到达字符将导致 nRTS 变为 False,直到读取该字符。