class UART - 串口通信
该类提供uart串口数据传输功能。
构造函数
machine.UART
class machine.UART(UART.UARTn, baudrate, databits, parity, stopbits, flowctl)
参数描述:
UARTn
- UART编号,int类型,UARTn说明如下:UART0
- DEBUG PORTUART1
- BT PORTUART2
- MAIN PORTUART3
- USB CDC PORT (不支持BG95M3)UART4
- STDOUT PORT (仅支持EC200U/EC600U/EG915U/EG915N)baudrate
- 波特率,int类型,支持常用波特率,如4800
、9600
、19200
、38400
、57600
、115200
、230400
等;EC200U/EC600U/EG912U/EG915U系列支持2400、4800、9600、14400、19200、28800、33600、38400、57600、115200、230400、460800、921600、1000000。
databits
- 数据位[5 ~ 8],int类型,EC600U/EC200U/EG915U/EC800G仅支持8位。parity
- 奇偶校验(0
– NONE,1
– EVEN,2
– ODD),int类型。stopbits
- 停止位[1 ~ 2],int类型。flowctl
- 硬件控制流(0
– FC_NONE,1
– FC_HW),int类型。
UART引脚对应关系 :
平台 | 引脚 |
---|---|
EC600U | uart1: TX: 引脚号124 RX: 引脚号123 uart2: TX:引脚号32 RX:引脚号31 RTS:引脚号34 CTS:引脚号33 uart4: TX:引脚号103 RX:引脚号104 |
EC200U | uart1: TX: 引脚号138 RX: 引脚号137 uart2: TX:引脚号67 RX:引脚号68 RTS:引脚号65 CTS:引脚号64 uart4: TX:引脚号82(EC200UXXAA不支持) RX:引脚号81 |
EC200A/UC200A | uart0:(建议使用其他uart) TX: 引脚号12 RX: 引脚号11 uart1: TX: 引脚号63(EC200ACN_LA: 引脚号26) RX: 引脚号66(EC200ACN_LA: 引脚号27) uart2: TX:引脚号67 RX:引脚号68 注意:EC200ACN_LA模组uart1引脚号与其他型号不同 |
EC600S/EC600N | uart0: TX: 引脚号71 RX: 引脚号72 uart1: TX: 引脚号3 RX: 引脚号2 uart2: TX:引脚号32 RX:引脚号31 |
EC100Y | uart0: TX: 引脚号21 RX: 引脚号20 uart1: TX: 引脚号27 RX: 引脚号28 uart2: TX:引脚号50 RX:引脚号49 |
EC800N | uart0: TX: 引脚号39 RX: 引脚号38 uart1: TX: 引脚号50 RX: 引脚号51 uart2: TX:引脚号18 RX:引脚号17 |
BC25PA | uart1: TX: 引脚号29 RX: 引脚号28 |
BG95M | uart0: TX: 引脚号23 RX: 引脚号22 uart1: TX:引脚号27 RX:引脚号28 uart2: TX: 引脚号64 RX: 引脚号65 uart4: TX:引脚号35 RX:引脚号34 |
EC600M | uart0: TX: 引脚号71 RX: 引脚号72 uart1(flowctl = 0): TX: 引脚号3 RX: 引脚号2 uart1(flowctl = 1): TX: 引脚号33 RX: 引脚号34 uart2: TX:引脚号32 RX:引脚号31 |
EG915U | uart1: TX: 引脚号27 RX: 引脚号28 uart2: TX:引脚号35 RX:引脚号34 CTS:引脚号36 RTS:引脚号37 uart4: TX:引脚号19 RX:引脚号18 |
EC800M/EG810M | uart0: TX: 引脚号39 RX: 引脚号38 uart1(flowctl = 0): TX: 引脚号50 RX: 引脚号51 uart1(flowctl = 1): TX: 引脚号22 RX: 引脚号23 注意:EC800MCNGA 、CNGD/ EG810MCNGA 模块的 uart1 不可用 uart2: TX:引脚号18 RX:引脚号17 uart4: TX:引脚号29 RX:引脚号28 |
EG912N | uart0: TX: 引脚号23 RX: 引脚号22 uart1(flowctl = 0): TX: 引脚号27 RX: 引脚号28 uart1(flowctl = 1): TX: 引脚号36 RX: 引脚号37 uart2: TX:引脚号35 RX:引脚号34 |
EC600E | uart0: TX: 引脚号71 RX: 引脚号72 uart1:(EC600ECN_LE&LQ不可用) TX:引脚号70 RX:引脚号69 uart2: TX:引脚号32 RX:引脚号31 |
EC800E | uart0: TX: 引脚号39 RX: 引脚号38 uart1: TX:引脚号29 RX:引脚号28 uart2: TX:引脚号18 RX:引脚号17 |
EC600G | uart1: TX: 引脚号124 RX: 引脚号123 uart2: TX:引脚号32 RX:引脚号31 RTS:引脚34 CTS:引脚33 uart4: TX:引脚号116 RX:引脚号9 uart5: TX:引脚号125 RX:引脚号126 uart6: TX:引脚号106 RX:引脚号105 |
EC800G | uart1: TX: 引脚号29 RX: 引脚号28 uart2: TX:引脚号18 RX:引脚号17 uart5: TX:引脚号23 RX:引脚号22 uart6: TX:引脚号86 RX:引脚号83 |
EG912U | uart1: TX: 引脚号27 RX: 引脚号28 uart2: TX: 引脚号35 RX: 引脚号34 CTS:引脚号36 RTS:引脚号37 uart4:(EG912UGL_AA不可用) TX:引脚号19 RX:引脚号18 |
EC600K | uart0: TX: 引脚号71 RX: 引脚号72 uart1(flowctl = 0): TX: 引脚号3 RX: 引脚号2 uart1(flowctl = 1): TX: 引脚号33 RX: 引脚号34 uart2: TX:引脚号32 RX:引脚号31 |
EC800K/EG800K | uart0: TX: 引脚号39 RX: 引脚号38 uart1(flowctl = 0):(EG800KCN不可用) TX: 引脚号50 RX: 引脚号51 uart1(flowctl = 1):(EG800KCN不可用) TX: 引脚号22 RX: 引脚号23 uart2: TX:引脚号18 RX:引脚号17 |
EG800P | uart0: TX: 引脚号39 RX: 引脚号38 uart1: TX: 引脚号22 RX: 引脚号23 uart2: TX:引脚号18 RX:引脚号17 RTS:引脚23 CTS:引脚22 uart3: TX:引脚号29 RX:引脚号28 |
FCM360W | uart0: TX: 引脚号27 RX: 引脚号26 uart2: TX:引脚号20 RX:引脚号19 |
FCM362K | uart1: TX: 引脚号35 RX: 引脚号34 uart2: TX:引脚号28 RX:引脚号27 |
BC32 | uart0: TX: 引脚号21 RX: 引脚号22 |
BC92 | uart0: TX: 引脚号22 RX: 引脚号21 |
EG915N | uart0: TX: 引脚号23 RX: 引脚号22 uart1: TX: 引脚号27 RX: 引脚号28 uart2: TX: 引脚号35 RX: 引脚号34 CTS:引脚号36 RTS:引脚号37 uart4:(EG915NEU_AG不支持) TX:引脚号36 RX:引脚号37 |
EC800Z | uart0: TX: 引脚号39 RX: 引脚号38 uart1: TX:引脚号29 RX:引脚号28 uart2: TX:引脚号18 RX:引脚号17 |
1、EC600M/EC800M/EG810M/EG912N/EC600K/EC800K 的uart1在flowctl = 1时,仅将uart1映射到不同的引脚,未开启流控功能。
2、BG95系列使用UART4需要先调用modem.main_uart_enable_set(1)使能UART4,重启生效,如下
import modem #获取Main_UART使能状态 1-使能,0-不使能 modem.main_uart_enable_get() #设置Main_UART使能状态 1-使能,0-不使能,重启生效 modem.main_uart_enable_set(1)
3、FCM360W UART2被初始化后交互口将无法使用,需要在代码中执行uart2.close()或者重启模组才可继续使用交互口。
4、FCM362K UART1被初始化后交互口将无法使用,需要在代码中执行uart1.close()或者重启模组才可继续使用交互口。
示例:
>>> # 创建uart对象
>>> from machine import UART
>>> uart1 = UART(UART.UART1, 115200, 8, 0, 1, 0)
方法
uart.any
uart.any()
该方法用于获取接收缓存未读数据大小。
返回值描述:
返回接收缓存器中有多少字节的数据未读。
示例:
>>> uart1.any()
20 #表示接收缓冲区中有20字节数据未读
uart.read
uart.read(nbytes)
该方法用于从串口读取数据。
参数描述:
nbytes
- 要读取的字节数,int类型。
返回值描述:
返回读取的数据。
uart.write
uart.write(data)
该方法用于发送数据到串口。
参数描述:
data
- 发送的数据,bytes类型。
返回值描述:
返回发送的字节数。
uart.close
uart.close()
该方法用于关闭串口。
返回值描述:
成功返回整型值0
,失败返回整型值-1
。
uart.control_485
uart.control_485(UART.GPIOn, direction)
该方法用于控制485通信方向,串口发送数据之前和之后进行拉高拉低指定GPIO,用来指示485通信的方向。
参数描述:
GPIOn
- 需要控制的GPIO引脚号,参照Pin模块的引脚定义,int类型。direction
- 引脚电平变化,int类型,说明如下:1
表示引脚电平变化为:串口发送数据之前由低拉高、发送数据之后再由高拉低0
表示引脚电平变化为:串口发送数据之前由高拉低、发送数据之后再由低拉高
返回值描述:
成功返回整型值0
,失败返回整型值-1
。
BC25PA/BG95M3/FCM360W平台不支持此方法。
示例:
>>> from machine import UART
>>> uart1 = UART(UART.UART1, 115200, 8, 0, 1, 0)
>>> uart1.control_485(UART.GPIO24, 1)
uart.set_callback
uart.set_callback(fun)
该方法用于设置串口数据回调,串口收到数据后,会执行该回调。
参数描述:
fun
- 串口回调函数,回调函数原型:fun(result_list)
回调函数参数描述:
result_list[0]
:接收是否成功(0:成功,其它:失败)result_list[1]
:接收端口result_list[2]
:返回有多少数据
返回值描述:
成功返回整型值0
,失败返回整型值-1
。
示例:
>>> from machine import UART
>>> uart1 = UART(UART.UART1, 115200, 8, 0, 1, 0)
>>>
>>> def uart_call(para):
>>> print(para)
>>> uart1.set_callback(uart_call)
使用示例:
"""
运行本例程,需要通过串口线连接开发板的 MAIN 口和PC,在PC上通过串口工具
打开 MAIN 口,并向该端口发送数据,即可看到 PC 发送过来的消息。
"""
import _thread
import utime
import log
from machine import UART
'''
* 参数1:端口
注:EC100YCN平台与EC600SCN平台,UARTn作用如下
UART0 - DEBUG PORT
UART1 – BT PORT
UART2 – MAIN PORT
UART3 – USB CDC PORT
* 参数2:波特率
* 参数3:data bits (5~8)
* 参数4:Parity (0:NONE 1:EVEN 2:ODD)
* 参数5:stop bits (1~2)
* 参数6:flow control (0: FC_NONE 1:FC_HW)
'''
# 设置日志输出级别
log.basicConfig(level=log.INFO)
uart_log = log.getLogger("UART")
class Example_uart(object):
def __init__(self, no=UART.UART2, bate=115200, data_bits=8, parity=0, stop_bits=1, flow_control=0):
self.uart = UART(no, bate, data_bits, parity, stop_bits, flow_control)
self.uart.set_callback(self.callback)
def callback(self, para):
uart_log.info("call para:{}".format(para))
if(0 == para[0]):
self.uartRead(para[2])
def uartWrite(self, msg):
uart_log.info("write msg:{}".format(msg))
self.uart.write(msg)
def uartRead(self, len):
msg = self.uart.read(len)
utf8_msg = msg.decode()
uart_log.info("UartRead msg: {}".format(utf8_msg))
return utf8_msg
def uartWrite_test(self):
for i in range(10):
write_msg = "Hello count={}".format(i)
self.uartWrite(write_msg)
utime.sleep(1)
if __name__ == "__main__":
uart_test = Example_uart()
uart_test.uartWrite_test()
# 运行结果示例
'''
INFO:UART:write msg:Hello count=0
INFO:UART:write msg:Hello count=1
INFO:UART:write msg:Hello count=2
INFO:UART:write msg:Hello count=3
INFO:UART:write msg:Hello count=4
INFO:UART:write msg:Hello count=5
INFO:UART:write msg:Hello count=6
INFO:UART:write msg:Hello count=7
INFO:UART:write msg:Hello count=8
INFO:UART:write msg:Hello count=9
INFO:UART:call para:[0, 2, 15]
INFO:UART:UartRead msg: my name is XXX
'''
常量
常量 | 说明 |
---|---|
UART.UART0 | UART0 |
UART.UART1 | UART1 |
UART.UART2 | UART2 |
UART.UART3 | UART3 |
UART.UART4 | UART4 |