UART类 – 双向串行通信总线¶
UART执行标准UART/USART双向串行通信协议。其物理层包括两条线:RX和TX。通信单元为8位或9位宽的字符(勿与字符串字符混淆)。
UART对象可通过下列方式创建和初始化:
from pyb import UART
uart = UART(3, 9600, timeout_char=1000) # i使用给定波特率初始化
uart.init(9600, bits=8, parity=None, stop=1, timeout_char=1000) # 使用给定参数初始化
位数可为7、8、9。奇偶性可为None、0(偶)、1(奇)。停止位可为1或2。
注意: 奇偶性为None时,仅支持位数为8和9。启用奇偶性时,仅支持位数为7和8。
UART对象与流对象相似,其读取与写入均使用流对象方法:
uart.read(10) # read 10 characters, returns a bytes object 读取10字符,返回一个字节对象
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 写入3个字符
单个字符可通过下列方法读取/写入:
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 M4上, UART总线的物理引脚为:
UART(3)
:(TX, RX) = (P4, P5) = (PB10, PB11)
在OpenMV Cam M7上, 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或2flow
设置流控制类型。可为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
,则最多只能读取该数量的字节。若在缓冲区中可用,立即返回,否则在达到足够字符或超时时间过期时返回。注意: 9位字符的每个字符占2字节,
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位宽,则每个字符(小端模式)为2个字节,且
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)
在下文中,术语“target”均指与UART相连的设备。
当UART的 init()
方法被调用,且 flow
被设为 UART.RTS
和 UART.CTS
的其中一个或两个,
则配置相关的流控制引脚。 nRTS
为低电平有效输出,nCTS
为启用了上拉下的低电平有效输入。为实现流控制,O
penMV Cam的 nCTS
信号须与目标设备的 nRTS
相连,OpenMV Cam的 nRTS
与目标设备的 nCTS
相连。
CTS: 目标设备控制OpenMV Cam发送器¶
若启用了CTS流控制,则写入过程如下:
若调用OpenMV Cam的 uart.write(buf)
方法,当 nCTS
为 False
时,任何周期的传递都会暂停。
若整个缓冲区未在超时周期内传输,则会导致超时。该方法返回所写入的字节数,允许用户在需要时写入剩余数据。
在超时事件中,在 nCTS
之前,字符将始终留在UART中。组成这一字符的字节将包括在返回值中。
若 nCTS
为 False
时 uart.writechar()
被调用,除非目标设备及时确定 nCTS
,否则该方法将超时。
若超时,则会出现 OSError 116
问题。目标设备确定 nCTS
后,字符将立即开始传输。
RTS:OpenMV Cam控制目标设备的传送器¶
若启用RTS流控制,步骤如下:
若使用了缓冲输入( read_buf_len
> 0),则输入的字符就会被缓冲。若缓冲区已满,则下一个接收的字符将导致 nRTS
发生 False
:
目标设备应停止传输。字符从缓冲区中读取时, nRTS
将变为 True
。
- 注意:
any()
方法返回缓冲区中的字节数量。假定一个缓冲区长度。若缓冲区已满,而接收到新一字节, nRTS
将出现False
,且any()
将返回N
数。当字符被读取时,附加字符将被置于缓冲区中,并将包含在随后的any()
调用的结果中。
若未使用缓冲输入( read_buf_len
== 0),接收下一个字符将使得 nRTS
在改字符被读取前出现 False
。