STM32-USART串口實現接收數據三種方法(1.根據\r\n標志符、2.空閑幀中斷、3.根據定時器輔助接收)

本章概述思維導圖:

USART串口初始化配置

串口初始化配置在(STM32-USART串口初始化章節有詳細教程配置),本章不做講解直接代碼示例,本章重點在于串口實現接收數據三種方法;

配置USART1串口接收初始化函數步驟:

1. 開時鐘

2. 對串口1模塊開啟復位時鐘,在取消復位;

3. 配置GPIO模式

4. 通過在USART_CR1寄存器上置位UE位來激活USART

5. 編程USART_CR1的M位來定義字長。

6. 在USART_CR2中編程停止位的位數。

7. 利用USART_BRR寄存器選擇要求的波特率。

8. 設置USART_CR1中的TE位,發送一個空閑幀作為第一次數據發送。

9. 設置USART_CR1的RE位。激活接收器,使它開始尋找起始位。

10. 設置USART_CR1的IDLEIE位。當USART_SR中的IDLE為’1’時,產生USART中斷

11.設置USART_CR1的RXNEIE位。當USART_SR中的ORE或者RXNE為’1’產生USART中斷。

12. 調用中斷設置優先級函數;

代碼示例:

/*USART1串口初始化函數形參bps——>保持通信的波特率PA10設置為輸入模式,PA9設置為復用輸出模式;
*/
void USART1_Init(u32 bps)
{
//  1. 開時鐘RCC->APB2ENR|=1<<2;//開啟PA時鐘;RCC->APB2ENR|=1<<14;//開啟USART1時鐘
//  2. 對串口1模塊開啟復位時鐘,在取消復位;RCC->APB2RSTR|=1<<14;//開啟USART1復位時鐘,復位這一步可以省略配置USART1步驟RCC->APB2RSTR&=~(1<<14);//取消復位時鐘,關閉復位
//  3. 配置GPIO模式GPIOA->CRH&=0xfffff00f;//清空PA10、PA9引腳模式GPIOA->CRH|=0x000008b0;//PA10輸入PA9輸出
//  4.通過在USART_CR1寄存器上置位UE位來激活USARTUSART1->CR1|=1<<13;
//  5.編程USART_CR1的M位來定義字長。USART1->CR1&=~(1<<12);
//  6.在USART_CR2中編程停止位的位數。USART1->CR2&=~(0x3<<12);
//  7.利用USART_BRR寄存器選擇要求的波特率。USART1->BRR=72000000/bps;
//  8.設置USART_CR1中的TE位,發送一個空閑幀作為第一次數據發送。USART1->CR1|=1<<3;
//  9.設置USART_CR1的RE位。激活接收器,使它開始尋找起始位。USART1->CR1|=1<<2;
//  10.設置USART_CR1的IDLEIE位。當USART_SR中的IDLE為’1’時,產生USART中斷USART1->CR1|=1<<4;
//  11.設置USART_CR1的RXNEIE位。當USART_SR中的ORE或者RXNE為’1’產生USART中斷。USART1->CR1|=1<<5;
//  12.調用中斷優先級函數STM32_SetNVICPriority(USART1_IRQn ,1,1);
}

USART串口中斷服務函數

/*串口1中斷服務函數
*/
void USART1_IRQHandler()
{u8 c;if(USART1->SR&1<<5)//判斷是否為:接收中斷;每接收一個字符就會觸發一次中斷{c=USART1->DR;//將數據賦值給cUSART1->DR=c;//將數據發生給上位機軟件,使得顯示界面上顯示。}
}

USART1串口1接收實現三種方法

判斷串口數據發送完一次數據有三種方法:

1. 是發送數據時以(\r\n)標志為結尾,檢測到(\n)時就知道數據完成一次發送

2. 串口初始化函數中開啟空閑幀中斷

3,定時器輔助串口接收,判斷串口1發送一字節和下一字節的間隔時間。超過定時器 初始設定的時間說明字符串數據發送完成

方法1:這里判斷一次數據發送完成時根據(\r\n結束標志符)

代碼示例:

u8 USART1_buffer[1024];//緩沖區數組,用來接收數據
u16 USART1_cnt=0;//緩沖區數組下標
u8 USART1_flag=0;//聯合主函數標志位
/*USART1串口1中斷服務函數
*/
void USART1_IRQHandler(void)
{u8 dat;if(USART1->SR&1<<7)//沒接收到一個字符觸發標志位{dat=USART1->DR;//讀取數據if(USART1_cnt<1024){USART1_buffer[USART1_cnt]=dat;//將讀取的數據放入到緩沖區數組里if(USART1_buffer[USART1_cnt] == '\n')//判斷是否到結束標注位"\r\n"{USART1_buffer[USART1_cnt-1]='\0';//將'\r'寫入'\0'結束USART1_flag=1;//數據接收完成}else{USART1_cnt++;}}else{USART1_buffer[USART1_cnt-1]='\0';USART1_cnt=0;}}
}

代碼講解:

創建緩沖區數組用來接收字符,只要字符不為:' \n ';就一直接收;當字符為:' \n '時;將' \r'位置寫入' \0 '表示接收完成,同時將標志位置1,聯合主函數使用;

主函數代碼示例:


#include "USART1.h"
#include "stdio.h"
int main()
{USART1_Init(115200);//USART1串口1初始化函數while(1){if(USART1_flag){printf("buffer=%s\tcnt=%d\n",USART1_buffer,USART1_cnt);USART1_cnt=0;//下標清零USART1_flag=0;//標志位置0;}}
}

代碼運行結果圖:

數據發送圖:

數據成功接收圖:

方法2:開啟空閑幀中斷

在串口初始化函數中配置USART1_CR1的IDLEIE:IDLE中斷使能位

中斷服務函數配置示例代碼:

/*USART1串口1中斷服務函數
*/
void USART1_IRQHandler(void)
{u8 dat;if(USART1->SR&1<<5)//每接收到一個字符觸發標志位{dat=USART1->DR;//讀取數據if(USART1_cnt<1024){USART1_buffer[USART1_cnt]=dat;//將讀取的數據放入到緩沖區數組里USART1_cnt++;}else{USART1_cnt=0;} }if(USART1->SR&1<<4)//空閑幀標志,這是全部發送完觸發一次{dat=USART1->DR;USART1_flag=1;//數據接收完成}USART1->SR=0;
}

主函數示例代碼:

#include "USART1.h"
#include "stdio.h"
int main()
{USART1_Init(115200);//USART1串口1初始化函數while(1){if(USART1_flag){USART1_buffer[USART1_cnt]='\0';//寫入結束標志符printf("buffer=%s\tcnt=%d\n",USART1_buffer,USART1_cnt);USART1_cnt=0;//下標清零USART1_flag=0;//標志位置0;}}
}

代碼運行結果圖:

數據發送圖:

數據成功接收圖:

方法3:定時器輔助串口接收

定時器輔助串口接收,判斷串口1發送一字節和下一字節的間隔時間。超過定時器 初始設定的時間說明字符串數據發送完成

配置步驟:

第一步:算出發送一個字節數據要多少時間:

1m=1000ms=1000000us;

1000000/(115200/10)=86.80555555us;發送一字節數據需要86.8055微秒;

判斷第一個字節數據和第二字節數據的間隔時間有沒有超過10ms

第二步:在串口1初始化函數中關閉空閑幀中斷并且串口中斷服務函數里關閉空閑幀中斷; 在定時器2初始化函數里關閉使能計數器,并且關閉定時器。設定定時時間10毫 秒

第三步:在串口第一次接收一字節數數時,在串口1中斷服務函數里清空計數器并且開啟定 時器。

第四步:如果數據全部返送完成,在定時器2中斷服務函數里將標志位置一并且關閉定時器 等待下一次數據發送玩出觸發定時器2中斷

第三步示例代碼:

/*USART1串口1中斷服務函數
*/
void USART1_IRQHandler(void)
{u8 dat;if(USART1->SR&1<<5)//每接收到一個字符觸發標志位{dat=USART1->DR;//讀取數據if(USART1_cnt<1024){TIM2->CNT=0;//清空計數器TIM2->CR1|=1<<0;//開啟定時器USART1_buffer[USART1_cnt]=dat;//將讀取的數據放入到緩沖區數組里USART1_cnt++;}else{USART1_flag=1;} }USART1->SR=0;
}

第四步示例代碼:

/*定時器2中斷服務函數
*/
void  TIM2_IRQHandler(void)
{if(TIM2->SR&1<<0){USART1_flag=1;//定時時間到標志位置1TIM2->SR&=~(1<<0);TIM2->CR1&=~(1<<0);//關閉定時器}
}

主函數示例代碼:


#include "USART1.h"
#include "stdio.h"
#include "TIM.h"
int main()
{USART1_Init(115200);//USART1串口1初始化函數TIM2_Init(7200,10000);//定時器2設置定時時間為10毫秒while(1){if(USART1_flag){USART1_buffer[USART1_cnt]='\0';//給緩沖區數組寫入結束標識符;printf("buffer=%s cnt=%d\n",USART1_buffer,USART1_cnt);USART1_cnt=0;//下標清零USART1_flag=0;//標志位置0;}}
}

代碼運行結果圖:

數據發送圖:

數據成功接收圖:


制作不易!喜歡的小伙伴給個小贊贊!喜歡我的小伙伴點個關注!有不懂的地方和需要的資源隨時問我喲!

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

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

相關文章

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博評論數據可視化分析-點贊區間折線圖實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解微博評論數據可視化分析-點贊區間折線圖實現…

Unity_SRP Batcher

SRP Batcher 全面解析&#xff1a;原理、啟用、優化與調試一、什么是 SRP Batcher&#xff1f;SRP Batcher 是 Unity Scriptable Render Pipeline&#xff08;URP、HDRP 或自定義 SRP&#xff09; 專屬的 CPU 渲染性能優化技術&#xff0c;核心目標是 減少材質切換時的 CPU 開銷…

詳解Vite 配置中的代理功能

在前端開發過程中&#xff0c;你可能經常會遇到一個頭疼的問題&#xff1a;當你在本地啟動的前端項目中調用后端接口時&#xff0c;瀏覽器控制臺會報出類似 “Access to fetch at ‘http://xxx’ from origin ‘http://localhost:3000’ has been blocked by CORS policy” 的錯…

理解梯度在神經網絡中的應用

梯度&#xff08;Gradient&#xff09;是微積分中的一個重要概念&#xff0c;廣泛應用于機器學習和深度學習中&#xff0c;尤其是在神經網絡的訓練過程中。下面將從梯度的基本概念、其在神經網絡中的應用兩個方面進行詳細介紹。一、梯度的基本概念 1.1 什么是梯度&#xff1f; …

WPF,按鈕透明背景實現MouseEnter

在幫手程序&#xff08;assister.exe&#xff09;中&#xff0c;可以點擊錄制按鈕&#xff0c;實現錄制用戶操作直接生成操作列表。而在彈出錄制按鈕的懸浮窗中&#xff0c;需要能夠拖動錄制按鈕放置在任意的位置&#xff0c;以免阻擋正常的窗口。具體功能是&#xff0c;當鼠標…

【抄襲】思科交換機DAI(動態ARP監控)配置測試

一.概述 1.DAI作用 ①.使用DAI&#xff0c;管理員可以指定交換機的端口為信任和非信任端口&#xff1a; 信任端口可以轉發任何ARP信息 非信任端口的ARP消息要進行ARP檢測驗證 ②.交換機執行如下的ARP驗證&#xff1a; 靜態ARP監控&#xff1a;為一個靜態的IP地址配置一個靜態AR…

在嵌入式系統或 STM32 平臺中常見的外設芯片和接口

在嵌入式系統或 STM32 平臺中常見的 外設芯片 或 模塊名稱&#xff0c;包括&#xff1a; &#x1f4fa; 顯示驅動&#xff08;如 ST7735、OTM8009A、NT35510&#xff09;&#x1f4f7; 攝像頭模組&#xff08;如 OV5640、OV9655、S5K5CAG&#xff09;&#x1f4be; Flash 存儲器…

AI 類型的 IDE

指集成了 AI 輔助編程能力的集成開發環境 一、代碼輔助生成 ? 自動補全&#xff08;更智能&#xff09; 比傳統 IDE 更智能&#xff0c;理解上下文&#xff0c;生成整個函數/模塊 示例&#xff1a;根據函數名 calculateTax 自動生成稅務計算邏輯 ? 函數 / 類自動生成 給…

JP3-3-MyClub后臺后端(一)

Java道經 - 項目 - MyClub - 后臺后端&#xff08;一&#xff09; 傳送門&#xff1a;JP3-1-MyClub項目簡介 傳送門&#xff1a;JP3-2-MyClub公共服務 傳送門&#xff1a;JP3-3-MyClub后臺后端&#xff08;一&#xff09; 傳送門&#xff1a;JP3-3-MyClub后臺后端&#xff08;…

架構實戰——互聯網架構模板(“存儲層”技術)

目錄 一、SQL 二、NoSQL 三、小文件存儲 四、大文件存儲 本文來源:極客時間vip課程筆記 一、SQL SQL 即我們通常所說的關系數據。前幾年 NoSQL 火了一陣子,很多人都理解為 NoSQL 是完全拋棄關系數據,全部采用非關系型數據。但經過幾年的試驗后,大家發現關系數據不可能完全被…

CentOS7.9在線部署Dify

一、CentOS7.9安裝dify 二、檢查是否安裝dcoker docker --version2.1下載后將安裝包上傳至服務器對應文件夾下,我選在放在了 /root文件夾下 cd /root2.2 上傳至服務器 cd /root #對應目錄下tar -xvf docker-26.1.4.tgz # 解壓安裝包:chmod 755 -R docker # 賦予可執…

深入淺出C語言指針:從數組到函數指針的進階之路(中)

指針是C語言的靈魂&#xff0c;也是初學者最頭疼的知識點。它像一把鋒利的刀&#xff0c;用得好能大幅提升代碼效率&#xff0c;用不好則會讓程序漏洞百出。今天這篇文章&#xff0c;我們從數組與指針的基礎關系講起&#xff0c;一步步揭開指針進階類型的神秘面紗&#xff0c;最…

java web Cookie處理

java web 設置cookie更改啟動端口// Directory tree (5 levels) ├── src\ │ ├── a.txt │ └── com\ │ └── zhang\ │ └── ServletContext\ │ ├── cookie\ │ └── servletContext.java └── web\├─…

機器學習—線性回歸

一線性回歸線性回歸是利用數理統計中回歸分析&#xff0c;來確定兩種或兩種以上變量間相互依賴的定量關系的一種統計分析方法。相關關系&#xff1a;包含因果關系和平行關系因果關系&#xff1a;回歸分析【原因引起結果&#xff0c;需要明確自變量和因變量】平行關系&#xff1…

Spring Boot Admin 監控模塊筆記-實現全鏈路追蹤

一、概述Spring Boot Admin&#xff08;SBA&#xff09;是一個用于監控和管理 Spring Boot 應用程序的工具。它提供了一個 Web 界面&#xff0c;可以集中管理多個 Spring Boot 應用程序的健康狀態、指標、日志、配置等信息。通過 SBA&#xff0c;你可以輕松地監控和管理你的微服…

容器化與Docker核心原理

目錄 專欄介紹 作者與平臺 您將學到什么&#xff1f; 學習特色 容器化與Docker核心原理 引言&#xff1a;為什么容器化成為云計算時代的基石&#xff1f; 容器化技術全景與Docker核心原理&#xff1a;從概念到實踐 文章摘要 1. 引言&#xff1a;為什么容器化成為云計算…

掌握Python三大語句:順序、條件與循環

PS不好意思各位&#xff0c;由于最近筆者在參加全國大學生電子設計大賽&#xff0c;所以最近會出現停更的情況&#xff0c;望大家諒解&#xff0c;比賽結束后我會加大力度&#xff0c;火速講Python的知識給大家寫完&#x1f396;?&#x1f396;?&#x1f396;?&#x1f396;…

JAVA結合AI

Java 與人工智能&#xff08;AI&#xff09;的結合正經歷從技術探索到深度融合的關鍵階段。以下從技術生態、應用場景、工具創新、行業實踐及未來趨勢五個維度展開分析&#xff0c;結合最新技術動態與企業級案例&#xff0c;揭示 Java 在 AI 時代的獨特價值與發展路徑。一、技術…

本土DevOps平臺Gitee如何重塑中國研發團隊的工作流

本土DevOps平臺Gitee如何重塑中國研發團隊的工作流 在數字化轉型浪潮席卷各行各業的當下&#xff0c;軟件開發效率已成為企業競爭力的核心指標。Gitee DevOps作為專為中國開發團隊打造的本土化研發管理平臺&#xff0c;正在改變國內技術團隊的工作方式。該平臺通過從代碼管理到…

5G MBS(組播廣播服務)深度解析:從標準架構到商用實踐

一、MBS技術背景與核心價值 1.1 業務需求驅動 隨著超高清視頻(4K/8K)、多視角直播、XR元宇宙應用爆發式增長,傳統單播傳輸面臨帶寬浪費(相同內容重復發送)與擁塞風險(萬人并發場景)的雙重挑戰。5G MBS通過點對多點(PTM)傳輸實現內容一次發送、多終端接收,頻譜效率提…