【正点原子K210连载】第二十一章 machine.UART类实验摘自【正点原子】DNK210使用指南-CanMV版指南

1)实验平台:正点原子ATK-DNK210开发板
2)平台购买地址https://detail.tmall.com/item.htm?id=731866264428
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第二十一章 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个,其特点如下所示:
  12. 通讯速率可达5Mbps
  13. 8字节接收和发送FIFO
  14. 可编程中断模式
  15. 不支持硬件流控或者其他调制解调控制信号,或异步串行数据转换器
    machine.UART提供了UART构造函数,用于创建一个UART对象,UART构造函数如下所示:
    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构造函数的使用示例如下所示:
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)

machine.UART类为UART对象提供了any()方法,用于获取UART对象的接收缓冲区已有的数据量,any()方法如下所示:
UART.any()
any()方法用于获取UART对象接收缓冲区中已有的数据量,当UART对象还没有接收到数据,或接收到的数据均已被读出,则any()方法将返回0。
any()方法的使用示例如下所示:

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()方法如下所示:
UART.readchar()
readchar()方法用于读取UART对象的接收缓冲区中的一个数据,若UART对象的接收缓冲区中没有可用的数据,则readchar()方法将返回-1。
readchar()方法的使用示例如下所示:

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()方法如下所示:
UART.read(num)
read()方法用于从UART对象的接收缓冲区中读取数据。
num指的是读取数据的字节数,一般情况下可以填入UART对象接收缓冲区的大小,如果接收缓冲区的有效数据没有那么多,read()方法将只返回有效的数据。
read()方法的使用示例如下所示:

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()方法如下所示:
UART.readline(num)
readline()方法用于从UART对象的接收缓冲区中读取以行为单位的数据,readline()方法会以“\n”字符作为行与行之间的分隔。
num指的是要读取的行数。
readline()方法的使用示例如下所示:

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()方法如下所示:
UART.write(buf)
write()方法用于使用UART对象通过UART发送数据。
buf指的是待发送的数据。
write()方法的使用示例如下所示:

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 硬件资源
  4. 扩展串口接口1
    UART1_TXD - IO7
    UART1_RXD - IO9
  5. 扩展串口接口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中的脚本代码如下所示:

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发送的数据,这与理论推断的结果一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/792358.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中HashMap详解:hash原理、扩容机制、线程不安全及源码分析

前言 HashMap 是 Java 中常用的数据结构之一,用于存储键值对。在 HashMap 中,每个键都映射到一个唯一的值,可以通过键来快速访问对应的值,算法时间复杂度可以达到 O(1)。 HashMap 的实现原理是基于哈希表的,它的底层是…

禁用华为小米?微软中国免费送iPhone15

微软中国将禁用华为和小米手机,要求员工必须使用iPhone。如果还没有iPhone,公司直接免费送你全新的iPhone 15! 、 这几天在微软热度最高的话题就是这个免费发iPhone,很多员工,收到公司的通知。因为,登录公司…

ITSS服务经理职责与认可情况分析

随着信息技术的高速发展和广泛应用,企业对信息技术管理和应用的需求日益凸显。 为满足这一迫切需求,对具备专业知识和技能的人才的需求也日益增长,他们负责管理和实施相关项目。 因此,ITSS服务项目经理证书应运而生,这…

提升Selenium在Chrome上的HTML5视频捕获效果的五个方法

在使用Selenium进行网页自动化测试时,捕获HTML5视频是一个常见的需求。然而,许多开发者发现,在使用Chrome浏览器时,视频捕获效果并不理想,经常出现视频背景为空白的问题。本文将概述五种方法,帮助提升Selen…

基于语义的法律问答系统

第一步,准备数据集 第二步,构建索引数据集,问答对数据集,训练数据集,召回评估数据集 第三步,构建dataloader,选择优化器训练模型,之后召回评估 第四步,模型动转静,之后…

eplan软件许可优化解决方案

Eplan软件介绍 Eplan是一款专业的电气设计软件,用于自动化工程和电气系统的设计与文档化。它由德国的Eplan Software & Service GmbH开发,并在全球范围内广泛应用于工程设计和电气工程领域。 Eplan软件提供了全面的工具和功能,以简化和优…

Vue3 引入腾讯地图 包含标注简易操作

1. 引入腾讯地图API JavaScript API | 腾讯位置服务 (qq.com) 首先在官网注册账号 并正确获取并配置key后 找到合适的引入方式 本文不涉及版本操作和附加库 据体引入参数参考如下图 具体以链接中官方参数为准标题 在项目根目录 index.html 中 写入如下代码 <!-- 引入腾…

微软的人工智能语音生成器在测试中达到与人类同等水平

微软公司开发了一种新的神经编解码语言模型 Vall-E&#xff0c;在自然度、语音鲁棒性和说话者相似性方面都超越了以前的成果。它是同类产品中第一个在两个流行基准测试中达到人类同等水平的产品&#xff0c;而且显然非常逼真&#xff0c;以至于微软不打算向公众开放。 VALL-E …

车载测试资料学习和CANoe工具实操车载项目(每日直播)

每日直播时间&#xff1a;&#xff08;直播方式&#xff1a;腾讯会议&#xff09; 周一到周五&#xff1a;20&#xff1a;00-23&#xff1a;00 周六与周日&#xff1a;9&#xff1a;00-17&#xff1a;00 向进腾讯会议学习的&#xff0c;可以关注我并后台留言 直播内容&#xff…

GPMC并口多通道AD采集案例,基于TI AM62x四核处理器平台!

GPMC并口简介 GPMC(General Purpose Memory Controller)是TI处理器特有的通用存储器控制器接口&#xff0c;是AM62x、AM64x、AM437x、AM335x、AM57x等处理器专用于与外部存储器设备的接口&#xff0c;如&#xff1a; (1)FPGA器件 (2)ADC器件 (3)SRAM内存 (4)NOR/NAND闪存 …

electron实现右键菜单保存图片功能

1.创建窗口&#xff0c;加载页面&#xff0c;代码如下&#xff1a; //打开窗口const {ipcMain, BrowserWindow} require("electron") const saveImage require("../ipcMain/saveImage") let win null; ipcMain.handle(on-open-event, (event, args) &g…

Airtest成功案例分享:KLab连续2年携Airtest私有云产品参加CEDEC大会!

一、KLab株式会社介绍 KLab株式会社是一家位于日本的移动游戏开发公司&#xff0c;成立于2000年。公司以开发和运营基于动漫和漫画IP的手机游戏而闻名&#xff0c;尤其是在音乐节奏游戏领域。KLab的一些知名作品包括《LoveLive!学园偶像祭》、《排球少年&#xff1a;新的征程》…

【unity笔记】常见问题收集

一 . Unity Build GI data 卡住问题 问题解决: 参考官方文档&#xff0c;GI(Global Illumination) data 指的是全局照明信息。 在Unity的Edit->Preference中&#xff0c;可以编辑GI缓存路径和分配GI缓存大小。 调出Window->Rendering->Lighting窗口&#xff0c;取消…

阿里云调整全球布局关停澳洲云服务器,澳洲服务器市场如何选择稳定可靠的云服务?

近日&#xff0c;阿里云宣布将关停澳大利亚地域的数据中心服务&#xff0c;这一决定引发了全球云计算行业的广泛关注。作为阿里云的重要海外市场之一&#xff0c;澳洲的数据中心下架对于当地的企业和个人用户来说无疑是一个不小的挑战。那么&#xff0c;在阿里云调整全球布局的…

vue vite+three在线编辑模型导入导出

文章目录 序一、1.0.0版本1.新增2.编辑3.导出4.导入 二、2.0.0版本1. 修复模型垂直方向放置时 模型会重合4. 修复了导出导入功能 现在是1:1导出导入5. 新增一个地面 视角看不到地下 设置了禁止编辑地面 地面设置为圆形6. 新增功能 可选择基本圆形 方形 圆柱形等模型以及可放置自…

判断非radio\checkbox 勾选框是否被勾选

1、通常如果是标准的勾选框我们可以使用使用isSelected()方法无法判断其勾选状态&#xff0c;如下代码&#xff1a; Boolean bldriver.findElement(By.xpath("//*[contains(class,el-icon-success)]")).isSelected(); 2、如图所示&#xff0c;该勾选框并不是一个…

51单片机STC89C52RC——16.1 五线四相步进电机

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;步进电机 2.2 什么是步进电机&#xff1f; 2.2.1 步进电机驱动板 静态参数 动态参数 2.2.2 五线四相 单相激励步进 双相激励步进 混合激励驱动 2.3 细分驱动 2.4 通过数字信号控制旋转位置和转速。 2…

深入理解计算机系统 CSAPP 练习题9.9

这个函数和练习题9.8的find_fit函数相关,asize是我们实际需要的大小,但是find_fit函数返回的bp有可能是比我们需要的还大的块,此时我们需要对bp进行分割.

kind kubernetes(k8s虚拟环境)使用本地docker的镜像

kubernetes中&#xff0c;虽然下载镜像使用docker&#xff0c;但是存储在docker image里的镜像是不能被k8s直接使用的&#xff0c;但是kind不同&#xff0c;可以使用下面的方法&#xff0c;让kind kubernetes环境使用docker image里的镜像。 kind – Quick Start 例如&#x…

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理

AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理 目录 AGI 之 【Hugging Face】 的【文本摘要】的 [评估PEGASUS ] / [ 微调PEGASUS ] / [生成对话摘要] 的简单整理 一、简单介绍 二、文本摘要 三、在CNN/Daily…