《DNK210使用指南 -CanMV版 V1.0》第二十一章 machine.UART類實驗

来源:https://www.cnblogs.com/zdyz/p/18392761
-Advertisement-
Play Games

第二十一章 machine.UART類實驗 1)實驗平臺:正點原子DNK210開發板 2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0 3)購買鏈接:https://detail.tmall.com/item.htm?&id=782801398750 4)全套實驗源碼+手冊+ ...


第二十一章 machine.UART類實驗

1)實驗平臺:正點原子DNK210開發板

2)章節摘自【正點原子】DNK210使用指南 - CanMV版 V1.0

3)購買鏈接:https://detail.tmall.com/item.htm?&id=782801398750

4)全套實驗源碼+手冊+視頻下載地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html

5)正點原子官方B站:https://space.bilibili.com/394620890

6)正點原子K210技術交流企鵝群:605557868

本章將介紹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構造函數如下所示:

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 硬體資源

  1. 擴展串口介面1

    UART1_TXD - IO7

    UART1_RXD - IO9

  2. 擴展串口介面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發送的數據,這與理論推斷的結果一致。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 在平時項目開發中,定時任務調度是一項重要的功能,廣泛應用於後臺作業、計劃任務和自動化腳本等模塊。 FreeScheduler 是一款輕量級且功能強大的定時任務調度庫,它支持臨時的延時任務和重覆迴圈任務(可持久化),能夠按秒、每天/每周/每月固定時間或自定義間隔執行(CRON 表達式)。 此外 ...
  • 第3章:佈局 本章目標 理解佈局的原則 理解佈局的過程 理解佈局的容器 掌握各類佈局容器的運用 理解 WPF 中的佈局 WPF 佈局原則 ​ WPF 視窗只能包含單個元素。為在WPF 視窗中放置多個元素並創建更貼近實用的用戶男面,需要在視窗上放置一個容器,然後在這個容器中添加其他元素。造成這一限制的 ...
  • 在日常開發中,並不是所有的功能都是用戶可見的,還在一些背後默默支持的程式,這些程式通常以服務的形式出現,統稱為輔助角色服務。今天以一個簡單的小例子,簡述基於.NET開發輔助角色服務的相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 第1章:WPF概述 本章目標 瞭解Windows圖形演化 瞭解WPF高級API 瞭解解析度無關性概念 瞭解WPF體繫結構 瞭解WPF 4.5 WPF概述 ​ 歡迎使用 Windows Presentation Foundation (WPF) 桌面指南,這是一個與解析度無關的 UI 框架,使用基於矢 ...
  • 前言 今天給大家推薦一個超實用的開源項目《.NET 7 + Vue 許可權管理系統 小白快速上手》,DncZeus的願景就是做一個.NET 領域小白也能上手的簡易、通用的後臺許可權管理模板系統基礎框架。 不管你是技術小白還是技術大佬或者是不懂前端Vue 的新手,這個項目可以快速上手讓我們從0到1,搭建自 ...
  • 前言 MediatR 是 .NET 下的一個實現消息傳遞的庫,輕量級、簡潔高效,用於實現進程內的消息傳遞機制。它基於中介者設計模式,支持請求/響應、命令、查詢、通知和事件等多種消息傳遞模式。通過泛型支持,MediatR 可以智能地調度不同類型的消息,非常適合用於領域事件處理。 在本文中,將通過一個簡 ...
  • 最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發 ...
  • Scoop 安裝 環境需求 PowerShell 5 + .NET Framework 4.5 + 安裝 指定安裝位置(配置環境變數) 以管理員身份打開PowerShell $env:SCOOP='D:\Applications\Scoop' [Environment]::SetEnvironmen ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...