您的位置 首页 发布

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

1问题及现象使用USART_SendData()函数非连续发送单个字符是没有问题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出

1问题及现象

运用USART_SendData()函数非接连发送单个字符是没有问题的;当接连发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出现象。若发送的数据量很小时,此刻串口发送的仅仅最终一个字符,当发送数据量大时,就会导致发送的数据不可思议的丢掉。

如:

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

USART_SendData(USART1, RxBuffer[TxCounter]);

2原因

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

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)

{

assert_param(IS_USART_ALL_PERIPH(USARTx));

assert_param(IS_USART_DATA(Data));

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

}

修正后的函数界说体

void USART_SendData(USART_TypeDef* USARTx, u16 Data)

{

assert_param(IS_USART_ALL_PERIPH(USARTx));

assert_param(IS_USART_DATA(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这么做的原因是:运用发送中止功用。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/256384.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部