STM32库函数USART_SendData的缺陷和解决方法
来源:互联网 发布:西安旅游人数数据 编辑:程序博客网 时间:2024/05/24 07:01
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这么做的原因是:使用发送中断功能。
本文引用通告地址:http://wojiushiwolxw.spaces.eepw.com.cn/articles/trackback/item/93110
- STM32库函数USART_SendData的缺陷和解决方法
- 20130408-[转]STM32库函数USART_SendData的缺陷和解决方法
- STM32库函数void USART_SendData()的缺陷和解决方法
- STM32库函数void USART_SendData的缺陷和解决方法
- STM32的串口函数_库函数USART_SendData问题和解决方法--硬件复位导致第一个字节丢失
- STM32库函数EXTI_GetFlagStatus和EXTI_GetITStatus的区别
- 【C陷阱和缺陷】库函数
- 【C陷阱和缺陷】库函数
- 解析STM32的库函数
- STM32的库函数
- STM32串口的设置和库函数的介绍
- STM32 下的库函数和寄存器操作比较
- STM32库函数SystemInit()的理解
- 【嵌入式】STM32的库函数使用
- HttpURLConnection的流式输出的缺陷和解决方法
- HttpURLConnection的流式输出的缺陷和解决方法
- HttpURLConnection的流式输出的缺陷和解决方法
- HttpURLConnection的流式输出的缺陷和解决方法
- Linux bash 管道符及多命令执行
- POJ 1035 Spell checker
- 如何实现mybatis+Springboot 关联查询
- linux 安装mysql
- win7 MySQL5.7.18 免安装版 安装教程
- STM32库函数USART_SendData的缺陷和解决方法
- 离开---梦想不变
- 排序算法---之插入排序(直接插入排序&希尔排序)
- phpcms使用说明及语法说明
- GStreamer基础教程10——GStreamer工具
- Android StateListDrawable
- matplotlib基础——pyplot.figure()
- 紫书例题 Vijos P1189 困难的串
- 0.0.