RTT UART設備框架學習

UART簡介

UART(Universal Asynchronous Receiver/Transmitter)通用異步收發傳輸器,UART 作為異步串口通信協議的一種,工作原理是將傳輸數據的每個字符一位接一位地傳輸。是在應用程序開發過程中使用頻率最高的數據總線。

UART串口的特點是將數據一位一位地順序傳送,只要2根傳輸線就可以實現雙向通信,一根線發送數據的同時用另一根線接收數據。UART 串口通信有幾個重要的參數,分別是波特率、起始位、數據位、停止位和奇偶檢驗位,對于兩個使用 UART 串口通信的端口,這些參數必須匹配,否則通信將無法正常完成。UART 串口傳輸的數據格式如下圖所示:

在這里插入圖片描述
起始位:表示數據傳輸的開始,電平邏輯為 “0” 。

數據位:可能值有 5、6、7、8、9,表示傳輸這幾個 bit 位數據。一般取值為 8,因為一個 ASCII 字符值為 8 位。

奇偶校驗位:用于接收方對接收到的數據進行校驗,校驗 “1” 的位數為偶數 (偶校驗) 或奇數(奇校驗),以此來校驗數據傳送的正確性,使用時不需要此位也可以。

停止位: 表示一幀數據的結束。電平邏輯為 “1”。

波特率:串口通信時的速率,它用單位時間內傳輸的二進制代碼的有效位 (bit) 數來表示,其單位為每秒比特數 bit/s(bps)。常見的波特率值有 4800、9600、14400、38400、115200 等,數值越大數據傳輸的越快,波特率為 115200 表示每秒鐘傳輸 115200 位數據。

訪問串口設備

#define SAMPLE_UART_NAME "uart1"
static rt_device_t serial;
serial = rt_device_find(SAMPLE_UART_NAME);

打開串口設備

通過設備句柄,應用程序可以打開和關閉設備,打開設備時,會檢測設備是否已經初始化,沒有初始化則會默認調用接口初始化設備。

rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags);

一般情況下,會選擇使用發送阻塞模式以及接收非阻塞模式來進行開發。

rt_device_open(dev,RT_DEVICE_FLAG_RX_NON_BLOCKING|RT_DEVICE_FLAG_TX_BLOCKING)

硬件工作模式選擇

由于用戶層使用串口時,只關心應用層操作模式,不再關心硬件工作模式,使得應用層開發變得更加便捷,也增加了應用程序的可移植性。倘若用戶開發時比較關心硬件具體的工作模式,那么應該對其工作模式如何選擇?

串口外設的遵循如下規則:

  1. 模式優先級:DMA>中斷>輪詢,當有DMA配置時,默認使用DMA模式,以此類推。
  2. 串口默認配置接收和發送緩沖區
  3. 默認使用阻塞發送、非阻塞接收模式

V1版本

通過設備句柄,應用程序可以打開和關閉設備,打開設備時,會檢測設備是否已經初始化,沒有初始化則會默認調用初始化接口初始化設備。通過如下函數打開設備:
oflags 參數支持下列取值 (可以采用或的方式支持多種取值):

#define RT_DEVICE_FLAG_STREAM       0x040     /* 流模式      */
/* 接收模式參數 */
#define RT_DEVICE_FLAG_INT_RX       0x100     /* 中斷接收模式 */
#define RT_DEVICE_FLAG_DMA_RX       0x200     /* DMA 接收模式 */
/* 發送模式參數 */
#define RT_DEVICE_FLAG_INT_TX       0x400     /* 中斷發送模式 */
#define RT_DEVICE_FLAG_DMA_TX       0x800     /* DMA 發送模式 */

串口數據接收和發送數據的模式分為三種:中斷模式、輪詢模式、DMA模式。

在使用的時候,這 3 種模式只能選其一,若串口的打開參數 oflags 沒有指定使用中斷模式或者 DMA 模式,則默認使用輪詢模式

DMA(Direct Memory Access)即直接存儲器訪問。 DMA 傳輸方式無需 CPU 直接控制傳輸,也沒有中斷處理方式那樣保留現場和恢復現場的過程,通過 DMA 控制器為 RAM 與 I/O 設備開辟一條直接傳送數據的通路,這就節省了 CPU 的資源來做其他操作。使用 DMA 傳輸可以連續獲取或發送一段信息而不占用中斷或延時,在通信頻繁或有大段信息要傳輸時非常有用。

控制串口設備

通過控制接口,應用程序可以對串口設備進行配置,如波特率、數據位、校驗位、接收緩沖區大小、停止位等參數的修改。

rt_err_t rt_deivce_control(rt_device_t dev, rt_uint8_t cmd, void *arg);
struct serial_configure
{rt_uint32_t baud_rate;            /* 波特率 */rt_uint32_t data_bits    :4;      /* 數據位 */rt_uint32_t stop_bits    :2;      /* 停止位 */rt_uint32_t parity       :2;      /* 奇偶校驗位 */rt_uint32_t bit_order    :1;      /* 高位在前或者低位在前 */rt_uint32_t invert       :1;      /* 模式 */rt_uint32_t bufsz        :16;     /* 接收數據緩沖區大小 */rt_uint32_t reserved     :4;      /* 保留位 */
};

接收緩沖區:當串口使用中斷接收模式打開時,串口驅動框架會根據 RT_SERIAL_RB_BUFSZ 大小開辟一塊緩沖區用于保存接收到的數據,底層驅動接收到一個數據,都會在中斷服務程序里面將數據放入緩沖區。

設置發送完成回調函數

rt_err_t rt_device_set_tx_complete(rt_device_t dev, rt_err_t (*tx_done)(rt_device_t dev,void *buffer));

設置接收回調函數

rt_err_t rt_device_set_rx_indicate(rt_device_t dev, rt_err_t (*rx_ind)(rt_device_t dev,rt_size_t size));

DMA接收及輪詢發送

當串口收到一批數據后,會調用接收回調函數,接收回調函數會把此時緩沖區的數據大小通過消息隊列發送給等待的數據處理線程。線程獲取到消息后被激活,并讀取數據。一般情況下 DMA 接收模式會結合 DMA 接收完成中斷和串口空閑中斷完成數據接收。

#include <rtthread.h>#define SAMPLE_UART_NAME       "uart3"      /* 串口設備名稱 *//* 串口接收消息結構*/
struct rx_msg
{rt_device_t dev;rt_size_t size;
};
/* 串口設備句柄 */
static rt_device_t serial;
}
/* 消息隊列控制塊 */
static struct rt_messagequeue rx_mq;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19308.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19308.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19308.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL注入 — Dns 注入

DNS注入原理 通過子查詢&#xff0c;將內容拼接到域名內&#xff0c;讓load_file()去訪問共享文件&#xff0c;訪問的域名被記錄此時變為顯錯注入,將盲注變顯錯注入,讀取遠程共享文件&#xff0c;通過拼接出函數做查詢,拼接到域名中&#xff0c;訪問時將訪問服務器&#xff0c;…

CISP難度將加大?還考不考啊...

最新消息&#xff1a;CISP即將調整知識體系大綱&#xff0c;更新題庫&#xff0c;后續考試難度加大。 最近幾年&#xff0c;CISP改版地比較頻繁&#xff0c;難度也在不斷上升&#xff0c;因此各位小伙伴有考CISP想法的盡早考。 隨著《網絡安全法》、《網絡空間安全戰略》、《…

2024/5/28 P1247 取火柴游戲

取火柴游戲 題目描述 輸入 k k k 及 k k k 個整數 n 1 , n 2 , ? , n k n_1,n_2,\cdots,n_k n1?,n2?,?,nk?&#xff0c;表示有 k k k 堆火柴棒&#xff0c;第 i i i 堆火柴棒的根數為 n i n_i ni?&#xff1b;接著便是你和計算機取火柴棒的對弈游戲。取的規則如下&…

定點化和模型量化(三)

量化解決的是訓練使用的浮點和運行使用的硬件只支持定點的矛盾。這里介紹一些實際量化中使用到的工具。 SNPE簡介 The Snapdragon Neural Processing Engine (SNPE)是高通驍龍為了加速網絡模型設計的框架。但它不只支持高通&#xff0c;SNPE還支持多種硬件平臺&#xff0c;AR…

Beego 使用教程 8:Session 和 Cookie

beego 是一個用于Go編程語言的開源、高性能的 web 框架 beego 被用于在Go語言中企業應用程序的快速開發&#xff0c;包括RESTful API、web應用程序和后端服務。它的靈感來源于Tornado&#xff0c; Sinatra 和 Flask beego 官網&#xff1a;http://beego.gocn.vip/ 上面的 be…

抄表營收系統是什么?

1.抄表營收系統的概念和功能 抄表營收系統是一種自動化軟件&#xff0c;主要運用于公用事業公司(如電力工程、水、天然氣等)管理方法其服務的計量檢定、計費和收付款全過程。該系統根據集成化智能儀表、遠程控制數據收集和分析功能&#xff0c;提高了效率&#xff0c;降低了人…

(十)Python3 接口自動化測試,測試結果發送郵件

(十)Python3 接口自動化測試,測試結果發送郵件 1.前言 Windows本地執行的話,可自行編寫發送郵件方法發送郵件。 Jenkins執行的話,可用jenkins配套郵件發送郵件。 2.發送郵件示例 # -*- coding: utf-8 -*- # 主程序 import sys sys.path.append(./server) sys.path.appe…

人臉識別——探索戴口罩對人臉識別算法的影響

1. 概述 人臉識別是一種機器學習技術&#xff0c;廣泛應用于各種領域&#xff0c;包括出入境管制、電子設備安全登錄、社區監控、學校考勤管理、工作場所考勤管理和刑事調查。然而&#xff0c;當 COVID-19 引發全球大流行時&#xff0c;戴口罩就成了日常生活中的必需品。廣泛使…

反射機制大揭秘-進階Java技巧,直擊核心!

反射在Java中扮演著重要的角色&#xff0c;掌握了反射&#xff0c;就等于掌握了框架設計的鑰匙。本文將為您逐步講解反射的基本概念、獲取Class對象的三種方式、使用反射實例化對象并操作屬性和方法&#xff0c;還有解析包的相關內容。跟隨我一起探索反射的奧秘&#xff0c;提升…

使用 Ubuntu + Docker + Vaultwarden + Tailscale 自建密碼管理器

使用 Ubuntu Docker Vaultwarden Tailscale 自建密碼管理器 先決條件 一臺運行 Ubuntu 系統的服務器。可以是云提供商的 VPS、家庭網絡中的樹莓派、或者 Windows 電腦上的虛擬機等等 一個 Tailscale 賬戶。如果還沒有 Tailscale 賬戶&#xff0c;可以通過此鏈接迅速創建一個…

SelfKG論文翻譯

SelfKG: Self-Supervised Entity Alignment in Knowledge Graphs SelfKG&#xff1a;知識圖中的自監督實體對齊 ABSTRACT 實體對齊旨在識別不同知識圖譜&#xff08;KG&#xff09;中的等效實體&#xff0c;是構建網絡規模知識圖譜的基本問題。在其發展過程中&#xff0c;標…

華納云:MAC電腦怎么遠程連接Windows服務器桌面?

在Mac電腦上遠程連接Windows服務器桌面可以通過多種方式實現&#xff0c;最常用的方法是使用微軟提供的免費應用程序 "Microsoft Remote Desktop"。以下是詳細的步驟來設置和使用該工具&#xff1a; 步驟一&#xff1a;下載和安裝 Microsoft Remote Desktop 打開App …

SpringBoot的自動裝配

我們今天再來說一下關于 SpringBoot 的自動裝配&#xff0c;為什么會有這樣的問題呢&#xff1f;一般這種情況都是在面試的過程中&#xff0c;面試官有時候會問到這個問題&#xff0c;就比如從開始問SpringBoot 的一些常用注解&#xff0c;到SpringBoot的一些特性&#xff0c;然…

zynq之UART

之前嘗試UART0&#xff08;MIO50、51&#xff09;&#xff0c;串口調試助手收到發送的內容。 現在板子上EMIO端有多個串口&#xff0c;所以看看這個怎么弄。 串口是484的轉接板&#xff08;接232的串口就會輸出亂碼&#xff09; https://blog.51cto.com/u_15262460/2882973 …

【九十三】【算法分析與設計】719. 找出第 K 小的數對距離,N 臺電腦的最長時間,二分答案法

719. 找出第 K 小的數對距離 - 力扣&#xff08;LeetCode&#xff09; 數對 (a,b) 由整數 a 和 b 組成&#xff0c;其數對距離定義為 a 和 b 的絕對差值。 給你一個整數數組 nums 和一個整數 k &#xff0c;數對由 nums[i] 和 nums[j] 組成且滿足 0 < i < j < nums.le…

java調用遠程接口下載文件

在postman中這樣下載文件 有時下載文件太大postman會閃退&#xff0c;可以通過代碼下載&#xff0c;使用hutool的http包

3步操作助您輕松實現蘋果手機照片一鍵傳輸至電腦

對于很多使用蘋果手機的用戶來說&#xff0c;隨著手機中照片和視頻數量的不斷積累&#xff0c;如何將這些珍貴的回憶從手機轉移到電腦&#xff0c;以便更好地保存、整理和分享&#xff0c;成為了一個值得關注的問題。那么&#xff0c;蘋果手機怎么把照片導入電腦呢&#xff1f;…

鴻蒙課程培訓 | 訊方技術與鴻蒙生態服務公司簽約,成為鴻蒙鉆石服務商

3月15日&#xff0c;深圳市訊方技術股份有限公司與鴻蒙生態服務公司簽署合作協議&#xff0c;訊方技術成為鴻蒙鉆石服務商&#xff0c;正式進軍鴻蒙原生應用培訓開發領域。訊方技術總裁劉國鋒、副總經理劉銘皓、深圳區域總經理張松柏、深圳區域交付總監張梁出席簽約儀式。 作…

鄉村振興的鄉村產業創新發展:培育鄉村新興產業,打造鄉村產業新名片,促進鄉村經濟多元化發展

目錄 一、引言 二、鄉村產業創新發展的必要性 &#xff08;一&#xff09;適應新時代發展要求 &#xff08;二&#xff09;滿足消費升級需求 &#xff08;三&#xff09;促進農民增收致富 三、培育鄉村新興產業策略 &#xff08;一&#xff09;加強科技創新引領 &#…

在 MFC 中 UNICODE 加 _T 與 L 長字符串,有什么區別?

在MFC&#xff08;Microsoft Foundation Classes&#xff09;和更廣泛的Windows編程環境中&#xff0c;UNICODE宏用于指示程序應使用Unicode字符集&#xff08;通常是UTF-16&#xff09;來處理文本。當定義了UNICODE宏時&#xff0c;編譯器和庫函數會期待和處理寬字符&#xff…