《DNK210 使用指南 -CanMV 版 V1.0》第二十一章 machine.UART类实验

第二十一章 machine.UART类实验

本章将介绍machine模块中的UART类。通过本章的学习,读者将学习到machine模块中UART类的使用。

本章分为如下几个小节:

21.1 machine.UART类介绍

21.2 硬件设计

21.3 程序设计

21.4 运行验证

21.1 machine.UART类介绍

machine.UART类是machine模块内提供的类,该类用于访问和控制Kendryte K210硬件上的UART和UARTHS控制器。Kendryte K210硬件上有3个UART控制器和1个UARTHS控制器,它们能够灵活地与外部设备进行全双工数据交换。

UART一共有3个,其特点如下所示:

  1. 可编程收发波特率

  2. 3个UART的发送FIFO以及接收FIFO共享1024*8bit RAM全双工异步通信

  3. 支持输出信号波特率自动检测功能

  4. 支持5、6、7、8位数据长度

  5. 支持1、1.5、2、3、4位停止位长度

  6. 支持奇偶校验位

  7. 支持RS485协议

  8. 支持IrDA协议

  9. 支持DMA高速数据通信

  10. 支持UART唤醒模式

  11. 支持软件流控和硬件流控

UARTHS一共有1个,其特点如下所示:

  1. 通讯速率可达5Mbps

  2. 8字节接收和发送FIFO

  3. 可编程中断模式

  4. 不支持硬件流控或者其他调制解调控制信号,或异步串行数据转换器

machine.UART提供了UART构造函数,用于创建一个UART对象,UART构造函数如下所示:

ini 复制代码
class UART(id, baudrate=115200, bitwidth=8, parity=None, stop=None, timeout=1000,
timeout_char=10, read_buf_len=2048, ide=False, from_ide=True)

通过UART构造函数可以通过指定参数创建并初始化一个UART对象。

id指的是UART编号,可以是UART.UART1-UART.UART3和UART.UARTHS,分别对应了Kendryte K210硬件上的UART1~UART3和UARTHS。

baudrate指的是UART通信的波特率。

bitwidth指的是UART数据宽度,可以是5、6、7、8位。

parity指的是UART校验位,可以是None、UART. PARITY_ODD和UART. PARITY_EVEN,分别对应无校验位、奇校验和偶校验。

stop指的是UART停止位,可以是1、1.5、2位。

timeout指的是UART接收超时时间。

timeout_char指的是UART作为数据流被读取时,等待一个字节的最长超时时间。

read_buf_len指的是UART接收缓冲区的长度,UART通过中断来接收数据,如果缓冲区满了,则将自动停止数据接收。

ide和from_ide这两个参数,在大多数情况下是在与CanMV IDE软件连接时才使用到的。

UART构造函数的使用示例如下所示:

scss 复制代码
from board import board_infofrom fpioa_manager import fmfrom machine import UARTfm.
register(board_info.EX_UART1_TX, fm.fpioa.UART1_TX)fm.register(board_info.EX_UART1_RX, 
fm.fpioa.UART1_RX)uart1 = UART(UART.UART1, 115200)

machine.UART类为UART对象提供了any()方法,用于获取UART对象的接收缓冲区已有的数据量,any()方法如下所示:

python 复制代码
UART.any()

any()方法用于获取UART对象接收缓冲区中已有的数据量,当UART对象还没有接收到数据,或接收到的数据均已被读出,则any()方法将返回0。

any()方法的使用示例如下所示:

python 复制代码
from board import board_info
from fpioa_manager import fm
from machine import UART

fm.register(board_info.EX_UART1_TX, fm.fpioa.UART1_TX)
fm.register(board_info.EX_UART1_RX, fm.fpioa.UART1_RX)

uart1 = UART(UART.UART1, 115200)

while True:
    if uart1.any() != 0:
        print("Data received!")

machine.UART类为UART对象提供了readchar ()方法,用于从UART对象的接收缓冲区中读取一个字节数据,readchar()方法如下所示:

scss 复制代码
UART.readchar()

readchar()方法用于读取UART对象的接收缓冲区中的一个数据,若UART对象的接收缓冲区中没有可用的数据,则readchar()方法将返回-1。

readchar()方法的使用示例如下所示:

python 复制代码
from board import board_info
from fpioa_manager import fm
from machine import UART

fm.register(board_info.EX_UART1_TX, fm.fpioa.UART1_TX)
fm.register(board_info.EX_UART1_RX, fm.fpioa.UART1_RX)

uart1 = UART(UART.UART1, 115200)

while True:
    data = uart1.readchar()
    if data != -1:
        print(data, end='')

machine.UART类为UART对象提供了read()方法,用于从UART对象的接收缓冲区中读取数据,read()方法如下所示:

bash 复制代码
UART.read(num)

read()方法用于从UART对象的接收缓冲区中读取数据。

num指的是读取数据的字节数,一般情况下可以填入UART对象接收缓冲区的大小,如果接收缓冲区的有效数据没有那么多,read()方法将只返回有效的数据。

read()方法的使用示例如下所示:

python 复制代码
from board import board_info
from fpioa_manager import fm
from machine import UART

fm.register(board_info.EX_UART1_TX, fm.fpioa.UART1_TX)
fm.register(board_info.EX_UART1_RX, fm.fpioa.UART1_RX)

uart1 = UART(UART.UART1, 115200)

print(uart1.read(2048))

machine.UART类为UART对象提供了readline()方法,用于从UART对象的接收缓冲区中读取以行为单位的数据,readline()方法如下所示:

scss 复制代码
UART.readline(num)

readline()方法用于从UART对象的接收缓冲区中读取以行为单位的数据,readline()方法会以"\n"字符作为行与行之间的分隔。

num指的是要读取的行数。

readline()方法的使用示例如下所示:

python 复制代码
from board import board_info
from fpioa_manager import fm
from machine import UART

fm.register(board_info.EX_UART1_TX, fm.fpioa.UART1_TX)
fm.register(board_info.EX_UART1_RX, fm.fpioa.UART1_RX)

uart1 = UART(UART.UART1, 115200)

print(uart1.readline(1))

machine.UART类为UART对象提供了write()方法,用于使用UART对象发送数据,write()方法如下所示:

lua 复制代码
UART.write(buf)

write()方法用于使用UART对象通过UART发送数据。

buf指的是待发送的数据。

write()方法的使用示例如下所示:

javascript 复制代码
from board import board_info
from fpioa_manager import fm
from machine import UART

fm.register(board_info.EX_UART1_TX, fm.fpioa.UART1_TX)
fm.register(board_info.EX_UART1_RX, fm.fpioa.UART1_RX)

uart1 = UART(UART.UART1, 115200)

uart1.write("Hello, World!")

21.2 硬件设计

21.2.1 例程功能

  1. 创建两个UART对象,两个UART对象除了UART编号使用相同的配置参数。

  2. 当KEY0按键被按下后,使用UART1往UART2发送数据,并将UART2接收到的数据通过print()打印输出。

  3. 当KEY1按键被按下后,使用UATY2往UART1发送数据,并将UART1接收到的数据通过printf()打印输出。

21.2.2 硬件资源

  1. 扩展串口接口1

UART1_TXD - IO7

UART1_RXD - IO9

  1. 扩展串口接口2

UART2_TXD - IO6

UART2_RXD - IO8

21.2.3 原理图

本章实验内容,需要使用到板载的扩展串口接口1和扩展串口接口2,正点原子DNK210开发板上的扩展串口接口连接原理图,如下图所示:

图21.2.3.1 扩展串口接口连接原理图

由于需要让这两个串口扩展接口相互通信,因此需要使用杜邦线或其他线材从物理上连接这这两个接口,连接时需要注意串口线路的连接需要将TXD信号和RXD信号交叉连接。

21.3 程序设计

21.3.1 machine.UART类

有关machine.UART类的介绍,请见第21.1小节《machine.UART类介绍》。

21.3.2 程序流程图

图21.3.2.1 machine.UART类实验流程图

21.3.3 main.py代码

main.py中的脚本代码如下所示:

scss 复制代码
from board import board_info
from fpioa_manager import fm
from maix import GPIO
import time
from machine import UART

fm.register(board_info.KEY0, fm.fpioa.GPIOHS0)
fm.register(board_info.KEY1, fm.fpioa.GPIOHS1)
key0 = GPIO(GPIO.GPIOHS0, GPIO.IN, GPIO.PULL_UP)
key1 = GPIO(GPIO.GPIOHS1, GPIO.IN, GPIO.PULL_UP)

fm.register(board_info.EX_UART1_TX, fm.fpioa.UART1_TX)
fm.register(board_info.EX_UART1_RX, fm.fpioa.UART1_RX)
fm.register(board_info.EX_UART2_TX, fm.fpioa.UART2_TX)
fm.register(board_info.EX_UART2_RX, fm.fpioa.UART2_RX)

# 构造UART对象
uart1 = UART(UART.UART1, 115200)
uart2 = UART(UART.UART2, 115200)

while True:
    if key0.value() == 0:
        time.sleep_ms(20)
        if key0.value() == 0:
            # UART发送数据
            uart1.write("From UART1!")
            while key0.value() == 0:
                pass
    elif key1.value() == 0:
        time.sleep_ms(20)
        if key1.value() == 0:
            # UART发送数据
            uart2.write("From UART2!")
            while key1.value() == 0:
                pass
    if uart1.any() != 0:
        # UART接收数据
        data = uart1.read()
        print("UART1 get data:", data.decode())
    if uart2.any() != 0:
        # UART接收数据
        data = uart2.read()
        print("UART2 get data:", data.decode())

可以看到首先就是构造了两个UART对象,并且配置了相同的通信波特率。

接着便在一个循环中读取按键状态和两个UART的数据接收状态,如果KEY0按键被按下,则通过UART1对象发送"From UART1!"的数据,如果KEY1按键被按下,则通过UART2对象发送"From UART2!"的数据,如果UART1对象或UART2对象接收到数据,并将接收到的数据加上UART对象编号后通过print()打印输出。

由于本章实验要求板载的两个扩展串口接口通过线材进行连接,因此当KEY0按键被按下后,UART1对象发出的数据将被UART2对象接收,并会被通过print()打印输出,当KEY1按键被按下后,UART2对象发出的数据将被UART1对象接收,并会通过print()打印输出。

21.4 运行验证

将DNK210开发板连接CanMV IDE,并点击CanMV IDE上的"开始(运行脚本)"按钮后,同时将板载的两个扩展串口接口通过线材按照要求进行相互连接。

此时,若分别按下KEY0按键和KEY1按键,CanMV IDE软件的"串行中断"将依次输出UART2对象和UART1对象接收到的数据,如下图所示:

图21.4.1 "串行终端"窗口打印输出

可以看到,首先UART2对象接收到了来自UART1对象发送的数据,然后UART1对象接收到了来自UART2发送的数据,这与理论推断的结果一致。

相关推荐
HDU-Dade8 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
在所不辞兄9 小时前
【零基础学智能仿真-63】ABACUS作业工具与MCP接口
人工智能·深度学习·神经网络·机器学习·智能仿真
楚山之石9 小时前
【Medical Image Analysis】深度学习医学图像合成综述:伪CT、合成MRI与合成PET的架构、性能与临床边界
图像处理·人工智能·学习·mr·mri
blackappleD9 小时前
百度 Unlimited OCR 2 拆解:SR-SWA 如何让百页文档的 KV 缓存不再涨
人工智能·llm
数字新视界9 小时前
国产动环数据库在智能机房环境监控中的应用与优势分析
大数据·人工智能·数据中心·机房管理·模块化机房
holly就是我9 小时前
AI 编程助手为什么跑偏?用开源 ccglass 看清 Prompt、工具调用和 Token 消耗
人工智能·后端
雨中飘荡的记忆9 小时前
额度又见底了?这个开源项目,给 AI 编程助手接上 61 家"加油站"
人工智能
天远Date Lab9 小时前
零信任架构实战:基于天远企业年报信息核验构建自动化商业保理财务与社保穿透评估网关
人工智能·架构·自动化
EnCi Zheng9 小时前
后端怎么把AI接口稳定安全低成本接进业务:超时重试、密钥隔离与成本熔断清单
人工智能·后端·安全·架构·api
loulanyue_10 小时前
给概率大模型套上确定性缰绳:GraphRAG、神经符号与知识超图重构可信AI底座——读陈华钧杨博等CNCC2026第十届知识图谱论坛实录
人工智能·rag