嵌入式軟件--stm32 DAY 6 USART串口通訊(下)

1.寄存器輪詢_收發字符串

通過寄存器輪詢方式實現了收發單個字節之后,我們趁熱打鐵,爭上游,進階到字符串。字符串就是多個字符。很明顯可以循環收發單個字節實現。

然后就是接收字符串。如果接受單個字符的函數放在while里,它也可以實現一個一個的接收字符串,在一定時間戳下,效果等同。

然后我們要想想如何整合,寫成一個函數。

2.問題解答,狀態位清零

我們的編程方式,一個是寄存器寫法,一個是hal庫寫法。還有的就是實現思路。

//發送一個字符
void USART_SendChar(uint8_t ch)
{//判斷TDR是否為空,必須等待TDR為空才能寫入數據,也就是繼續發送while((USART1->SR & USART_SR_TXE)==0){}//將要發送的數據寫入TDRUSART1->DR = ch;
}

初始的時候,TDR的存儲寄存器肯定為空

關于狀態位清零,TXE和RXNE都可以自動清零。

只要發數據,就自動清零。

RXNE也是一樣,只要讀RDR,就會清零。

3.串口通訊 寄存器中斷方式

復制上一個工程文件,把改刪除的刪掉。

主要配置中斷管理NVIC

中斷服務函數

main.c

#include "usart.h"
#include "delay.h"
#include <string.h>
//定義接收緩沖區和接收數據長度
uint8_t buff[100];
uint8_t size;
int main(void)
{//1.初始化USART_Init();//發送單個字符USART_SendChar('A');USART_SendChar('\n');//發送字符串uint8_t str[]="Hello World!\n";USART_SendString(str,strlen((char *)str));while(1){}}

usart.c

#include "usart.h"//初始化
void USART_Init(void)
{//開啟時鐘RCC->APB2ENR |= RCC_APB2ENR_USART1EN;RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;//GPIO工作模式// PA9:TX 復用推挽輸出,CNF=10,MODE=11GPIOA->CRH |= GPIO_CRH_MODE9;GPIOA->CRH |= GPIO_CRH_CNF9_1;GPIOA->CRH &= ~GPIO_CRH_CNF9_0;// PA10:RX 浮空輸入,CNF=01,MODE=00GPIOA->CRH &= ~GPIO_CRH_MODE10;GPIOA->CRH &= ~GPIO_CRH_CNF10_1;GPIOA->CRH |= GPIO_CRH_CNF10_0;//串口模塊設置//設置波特率 115200USART1->BRR = 0x271;//使能串口和收發模塊USART1->CR1 |= USART_CR1_UE;USART1->CR1 |= (USART_CR1_TE|USART_CR1_RE);//配置數據幀格式USART1->CR1 &=~ USART_CR1_M;   //長度為8位的數據,沒有校驗位USART1->CR1 &=~ USART_CR1_PCE;  //無校驗,不使用校驗位USART1->CR2 &=~ USART_CR2_STOP;  //1位停止位//使能串口接收中斷USART1->CR1 |= USART_CR1_RXNEIE;USART1->CR1 |= USART_CR1_IDLEIE;//配置NVICNVIC_SetPriorityGrouping(3);NVIC_SetPriority (USART1_IRQn,2);NVIC_EnableIRQ(USART1_IRQn);}//發送一個字符
void USART_SendChar(uint8_t ch)
{//判斷TDR是否為空,必須等待TDR為空才能寫入數據,也就是繼續發送while((USART1->SR & USART_SR_TXE)==0){}//將要發送的數據寫入TDRUSART1->DR = ch;
}//發送字符串,數組可以用指針表示,形參就是數組和字長
void USART_SendString(char *str,uint8_t size)
{uint8_t i = 0;for ( i = 0; i < size; i++){USART_SendChar(str[i]);}}//引入外部變量
extern uint8_t buff[100];
extern uint8_t size;//中斷服務程序
void USART1_IRQHandler(void)
{//判斷是RXNE=1還是IDLE=1if (USART1->SR & USART_SR_RXNE){//如果RXNE=1,表示接收到一個字符
buff[size]=USART1->DR;
size++;}else if (USART1->SR & USART_SR_IDLE){USART1->DR;//如果IDLE=1,表示檢測到空閑幀,字符串接收完畢USART_SendString(buff,size);size=0;}}

usart.h

#ifndef __USART_H
#define __USART_H
#include "string.h"
#include "stm32f10x.h"
//初始化
void USART_Init(void);//發送一個字符
void USART_SendChar(uint8_t ch);//發送一個字符串,數組可以用指針表示,形參就是數組和字長
void USART_SendString(char *str,uint8_t size);#endif

?

我們可以將接收字符串的標志位在外面定義出來。

?

4.串口案例一串口通訊_hal庫輪詢方式

我們有usart1配置。

我們反正還得需要配,這個時候我們可以不管他,直接去左邊框欄中點點點。圖形化配置的精髓就是方便。

還是調用hal庫簡單。

輪詢方式使用效率不是很高,中斷方式才高。

5.HAL庫中斷方式—定長數據接收

記住USART1用異步模式,要打開中斷實現

中斷方式要和回調函數結合。

接收定長數據,會和之前接收的數據結合分析

6.HAL庫中斷方式--變長數據接收

接收變長數據,size是可接收的字長上限。

她的回調不一樣,是下面這個。在函數面前加void,我忘了加,編譯出錯。

先檢查是什么模塊

7.重定向printf—寄存器方式

用printf輸出調試信息,打印到屏幕,沒有屏幕也可重定向printf,把數據打印到串口,從而在電腦端接收調試信息,這是一種有效調試手段。

printf大法對任何語言都是有用的。

printf的底層函數:fputc

把字符一個個發到控制臺文件里。?

重寫也在usart.c里,記得引入<stdio.h>

8.重定向——hal

usart.c里

在main函數來隨便打印。

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

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

相關文章

QT使用QXlsx讀取excel表格中的圖片

前言 讀取excel表格中的圖片的需求比較小眾&#xff0c;QXlsx可以操作excel文檔&#xff0c;進行圖片讀取、插入操作&#xff0c;本文主要分享單獨提取圖片和遍歷表格提取文字和圖片。 源碼下載 github 開發環境準備 把下載的代碼中的QXlsx目錄&#xff0c;整個拷貝到所創建…

抽獎相關功能測試思路

1. 抽獎系統功能測試用例設計&#xff08;登錄 每日3次 中獎40% 道具兌換碼&#xff09; ? 功能點分析 必須登錄后才能抽獎每天最多抽獎3次抽獎有 40% 概率中獎中獎返回兌換碼 ? 測試用例設計 編號 用例描述 前置條件 操作 預期結果 TC01 未登錄時抽獎 未登錄 …

Unity editor文件數UI(支持勾選框)

unity editor文件數&#xff08;支持勾選框&#xff09; 使用的時候new一個box即可 using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; using System; using System.Collections; using System.Collections.Generic; using UnityEngine;[Serializable] publ…

RabbitMQ通信模式(Simplest)Python示例

RabbitMQ通信模式-Python示例 0.RabbitMQ官網通信模式1.Simplest(簡單)模式1.1 發送端1.2 接收端 0.RabbitMQ官網通信模式 1.Simplest(簡單)模式 1.1 發送端 # -*- coding: utf-8 -*- """ Author: xxx date: 2025/5/19 11:30 Description: Simaple簡單模…

隨筆20250519 Async+ThreadPoolTaskExecutor?定義線程池進階實戰

1.ThreadPoolTaskExecutor線程池 有哪?個重要參數&#xff0c; 什么時候會創建線程 1.核心綫程數 查看核心綫程數目是否已經滿&#xff0c;未滿 創建一條綫程 執行任務&#xff0c;已滿負責執行第二部 2.阻塞隊列 查看阻塞隊列是否已經滿&#xff0c;未滿將任務加入阻塞隊列&…

YOLO11解決方案之實例分割與跟蹤探索

概述 Ultralytics提供了一系列的解決方案,利用YOLO11解決現實世界的問題,包括物體計數、模糊處理、熱力圖、安防系統、速度估計、物體追蹤等多個方面的應用。 實例分割是一項計算機視覺任務,涉及在像素級別識別和勾勒圖像中的單個對象。與只按類別對像素進行分類的語義分割…

VScode各文件轉化為PDF的方法

文章目錄 代碼.py文件.ipynb文本和代碼夾雜的文件方法 1:使用 VS Code 插件(推薦)步驟 1:安裝必要插件步驟 2:安裝 `nbconvert`步驟 3:間接導出(HTML → PDF)本文遇見了系列錯誤:解決方案:問題原因步驟 1:降級 Jinja2 至兼容版本步驟 2:確保 nbconvert 版本兼容替代…

現代計算機圖形學Games101入門筆記(十五)

蒙特卡洛積分 為什么用蒙特卡洛積分&#xff0c;用來做什么&#xff1f;跟黎曼積分區別&#xff0c;黎曼積分是平均分成n等分&#xff0c;取每個小塊中間的值取計算每個小塊面積&#xff0c;再將n份集合加起來。蒙特卡洛積分就是隨機取樣&#xff0c;假設隨機取樣點xi,對應的f…

軟件架構之-論高并發下的可用性技術

論高并發下的可用性技術 摘要正文摘要 ;2023年2月,本人所在集團公司承接了長三角地區某省漁船圖紙電子化審查系統項目開發,該項目旨在為長三角地區漁船建造設計院、以及漁船審圖機構提供一個便捷化的服務平臺。在此項目中,我作為項目組成員參與了項目建設工作,并擔任系統架…

Q-learning 算法學習

Q-learning是一種經典的無模型、基于價值的算法&#xff0c;它通過迭代更新狀態-動作對的Q值&#xff0c;最終找到最優策略。 一 Q-learning的核心思想 1.1目標 學習一個狀態-動作價值函數 &#xff0c;表示在狀態 s 下執行動作 a 并遵循最優策略后的最大累積獎勵。 的核心…

鴻蒙生態崛起:開發者機遇與挑戰并存

&#x1f493; 博客主頁&#xff1a;倔強的石頭的CSDN主頁 &#x1f4dd;Gitee主頁&#xff1a;倔強的石頭的gitee主頁 ? 文章專欄&#xff1a;《熱點時事》 期待您的關注 目錄 引言 一、何為鴻蒙生態&#xff1f; 二、在鴻蒙生態下開發時遇到的挑戰 三、對于鴻蒙生態未…

TCP/IP-——C++編程詳解

1. TCP/IP 編程基本概念 TCP&#xff08;傳輸控制協議&#xff09;&#xff1a;面向連接、可靠的傳輸層協議&#xff0c;保證數據順序和完整性。IP&#xff08;網際協議&#xff09;&#xff1a;負責將數據包路由到目標地址。Socket&#xff08;套接字&#xff09;&#xff1a…

Python圖像處理基礎(三)

Python圖像處理基礎(三) 文章目錄 Python圖像處理基礎(三)2、計算機色彩(Computer Color)2.5 色彩分辨率2.6 灰度顏色模型2.7 CMYK 顏色模型2.7.1 K 部分2.8 HSL/HSB 顏色模型2、計算機色彩(Computer Color) 2.5 色彩分辨率 人眼可以看到許多不同的顏色,但我們的感知…

Vue路由深度解析:Vue Router與導航守衛

Vue路由深度解析&#xff1a;Vue Router與導航守衛 一、Vue Router基礎與安裝配置 1. Vue Router核心概念 Vue Router是Vue.js官方的路由管理器&#xff0c;主要功能包括&#xff1a; 嵌套路由映射模塊化的路由配置路由參數、查詢、通配符細粒度的導航控制自動激活的CSS類鏈…

前后端分離微服務架構

前后端分離微服務架構 介紹: 前端通過Vue和ElementUI構建界面&#xff0c;使用axios調用后端API。Nginx作為反向代理&#xff0c;將請求路由到Zuul網關。Zuul進行權限驗證&#xff08;JWT&#xff09;后&#xff0c;將請求分發到微服務。(身份驗證,安全防護(sql注入,xxs跨網站…

iOS 工廠模式

iOS 工廠模式 文章目錄 iOS 工廠模式前言工廠模式簡單工廠案例場景分析蘋果類優點缺點 小結 工廠模式客戶端調用**優點****缺點** 抽象工廠模式三個模式對比 前言 筆者之前學習了有關于設計模式的六大原則,之前簡單了解過這個工廠模式,今天主要是重新學習一下這個模式,正式系統…

【機器學習】工具入門:飛牛啟動Dify Ollama Deepseek

很久沒有更新文章了,最近正好需要研究一些機器學習的東西&#xff0c;打算研究一下 difyOllama 以下是基于FN 的dify本地化部署&#xff0c;當然這也可能是全網唯一的飛牛部署dify手冊 部署 官方手冊&#xff1a;https://docs.dify.ai/en/getting-started/install-self-hos…

安卓A15系統實現修改鎖屏界面默認壁紙功能

最近遇到一個A15系統項目&#xff0c;客戶要求修改鎖屏界面的默認壁紙&#xff0c;客戶提供了一張壁紙圖片&#xff0c;但是從A15系統的源代碼查看時才知道谷歌已經去掉了相關的代碼&#xff0c;已經不支持了&#xff0c;A13和A14系統好像是支持的&#xff0c;A15系統的Wallpap…

從理論到實戰:模糊邏輯算法的深度解析與應用實踐

從理論到實戰&#xff1a;模糊邏輯算法的深度解析與應用實踐 一、模糊邏輯的核心概念與數學基礎 模糊邏輯&#xff08;Fuzzy Logic&#xff09;是一種處理不確定性的數學工具&#xff0c;其核心思想是將傳統布爾邏輯的“非黑即白”擴展為連續的隸屬度函數。例如&#xff0c;在…

正向代理與反向代理區別及應用

正向代理和反向代理是兩種常見的代理服務器類型&#xff0c;它們在網絡架構中扮演不同角色&#xff0c;核心區別在于代理對象和使用場景。 1. 正向代理&#xff08;Forward Proxy&#xff09; 定義&#xff1a;正向代理是客戶端&#xff08;如瀏覽器&#xff09;主動配置的代理…