简介:本文主要谈到了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单片机的DLP驱动电路研究
下一篇:一种STM32微控制器处理电机控制的设计和实现
推荐阅读最新更新时间:2024-11-08 11:56
设计资源 培训 开发板 精华推荐
- INA226
- L78L08AC正压稳压器Edit boost电路的典型应用
- LTC2946MPMS 双向功率监视器的典型应用,在正向路径中具有能量和电荷监视器
- DER-108 - 7.2 W 双输出电源
- ip2326三串锂电Type-C快充模块
- KITXMC11BOOT001TOBO1、XMC1100 微控制器评估板 64KB Flash
- 纯数电搭建一个带范围设定的随机数生成器
- ADA4627-1ARZ-RL带保护同相放大器典型应用电路
- C8051F580DK,C8051F590 8051 MCU 工业应用开发系统
- CY8C4127LQI-BL473 4100_BLE PSoC 可编程片上系统的典型应用
- 2018开“芯”学:Mentor两场知识有奖问答邀你新年充电
- 3小时实战+剖析:TI工程师手把手带你全面入门MSP430(限量售$4.3开发套件,助你参与动手实验)
- MSP430 多款开发工具优惠促销,总有一款会适合你!
- 有奖直播:TI 的故事—— IC 创世纪
- 月度原创精选评选2018年6月(总第5期)
- PI 有奖直播:在无需DC-DC变换器的多路输出电源设计中实现高效率和出色的输出调整率
- 逛村田在线云展厅,了解通信、移动、工业+环境、健康四大领域的应用干货!
- 有奖直播:基于GaN 的高频(1.2MHz)高效率 1.6kW 高密度临界模式 (CrM) 图腾柱功率因数校正 (PFC)转换器的应用介绍
- 【投票瓜分2500元红包】2022得捷电子创新设计大赛优秀作品人气奖由你来定!