UART类 – 串口通讯类¶
UART实现标准UART / USART双向串行通信协议。其物理层包括两条线:RX和TX。通信单元是一个可为8位或9位宽的字符(请勿与字符串字符混淆)。
UART对象可使用下列方式创建并初始化:
from pyb import UART
uart = UART(1, 9600) # init with given baudrate
uart.init(9600, bits=8, parity=None, stop=1) # 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对象与流对象相似,其读取与写入均使用流对象方法:
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。bus
若无额外参数,可创建UART对象,但未进行初始化( 其设置来自总线的最后一次初始化,若存在的话)。若给定额外参数,则总线初始化。初始化参数请参见init
。UART总线的物理引脚为:
UART(4)
is onXA
:(TX, RX) = (X1, X2) = (PA0, PA1)
UART(1)
is onXB
:(TX, RX) = (X9, X10) = (PB6, PB7)
UART(6)
is onYA
:(TX, RX) = (Y1, Y2) = (PC6, PC7)
UART(3)
is onYB
:(TX, RX) = (Y9, Y10) = (PB10, PB11)
UART(2)
is on:(TX, RX) = (X3, X4) = (PA2, PA3)
The Pyboard Lite supports UART(1), UART(2) and UART(6) only, pins are:
UART(1)
is onXB
:(TX, RX) = (X9, X10) = (PB6, PB7)
UART(6)
is onYA
:(TX, RX) = (Y1, Y2) = (PC6, PC7)
UART(2)
is on:(TX, RX) = (X1, X2) = (PA2, PA3)
The Pyboard D supports UART(1), UART(2), UART(3) and UART(4) only, pins are:
UART(4)
is onXA
:(TX, RX) = (X1, X2) = (PA0, PA1)
UART(1)
is onYA
:(TX, RX) = (Y1, Y2) = (PA9, PA10)
UART(3)
is onYB
:(TX, RX) = (Y9, Y10) = (PB10, PB11)
UART(2)
is on:(TX, RX) = (X3, X4) = (PA2, PA3)
Note: Pyboard D has
UART(1)
onYA
, unlike Pyboard and Pyboard Lite that both haveUART(1)
onXB
andUART(6)
onYA
.
方法¶
- UART.init(baudrate, bits=8, parity=None, stop=1, *, timeout=0, 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位。
pyb.freq
注意: 奇偶性为None时,仅支持位数为8和9。启用奇偶性时,仅支持位数为7和8。
- UART.deinit()¶
关闭UART总线。
- UART.any()¶
返回等待的字节数量(可能为0)。
- UART.read([nbytes])¶
读取字符。若指定
nbytes
,则最多只能读取该数量的字节。若nbytes
在缓冲区中可用,立即返回,否则在达到足够字符或超时时间过期时返回。在达到
nbytes
足够字符或超时时间过期时返回。注意: 9位字符的每个字符占2字节,
nbytes
须为偶,字符的数量为``nbytes/2`` .返回值:读取并存入 buf 的字节数;若超时则返回
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(2)
UART(3)
支持使用下列引脚的RTS/CTS的硬件流控制:
UART(2)
is on:(TX, RX, nRTS, nCTS) = (X3, X4, X2, X1) = (PA2, PA3, PA1, PA0)
UART(3)
is on :(TX, RX, nRTS, nCTS) = (Y9, Y10, Y7, Y6) = (PB10, PB11, PB14, PB13)
On the Pyboard Lite only UART(2)
supports flow control on these pins:
(TX, RX, nRTS, nCTS) = (X1, X2, X4, X3) = (PA2, PA3, PA1, PA0)
在下文中,术语“target”均指与UART相连的设备。
当UART的 init()
方法被调用,且 flow
被设为 UART.RTS
和 UART.CTS
的其中一个或两个, 则配置相关的流控制引脚。 nRTS
为低电平有效输出,nCTS
为启用了上拉下的低电平有效输入。为实现流控制, nCTS
信号须与目标设备的 nRTS
相连,的 nRTS
与目标设备的 nCTS
相连。
CTS: 目标设备控制znzpi Cam发送器¶
若启用了CTS流控制,则写入过程如下:
若调用 UART.write(buf)
方法,当 nCTS
为 False
时,任何周期的传递都会暂停。 若整个缓冲区未在超时周期内传输,则会导致超时。该方法返回所写入的字节数,允许用户在需要时写入剩余数据。 在超时事件中,在 nCTS
之前,字符将始终留在UART中。组成这一字符的字节将包括在返回值中。
若 nCTS
为 False
时 UART.writechar()
被调用,除非目标设备及时确定 nCTS
,否则该方法将超时。 若超时,则会出现 OSError 116
问题。目标设备确定 nCTS 后,字符将立即开始传输。
RTS:控制目标设备的传送器¶
若启用RTS流控制,步骤如下:
若使用了缓冲输入( read_buf_len
> 0),则输入的字符就会被缓冲。若缓冲区已满,则下一个接收的字符将导致 nRTS
发生 False
: 目标设备应停止传输。字符从缓冲区中读取时, nRTS
将变为 True
。
注意:any()
方法返回缓冲区中的字节数量。假定一个缓冲区长度。若缓冲区已满,而接收到新一字节,nRTS
将出现 False ,且 any()
将返回 N
数。当字符被读取时,附加字符将被置于缓冲区中,并将包含在随后的 any()
调用的结果中。
若启用RTS流控制,步骤如下:若使用了缓冲输入( read_buf_len
> 0),则输入的字符就会被缓冲。若缓冲区已满,则下一个接收的字符将导致 nRTS 发生 False : 目标设备应停止传输。字符从缓冲区中读取时, nRTS
将变为 False
。