STM32用USART发送字符串,以USART_FLAG_TXE和USART_FLAG_TC怎么用

发布者:TechVoyager最新更新时间:2019-09-21 来源: eefocus关键字:STM32  USART  发送字符串 手机看文章 扫描二维码
随时随地手机看文章

一:STM32用USART发送字符串

void UART_Send_Message(u8 *Data)

{

  while(*Data!='')

  {

      USART_SendData(USART1, *Data);

      while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//读取串口状态

      Data++;

  }

}

 

void main(void)

{

u8 str_buf[500];

memset((char *) &str_buf, 0, sizeof(str_buf));

UART_Send_Message(str_buf);

}


while(SET == USART_GetFlagStatus(USART1,USART_FLAG_RXNE));

含义是:当接收引脚有数据时,状态寄存器的USART_FLAG_RXNE就会为1,此时USART_GetFlagStatus(USART1,USART_FLAG_RXNE)的返回值就为1(SET),若无数据则为RESET。


二:USART_FLAG_TXE和USART_FLAG_TC怎么用


这里主要说的是在特殊情况下发送字符软件代码的写法。


特殊情况指的是:


1.调用发送字符串函数“发送完”本机立即掉电;


2.调用发送字符串函数“发送完”从机立即掉电;


【上面两种主要用于芯片对电源控制的项目中】


3.调用发送字符串函数“发送完”立刻进入待机或停机;


其实本文主要说的是两个标志位:USART_FLAG_TXE 和 USART_FLAG_TC.


USART_FLAG_TXE发送缓冲区空标志:说明可以往数据寄存器写入数据了,但并不代码数据发送完成了。


USART_FLAG_TC发送完成标志:这个才是代表USART在缓冲区的数据发送完成了,即从机接收到了数据。


这两个标志的区别在于:它们分别表示数据在发送过程中,在两个不同的阶段中的完成情况。TXE 表示数据被从发送缓冲区中取走,转移到的移位寄存器中,此时发送缓冲是空的,可以向其中补充新的数据了。而 TC 则表示最后放入发送缓冲区的数据已经完成了从移位寄存器向发送信号线 Tx 上的转移。所以,判定数据最终发送完成的标志是 TC,而不是 TXE.


下面讲述在不同代码写法下,得到不同实验效果【调试助手接收数据】:


1.常见写法一 


这种写法在不是特殊(不掉电、不待机等)情况下,问题不大,USART数据会成功发送出去。 但是在上面说的特殊情况下,问题就来了,代码只将数据放到了发送缓冲区,而没有发送出去就掉电或待机了,这个时候其实最后两个字符是没有发送出去的。


2.常见写法二 


这种写法达到的效果和上面存在不同的就是倒数第二个数据发送出去了,也就是只有最后一个字符是没有发送出去的。


3.常见写法三 


这种写法达到的效果和上面两种写法有不一样,发送了10个字符。


4.写法四 


这种写法按理说可以实现功能,但实际多次试验结果确实第一字节数据丢失了。


5.写法五(正确写法) 


这种写法是比较完成,为了保守起见,在特殊情况下使用该写法。。


至此,常见软件写法都给出了源代码和试验效果,请根据自己实际情况写代码验证。


关键字:STM32  USART  发送字符串 引用地址:STM32用USART发送字符串,以USART_FLAG_TXE和USART_FLAG_TC怎么用

上一篇:基于stm32f103zet6的DS1302学习
下一篇:IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

推荐阅读最新更新时间:2024-11-12 19:08

STM32-(09):USART库函数方式编程
STM32库函数 STM32库是由ST公司针对STM32提供的函数接口,即API(Application Program Interface),开发者可调用这些函数接口来配置STM32 的寄存器,使开发人员得以脱离最底层的寄存器操作,有开发快速,易于阅读,维护成本低等特点。 当我们调用库的API的时候可以不用挖空心思去了解库底层的寄存器操作,就像当年我们学习C语言的时候,用Printf()函数时只是学习它的使用格式,并没有去研究它的源码实现,如非必要,可以说是老死不相往来。 库是假设在寄存器与用户驱动层之间的代码,向下处理与寄存器直接相关的配置,向上为用户提供配置寄存器的接口。 CMSIS 标准 因为基于Cortex的
[单片机]
STM32-(09):<font color='red'>USART</font>库函数方式编程
STM32 DMA->内存到内存
基于STM32 F401 Discovery板: DMA2在AHB1总线上 步骤一:使能DMA #define DMA_STREAM_CLOCK RCC_AHB1Periph_DMA2 RCC_AHB1PeriphClockCmd(DMA_STREAM_CLOCK, ENABLE); 步骤二:reset DMA Stream register: /* Reset DMA Stream registers (for debug purpose) */ DMA_DeInit(DMA_STREAM); 步骤三: /* Check if the DMA Stream is disab
[单片机]
<font color='red'>STM32</font> DMA->内存到内存
求一种基于STM32的智能加油系统设计方案
毕设介绍 针对当前汽车加油需求的日益增多,基于STM32开发技术和传感器技术开发一款智能加油系统。 题目要求 智能加油系统应具备油量控制、根据油费计价、加油环境检测的功能。该系统能模拟汽车加油的全过程,并具备远程控制功能。 题目分析 本次毕业设计是智能加油系统的设计与实现,设计所包含的模块主要有oled显示电路、电磁阀驱动电路、可燃气体传感器模块、ds18b20数字温度传感器、蜂鸣器报警模块、WIFI模块、按键电路模块及电源模块。 通过模块之间的配合实现智能加油系统,一旦有温度异常或可燃气体浓度超标将会通过wifi模块对管理人员发出警告。 stm32f103c8t6实时采集ds18b20温度传感器获取温度,如果温度
[单片机]
求一种基于<font color='red'>STM32</font>的智能加油系统设计方案
STM32_ EXIT中断
今天的软件工程下载地址(360云盘): https://yunpan.cn/cPhvyer3vIwXh访问密码 57e1 STM32F10x的资料可以在我360云盘下载: https://yunpan.cn/crBUdUGdYKam2访问密码 ca90 工程概要说明:定义一个按键(可自己定义),每按键一次,响应中断一次,在中断函数中LED提示灯变化一次,用户可更加实际情况在中断函数做出相应操作,这里只是一个模板。 关于“STM32F103EXIT中断”我把重要的几点在下面分别讲述,若不明白,请关注微信公众号“EmbeddDeveloper”查阅或留言。 一、RCC时钟配置 该函数位于在bsp.c文件下面; 使能RCC时钟:RC
[单片机]
STM32_ EXIT中断
STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置
cube基本配置,外设开启编码器,串口2 -------------------------------------------------------------------------------------------------------------------------- 错误:error: #20: identifier TIM_ICPOLARITY_BOTHEDGE is undefined 意思是,高级、通用定时器不能用BothEdge,只有基本定时器才能用BothEdge F4系列 /* 编码器初始化及使能编码器模式 */ ENCODER_TIMx_Init(); HA
[单片机]
<font color='red'>STM32</font> HAL库学习系列第5篇 定时器TIM---编码器接口模式配置
STM32按键检测之短按与长按方法
在电路设计中,我们经常需要读取外部的电平信号。比如,在项目中,我们需要通过按键来输入一些数据,那么就需要检测按键是否被按下。电平分为高电平读取和低电平读取,读取高电平,需要设置IO为下拉电阻输入模式,反之,设置IO为上拉电阻输入模式。 S4按下时,单片机IO为高电平,S1-S3按下时,为低电平。我们设置S1为上拉输入模式,S4为下拉输入模式。本节使用按键实现2个功能: S1短按一次,LED2点亮,S1再短按一次,LED2熄灭。S1长按,LED1点亮,S1再长按,LED1熄灭。这种方式可以用来实现短按调节菜单,长按保存参数。 S4短按一次,LED4点亮,S4再短按一次,LED4熄灭。S4长按且不松手,LED4闪烁。这种方式可以用
[单片机]
<font color='red'>STM32</font>按键检测之短按与长按方法
STM32使用systick实现精确延时
SYSTICK寄存器初始化 void SysTick_Configuration(void) { if (SysTick_Config(SystemCoreClock / 100)) { while (1); } NVIC_SetPriority(SysTick_IRQn, 0x0); } SysTick_Config默认时钟为SysTick_CLKSource_HCLK,所以在这之前使用SysTick_CLKSourceConfig()选择系统时钟不会改变systick的时钟 static __INLINE uint32_t SysTick_Config(uin
[单片机]
STM32中ucos的编写程序
* Includes ------------------------------------------------------------------*/ #include config.h /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ //定义 堆栈大小 //#define TASK_STK_SIZE 128 #define TASK_STK_SIZ
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved