一:串口发送字符和字符串和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 三维…