STM32库函数void USART_SendData()的缺陷和解决方法

发布者:dong125612最新更新时间:2021-05-18 来源: eefocus关键字:STM32  库函数  void 手机看文章 扫描二维码
随时随地手机看文章

简介:本文主要谈到了STM32库函数void USART_SendData()存在的一些问题,针对这些问题提到了3个解决方案,一起来看看。


2.1问题及现象


使用USART_SendData()函数非连续发送单个字符是没有问题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出现象。若发送的数据量很小时,此时串口发送的只是最后一个字符,当发送数据量大时,就会导致发送的数据莫名其妙的丢失。


如:


for(TxCounter = 0;TxCounter < RxCounter; TxCounter++)


USART_SendData(USART1, RxBuffer[TxCounter]);


2.2原因


此API函数不完善,函数体内部没有一个判断一个字符是否发送完毕的语句,而是把数据直接放入发送缓冲区,当连续发送数据时,由于发送移位寄存器的速度限制(与通信波特率有关),导致发送缓冲区的数据溢出,老的数据还未及时发送出去,新的数据又把发送缓冲区的老数据覆盖了。


2.3 解决方法(目前总结的两种方案)


方案1.加入延时函数(下下策),不需要修改USART_SendData()函数


for(TxCounter = 0;TxCounter < RxCounter; TxCounter++){


USART_SendData(USART1, RxBuffer[TxCounter]);


DelayMS(2); //加入一个小的延时


}


方案2.修改USART_SendData()函数,在其内部加入发送缓冲区的USART_FLAG_TXE状态检测语句,确保一个字符完全发送出去,才进行下一个字符的发送。


实现方法:每发送一个字符都检测状态寄存器,确保数据已经发送完毕。具体操作步骤如下所示。


修改前的函数定义体


void USART_SendData(USART_TypeDef* USARTx, u16 Data)


{


/* Check the parameters */


assert_param(IS_USART_ALL_PERIPH(USARTx));


assert_param(IS_USART_DATA(Data));




/* Transmit Data */


USARTx->DR = (Data & (u16)0x01FF);


}


修改后的函数定义体


void USART_SendData(USART_TypeDef* USARTx, u16 Data)


{


/* Check the parameters */


assert_param(IS_USART_ALL_PERIPH(USARTx));


assert_param(IS_USART_DATA(Data))


/* Transmit Data */


USARTx->DR = (Data & (u16)0x01FF);


while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //等待发送缓冲区空才能发送下一个字符


}


方案3.不修改原来的库函数,在每一个字符发送后检测状态位。


USART_SendData(USART1, RxBuffer[TxCounter]);


while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //等待发送缓冲区空才能发送下一个字符


ST这么做的原因是:使用发送中断功能。


关键字:STM32  库函数  void 引用地址:STM32库函数void USART_SendData()的缺陷和解决方法

上一篇:基于STM32单片机的DLP驱动电路研究
下一篇:一种STM32微控制器处理电机控制的设计和实现

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

stm32学习笔记(二)按键实验
#include key.h #include delay.h ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK Mini STM32开发板 //按键输入 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2014/3/06 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 //All
[单片机]
<font color='red'>stm32</font>学习笔记(二)按键实验
stm32的TIM2作为实例一步步配置成为定时器
下面以stm32的TIM2作为实例一步步配置成为定时器: 1:对定时器的基本配置 TIM_TimeBaseStructure.TIM_Period = 65535; //设置自动装载寄存器 TIM_TimeBaseStructure.TIM_Prescaler = 100; //分频计数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择向上计数 TIM_TimeBaseInit(TIM2, &TIM_TimeBase
[单片机]
semihost/ITM机制浅析以及使用JLINK通过ITM调试stm32单片机
使用ITM机制实现调试stm32单片机,实现printf与scanf。 1. ITM简介 ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式,称为半主机(semihosting)方式。 在pc上编写过C语言的人都知道,printf可以向控制台输出,scanf可以从控制台获取输入,这里的printf/scanf都是标准库函数,利用操作系统的这些函数,我们可以很方便的调试程序。在嵌入式设备上(如stm32单片机平台上)开发工具(如MDK/IAR)也都提供了标准库函,自然也提供了printf/scanf函数,那么这些函数是否可以使用呢? 问题来了,printf向哪里输出呢?并且大部分情况下,也没有键盘,又如何
[单片机]
STM32串口收数据的几种不同方式
本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈。。。 实例一: void USART1_IRQHandler(u8 GetData) { u8 BackData; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生 { USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志. GetData = UART1_GetByte(BackData); //也行GetData=USART1- DR; USART1_SendByte(GetData); //
[单片机]
STM32学习笔记之USB库文件分析
主要分析下其他一些文件: usb_core.c、 usb_init.c、 usb_int.c、 usb_mem.c、 usb_reg.c usb_sil.c 1、 usb_core.c -- 这个文件从名字上就可知,这是usb的核心文件。这个文件主要是USB在枚举过程中的一些功能函数。比如控制传输的建立阶段、数据阶段、状态阶段的各种标准请求函数,各个阶段的处理函数等。 uint8_t Setup0_Process(void); uint8_t Post0_Process(void); uint8_t Out0_Process(void); uint8_t In0_Process(void); RESULT Standard_
[单片机]
STM32的SPI接收卡死问题
调试时在调用如下SPI函数时,发现以下两个问题: 1、如果在第三行语句while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);处设断点,将会卡死在这个while语句内,并导致看门狗复位; 2、全速运行,会触发看门狗复位程序,程序只调用spi,无中断,确定为spi导致,SPI速率由16M降至2M,则短时内不见复位; uint8_t SPI2_SendOneByte(uint8_t u8Data)//SPI2发送一字节 { /* 等待发送缓冲区为空, TXE 事件 */ while (SPI_I2S_GetFlagStatus(SPI2, SPI_
[单片机]
STM32单片机的具体介绍和技术知识
STM32的核心Cortex-M3处理器是一个标准化的微控制器结构,希望思考一下,何为标准化?简言之,Cortex-M3处理器拥有32位CPU,并行总线结构,嵌套中断向量控制单元,调试系统以及标准的存储映射。 嵌套中断向量控制器(Nested Vector Interrupt Controller,简称NVIC)是Cortex-M3处理器中一个比较关键的组件,它为基于Cortex-M3的微控制器提供了标准的中断架构和优秀的中断响应能力,为超过240个中断源提供专门的中断入口,而且可以赋予每个中断源单独的优先级。利用NVIC从可以达到极快的中断响应速度,从收到中断请求到执行中断服务的第一条指令仅需12个周期。这种极快的响应速度
[单片机]
<font color='red'>STM32</font>单片机的具体介绍和技术知识
STM32芯片简介以及功能特点和其优异性
STM32与单片机 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。由于8位单片机由于内部构造简单,体积小,成本低廉,在一些较简单的控制器中应用很广。常见的8位单片机主要有:Intel的51系列,Atmel的AVR系统,Microchip公司的PIC系列,TI的MSP430系列等。而STM32是一种功能比较强大的32位的单片机。它和8位单片机最大的不
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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