class UART - 串口通信

该类提供uart串口数据传输功能。

构造函数

machine.UART

class machine.UART(UART.UARTn, baudrate, databits, parity, stopbits, flowctl)

参数描述:

  • UARTn - UART编号,int类型,UARTn说明如下:
    UART0 - DEBUG PORT
    UART1 - BT PORT
    UART2 - MAIN PORT
    UART3 - USB CDC PORT (不支持BG95M3)
    UART4 - STDOUT PORT (仅支持EC200U/EC600U/EG915U/EG915N)

  • baudrate - 波特率,int类型,支持常用波特率,如48009600192003840057600115200230400等;

    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