STM32第十四天串口

一:串口發送字符和字符串和printf重定向

usart.c

#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"void my_usart_Init()//千萬不要和32庫里面串口定于的名字一樣,不然會報錯
{GPIO_InitTypeDef my_usart_Initstruct;USART_InitTypeDef USART_Initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);my_usart_Initstruct.GPIO_Pin=GPIO_Pin_9 ;my_usart_Initstruct.GPIO_Mode=GPIO_Mode_AF_PP ;my_usart_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &my_usart_Initstruct);my_usart_Initstruct.GPIO_Pin=GPIO_Pin_10 ;my_usart_Initstruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ;GPIO_Init(GPIOA, &my_usart_Initstruct);USART_Initstruct.USART_BaudRate=115200;USART_Initstruct.USART_HardwareFlowControl= USART_HardwareFlowControl_None  ;USART_Initstruct.USART_Mode= USART_Mode_Rx | USART_Mode_Tx;USART_Initstruct.USART_Parity= USART_Parity_No;USART_Initstruct.USART_StopBits=USART_StopBits_1  ;USART_Initstruct.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_Initstruct );USART_Cmd(USART1, ENABLE);}
void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data)
{USART_SendData( USARTx, Data);while(USART_GetFlagStatus( USARTx, USART_FLAG_TXE) != SET);}void My_Usart_Send_Sting(USART_TypeDef* USARTx,char * str)
{uint16_t i=0;do{My_Usart_Send_Byte(USARTx,*(str+i));i++;}while(*(str+i) != '\0');while(USART_GetFlagStatus( USARTx, USART_FLAG_TC) != SET);}int fputc(int ch, FILE * p)
{USART_SendData( USART1, (u8)ch);while(USART_GetFlagStatus( USART1, USART_FLAG_TXE) != SET);return ch;}

usart.h

#ifndef USART_H_
#define USART_H_void my_usart_Init(void);
void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data);
void My_Usart_Send_Sting(USART_TypeDef* USARTx, char * str);#endif

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
#include "exti_key.h"
#include "usart.h"
#include "stdio.h"void delay(uint16_t time)//延時1ms  軟件延時粗延時
{uint16_t i=0;while(time --){i=12000;while(i --);}}int  main()
{my_usart_Init();LED_Init();//	My_Usart_Send_Byte( USART1, 'A');
//	My_Usart_Send_Byte( USART1, 'B');
//	My_Usart_Send_Byte( USART1, 'C');//	My_Usart_Send_Sting( USART1, "kobe \r\n");printf("kobe is king \r\n");while(1){
//		USART_SendData( USART1,  'A');}}

代碼心得

1:void My_Usart_Send_Sting(USART_TypeDef* USARTx,char * str)復習一下char*指針的用法和知識點

知識點說明
char*?本質指向字符內存地址的指針,用于表示字符串。
字符串終止符必須以?'\0'?結尾,否則函數會越界訪問。
指針運算str++?移動至下一字符;*str?訪問當前字符。
函數參數傳遞傳遞字符串首地址,高效且節省內存。
const?安全性不修改字符串時使用?const char*,避免誤操作只讀數據。
常見錯誤修改字符串常量、未添加終止符會導致未定義行為。

?2:do-while循環詳解

1.基本語法:do { // 循環體} while (condition);

執行順序:先執行循環體內的語句,然后判斷條件(condition)是否成立。若條件成立,則繼續執行循環體;否則退出循環。

特點:循環體至少執行一次,即使條件一開始就不成立。

2. 與while循環的區別

while循環:先判斷條件,再決定是否執行循環體(可能一次都不執行)。

do-while循環:先執行循環體一次,再判斷條件(至少執行一次)。

3:理解USART_FLAG_TXE: Transmit data register empty flag? 和USART_FLAG_TC: Transmission Complete flag

這兩個標志位都是USART/UART通信中用于發送狀態的重要標志,但它們指示的發送階段不同,非常容易混淆。理解它們的區別對于正確使用串口發送數據至關重要:

一:USART_FLAG_TXE?(Transmit Data Register Empty)

  1. USART_FLAG_TXE?(Transmit Data Register Empty) - 發送數據寄存器空標志

    • 含義:?當USART_FLAG_TXE被置位(=1)時,表示發送數據寄存器 (TDR - Transmit Data Register) 已經空了

    • 觸發時機:?當前正在發送的數據字節已經從TDR寄存器移入到發送移位寄存器 (Transmit Shift Register)?中。此時TDR寄存器是空的,可以安全地寫入新的待發送數據。

    • 主要用途:

      • 判斷是否可以寫入新數據:?這是它的核心用途。在查詢方式(非中斷/DMA)發送時,你需要檢查USART_FLAG_TXE是否為1。如果是1,說明TDR空了,你可以立即調用USART_SendData()寫入下一個字節。在中斷方式下,當TXEIE中斷使能時,TXE事件會觸發中斷,在中斷服務程序里你就可以寫入下一個字節。

      • 避免覆蓋未發送的數據:確保你在寫入新數據時,硬件已經準備好接收它。

    • 關鍵點:?TXE=1?并不表示?數據已經物理發送到線路上,只表示數據離開了TDR進入了下一個發送階段(移位寄存器)。最后一個字節的數據可能還在移位寄存器中,正在一位一位地通過TX引腳發出。

二:USART_FLAG_TC?(Transmission Complete)

  1. USART_FLAG_TC?(Transmission Complete) - 傳輸完成標志

    • 含義:?當USART_FLAG_TC被置位(=1)時,表示一次完整的發送操作已經完成

    • 觸發時機:?需要同時滿足以下兩個條件:

      1. 發送數據寄存器 (TDR) 為空?(USART_FLAG_TXE?= 1)。

      2. 發送移位寄存器 (Transmit Shift Register) 也為空(即最后一位數據,包括停止位,已經完全從TX引腳發送出去)。

    • 主要用途:

      • 判斷整個數據包是否發送完畢:?這是它的核心用途。當你發送一串數據(比如一個字符串)后,你需要確認所有字節(包括最后一個字節的所有位)都已經物理發送到線路上。此時應檢查USART_FLAG_TC

      • 安全操作:?在確認TC=1之后,你可以安全地執行一些需要等待發送完全結束的操作,例如:

        • 關閉USART模塊。

        • 改變通信參數(波特率、數據位等)。

        • 切換收發方向(在單線半雙工通信中)。

        • 斷言DE信號(在RS-485通信中釋放總線)。

      • 在中斷方式下,當TCIE中斷使能時,TC事件會觸發中斷,通知你發送徹底完成。

    • 關鍵點:?TC=1?明確表示數據已經物理離開了芯片的TX引腳,發送線路已經完全空閑。

?

形象比喻:

想象一個郵局(USART)有兩個工作臺:

  • TDR (工作臺1 - 打包臺):?工作人員在這里把信件(數據字節)裝進信封(準備發送幀)。

  • 移位寄存器 (工作臺2 - 寄送臺):?工作人員從這里把信封投入郵筒(TX引腳),一位一位地塞進去(串行發送)。

  • TXE=1:?表示“打包臺空了”。打包臺的工作人員把信件裝好信封后,遞給了寄送臺的工作人員。這時你可以把下一封信交給打包臺的工作人員了。但之前裝好的那封信,寄送臺的工作人員可能還在往郵筒里塞呢(數據正在發送中)。

  • TC=1:?表示“打包臺空了?并且?寄送臺也空了”。不僅打包臺沒信了(TXE=1),寄送臺的工作人員也已經把上一封信完全塞進了郵筒(所有位發送完畢)。整個發送流程徹底結束,線路空閑。

總結區別:

特性USART_FLAG_TXE?(TXE)USART_FLAG_TC?(TC)
全稱Transmit Data Register EmptyTransmission Complete
含義發送數據寄存器 (TDR) 空傳輸完成?(TDR空??移位寄存器空)
指示階段可以安全寫入下一個字節上一個字節(及之前所有字節)已完全物理發出
硬件條件TDR寄存器空 (數據已移入移位寄存器)TDR寄存器空?并且?移位寄存器空 (線路空閑)
主要用途檢查是否可以寫入新數據?(查詢/中斷填充)檢查發送是否徹底完成?(安全關閉/切換/后續操作)
發送狀態數據可能還在移位寄存器中發送數據已完全離開TX引腳,發送線路空閑
中斷關聯TXEIE (發送數據寄存器空中斷使能)TCIE (發送完成中斷使能)
清除方式USART_SR寄存器 + 寫USART_DR寄存器USART_SR寄存器 + 寫USART_DR寄存器??軟件序列(讀SR后寫DR)

?

4:串口需要換行要用\r\n

5:寫串口函數一定要給串口外設使能

6:while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); 它的邏輯含義是:循環等待,直到USART1的發送數據寄存器空標志(TXE)被置位(即變為SET狀態)才退出循環。

7:int fputc(int /*c*/, FILE * /*stream*/)

  • 返回值?int
    成功時返回寫入的字符,失敗時返回?EOF(通常是?-1)。

  • 參數1?int c
    要輸出的字符(以?int?形式傳遞,支持?EOF?特殊值)。

  • 參數2?FILE *stream
    指向文件流的指針(如?stdout?標準輸出)。

?

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

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

相關文章

ether0 大語言推理模型生成SMILES 的分子

參考: https://huggingface.co/futurehouse/ether0 ether0 是一個 24B 語言模型,用于用英語進行推理并輸出分子結構作為 SMILES。它源自 Mistral-Small-24B-Instruct-2501 的微調和強化學習訓練。用英語提問,但問題中也可以包含指定為 SMILE…

基于AndServer的RPC架構:Android原生SO文件遠程調用實戰指南

引言:企業級原生代碼集成的范式革新 在移動混合架構應用中,原生代碼(SO)調用面臨??三重技術瓶頸??: ??環境強耦合??:依賴應用上下文,復用成本增加200%(Gartner 2023數據)??安全限制…

spring-ai 1.0.0 (3)交互增強:Advisor 顧問模塊

核心組件 API 由非流式處理方案和 和 流式處理方案組成。 在1.0.0版本中,顧問鏈AdvisorChain相關接口已經棄用,可能是老版本的思想不太合倫理吧 可以使用下面的方式實現多個顧問按oder順序訪問模型 public ChatController(ChatClient.Builder chatClien…

【機器學習筆記Ⅰ】2 線性回歸模型

線性回歸(Linear Regression)是機器學習中最基礎、最常用的監督學習模型之一,用于解決回歸問題(預測連續數值輸出)。它的核心思想是通過擬合一條直線(或超平面)來描述輸入特征(自變量…

2025.7.6總結

第天,Morning power 1.四四呼吸,做了10分鐘。 2.感恩環節:有兩周沒去新勵成上課了,感謝今天早上去上了當眾講話,遇到了不少老朋友,聊的還蠻開心滴,滿足了我的社交需求。其次,在臺上做了個小面試…

RabbitMQ 高級特性之死信隊列

1. 簡介 在前面的高級特性中,我們介紹了重試機制和 TTL,那么產生下列問題: 在重試機制中,當消費者消費消息發生異常時,會觸發消息重發機制,由于我們配置了最大的重發次數,那么當超過這個次數后…

如何選擇合適的工業相機快門種類

在工業相機領域,常見的三種快門類型:全局快門(Global Shutter)、卷簾快門(Rolling Shutter)以及全局復位式卷簾快門(Global - reset rolling Shutter)。我們主要來講講全局快門&…

uloop源碼剖析

uloop是libubox庫的核心模塊,libubox是OpenWrt基礎庫之一,用來提供事件驅動、基礎數據結構等。 uloop支持文件描述符監控、超時定時器、子進程管理、信號處理事件、間隔定時器等五大核心功能。 主體框架 uloop循環的主體框架有三個函數構成&#xff0c…

Mac電腦 虛擬機 VMware Fusion13

VMware Fusion mac 不僅能讓你在Mac蘋果電腦上運行Windows或Linux系統、使用非Mac平臺的應用,而且還可以支持各種USB硬件設備。 原文地址:VMware Fusion 13 Mac虛擬機

嵌套容器是隱射宿主機的路徑而不是容器的路徑

嵌套容器是隱射宿主機的路徑而不是容器的路徑 為什么?容器中的 Docker 運行流程 為什么? 這個問題涉及 Docker 的工作原理,特別是嵌套容器的行為。讓我們逐步分析為什么在容器內部啟動其他容器時,文件系統的掛載行為是基于 宿主機…

Go語言--語法基礎6--基本數據類型--切片類型

Go 語言切片是對數組的抽象。Go 數組的長度不可改變,在特定場景中這樣的集合就不太適用,Go 中提供了一種靈活、功能強悍的內置類型切片 ("動態數組"),與數組相比切片的長度是不固定的,可以追加元素,在追加時…

?御控物聯網綜合應用實訓平臺-物聯網系統和實驗室實訓系統?

在科技飛速發展的今天,物聯網技術已滲透到各個領域,成為推動產業升級和創新發展的重要力量。對于職業教育和科研機構而言,搭建一套完善的物聯網綜合應用實訓系統,培養適應時代需求的物聯網專業人才,顯得尤為迫切。而御…

ElasticSearch中的分片是什么?

大家好,我是鋒哥。今天分享關于【ElasticSearch中的分片是什么?】面試題。希望對大家有幫助; ElasticSearch中的分片是什么? 超硬核AI學習資料,現在永久免費了! 在 Elasticsearch 中,分片(Shard&#x…

基于PHP+MySQL組合開發開源問答網站平臺源碼系統 源碼開源可二次開發 含完整的搭建指南

問答網站成為人們獲取知識、交流經驗的重要平臺。無論是專業領域的疑難解答,還是生活常識的分享探討,問答網站都發揮著巨大的作用。對于想要搭建問答網站的個人或企業來說,一款優秀的開源問答網站平臺源碼系統至關重要。今天,我們…

Python工程師面試題集

文章目錄一、Python基礎二、關鍵Python庫三、Web開發四、并發與性能五、系統設計答案區一、Python基礎Python的可變與不可變數據類型有哪些?底層實現原理?Python2與Python3的主要區別解釋GIL全局解釋器鎖及其對多線程的影響裝飾器Decorator的作用與實現原…

什么是碼率?剪映中如何選擇適合的視頻碼率

在視頻編輯過程中,碼率(Bitrate)是一個決定視頻畫質的關鍵參數。對于普通用戶來說,剪映作為一款功能強大的視頻編輯工具,其默認的碼率設置直接影響最終導出視頻的質量和文件大小。那么,剪映的默認碼率是多少…

專題:2025電商營銷與AI應用發展趨勢報告|附260+份報告PDF、原數據表匯總下載

原文鏈接:https://tecdat.cn/?p42834 電商行業在數字經濟浪潮中持續演進,2025年呈現出多平臺發力、技術驅動增長、消費需求多元等特點。快手和抖音作為國內直播電商的重要陣地,各品類銷售表現各有亮點,同時全球電商市場規模穩步…

windows安裝stable diffusion

安裝git https://git-scm.com/downloads/winclone項目 創建一個文件夾,clone下來stable diffusion webui git網址:https://github.com/AUTOMATIC1111/stable-diffusion-webui git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git安裝…

Python爬蟲 XPath 三方庫lxml

前言 XPath是Python爬蟲最重要的過濾原始數據的手段之一,是爬蟲最核心的技術 是專業抓取HTML頁面而生的,基本上只用于抓取HTML頁面使用 目錄 安裝支持XPath三方庫lxml XPath代碼入門示例 XPath表達式語法 在源代碼上面直接獲取XPath 安裝支持XPath三方庫lxml pip instal…

深度學習洪水推演:Python融合多源衛星數據可視化南方暴雨災情

目錄1. 引言:多源衛星融合分析的突破性價值2. 多模態融合架構設計3. 雙流程對比分析3.1 單源 vs 多源融合分析3.2 洪水推演核心流程4. 核心代碼實現4.1 多源數據融合處理(Python)4.2 時空洪水推演模型(PyTorch)4.3 三維…