UART 类——双工串行通信总线¶
UART 实现标准的 UART/USART 双工串行通信协议。在物理层,它由 2 条线组成: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。奇偶校验可以是无、0(偶数)或 1(奇数)。停止可以是 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
可以使用以下方法读取/写入单个字符:
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 对象。对于 Pyboard,
bus
可以是1-4、6 、'XA'、'XB'、'YA' 或 'YB'。对于 Pyboard Lite,bus
可以是1、2、6 、'XB' 或 'YA'。对于 Pyboard Dbus
可以是 1-4、'XA'、'YA' 或 'YB'。在没有附加参数的情况下,UART 对象被创建但不初始化(它具有总线上次初始化的设置,如果有的话)。如果给出了额外的参数,则总线被初始化。参见init
初始化参数。Pyboard 上 UART 总线的物理引脚为:
UART(4)
正在XA
:(TX, RX) = (X1, X2) = (PA0, PA1)
UART(1)
正在XB
:(TX, RX) = (X9, X10) = (PB6, PB7)
UART(6)
正在YA
:(TX, RX) = (Y1, Y2) = (PC6, PC7)
UART(3)
正在YB
:(TX, RX) = (Y9, Y10) = (PB10, PB11)
UART(2)
正在(TX, RX) = (X3, X4) = (PA2, PA3)
Pyboard Lite 仅支持 UART(1)、UART(2) 和 UART(6),引脚为:
UART(1)
正在XB
:(TX, RX) = (X9, X10) = (PB6, PB7)
UART(6)
正在YA
:(TX, RX) = (Y1, Y2) = (PC6, PC7)
UART(2)
正在(TX, RX) = (X1, X2) = (PA2, PA3)
Pyboard D 仅支持 UART(1)、UART(2)、UART(3) 和 UART(4),引脚为:
UART(4)
正在XA
:(TX, RX) = (X1, X2) = (PA0, PA1)
UART(1)
正在YA
:(TX, RX) = (Y1, Y2) = (PA9, PA10)
UART(3)
正在YB
:(TX, RX) = (Y9, Y10) = (PB10, PB11)
UART(2)
正在(TX, RX) = (X3, X4) = (PA2, PA3)
注意: Pyboard D 有
UART(1)
YA
不像 Pyboard 和 Pyboard Lite 都有UART(1)
XB
和UART(6)
YA
。
方法¶
-
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 或 2。flow
设置流量控制类型。可以是 0、UART.RTS
,UART.CTS
或UART.RTS | UART.CTS
.timeout
是等待写入/读取第一个字符的超时时间(以毫秒为单位)。timeout_char
是在写入或读取时在字符之间等待的超时时间(以毫秒为单位)。read_buf_len
是读取缓冲区的字符长度(0 表示禁用)。
如果波特率无法设置在所需值的 5% 以内,则此方法将引发异常。最小波特率由 UART 所在的总线频率决定;UART(1) 和 UART(6) 为 APB2,其余在 APB1 上。默认总线频率为 UART(1) 和 UART(6) 提供 1300 的最小波特率,为其他提供 650 的最小波特率。使用
pyb.freq
来降低总线频率以获得较低的波特率。注意:parity=None 时,仅支持 8 位和 9 位。启用奇偶校验后,仅支持 7 位和 8 位。
-
UART.
deinit
()¶ 关闭 UART 总线。.
-
UART.
any
()¶ 返回等待的字节数(可能为 0)。
-
UART.
read
([nbytes])¶ 读取字符。如果
nbytes
指定,则最多读取那么多字节。如果nbytes
缓冲区中可用,则立即返回,否则在足够的字符到达或超时后返回。如果
nbytes
未给出,则该方法会读取尽可能多的数据。它在超时过后返回。注意:对于 9 位字符,每个字符
nbytes
占两个字节,必须是偶数,字符数为nbytes/2
.返回值:包含读入字节的字节对象。
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
.
流量控制¶
在 Pyboards V1 和 V1.1 上,UART(2)
并UART(3)
使用以下引脚支持 RTS/CTS 硬件流控制:
UART(2)
正在:(TX, RX, nRTS, nCTS) = (X3, X4, X2, X1) = (PA2, PA3, PA1, PA0)
UART(3)
正在:(TX, RX, nRTS, nCTS) = (Y9, Y10, Y7, Y6) = (PB10, PB11, PB14, PB13)
在 Pyboard Lite 上仅UART(2)
支持对这些引脚的流量控制:
(TX, RX, nRTS, nCTS) = (X1, X2, X4, X3) = (PA2, PA3, PA1, PA0)
在以下段落中,术语“目标”是指连接到 UART 的设备。
当init()
调用UART 的方法并flow
设置为其中一个或两个时
UART.RTS
and UART.CTS
相关的流量控制引脚已配置。
nRTS
是一个低电平有效输出, nCTS
是一个启用了上拉的低电平有效输入。为了实现流量控制,Pyboard 的nCTS
信号应连接到目标,nRTS
而Pyboard 的信号应连接到 nRTS
目标的nCTS
.
CTS:目标控制 Pyboard 发射器¶
如果启用 CTS 流控制,则写入行为如下:
如果UART.write(buf)
调用Pyboard 的方法,则传输将在nCTS
是时停止任何时间段 False
。 如果整个缓冲区没有在超时时间内传输,这将导致超时。该方法返回写入的字节数,使用户能够在需要时写入剩余的数据。在超时的情况下,一个字符将保留在 UART pending 中 nCTS
。组成该字符的字节数将包含在返回值中。
如果 UART.writechar()
当被称为 nCTS
是False
除非目标断言方法将超时 nCTS
时间。如果超时 将被提出。一旦目标断言,字符将被传输。 OSError 116
nCTS
.
RTS:Pyboard 控制目标的发射器¶
如果启用 RTS 流控,则行为如下:
如果使用缓冲输入 (read_buf_len
> 0),则缓冲输入字符。如果缓冲区已满,下一个到达的字符将导致nRTS
会去
False
:目标应停止传输。当从缓冲区读取字符时nRTS
会去 True
。
请注意,该 any()
方法返回缓冲区中的字节数。假设缓冲区长度为N
字节。如果缓冲区已满,并且另一个字符到达,
nRTS
则将设置为 False,并any()
返回计数N
。当读取字符时,附加字符将被放置在缓冲区中,并将包含在后续any()
调用的结果中。
如果缓冲的输入不使用(read_buf_len
== 0)字符的到来将导致nRTS
去 False
,直到字符被读取。