《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
  • 前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...