C语言senddata串口发送数据,STM32的串口函数_库函数USART_SendData问题和解决方法

2023-05-16

1. 问题及现象

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

如:

1

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

USART_SendData(USART1, RxBuffer[TxCounter]);

2. 原因

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

3. 解决办法

发送后等候一段时刻延迟的办法就不说了,等候时刻不确定,此为下下策。供给下面2种计划:

计划1. 在每一个字符发送后检测状况位

USART_SendData(USART1, RxBuffer[TxCounter]);

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

计划2. 修正库函数

修正USART_SendData()函数,在其内部参加发送缓冲区的USART_FLAG_TXE状况检测句子,确保一个字符彻底发送出去,才进行下一个字符的发送。

完成办法:每发送一个字符都检测状况寄存器,确保数据现已发送完毕。具体操作过程如下所示。

修正前的函数界说体

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15void 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);

}

修正后的函数界说体

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16void 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){} //等候发送缓冲区空才干发送下一个字符

}

或许有人以为,为什么不预先在库函数中处理这个问题,而把解决办法抛给用户。个人以为ST这么做的原因是:运用发送中止功用。

4.TXE和TC标志位具体阐明

在USART的发送端有2个寄存器,一个是程序能够看到的USART_DR寄存器(下图中暗影部分的TDR),另一个是程序看不到的移位寄存器(下图中暗影部分Transmit Shift Register)。

对应USART数据发送有两个标志,一个是TXE=发送数据寄存器空,另一个是TC=发送完毕;对照下图,当TDR中的数据传送到移位寄存器后,TXE被设置,此刻移位寄存器开端向TX信号线按位传输数据,但由于TDR现已变空,程序能够把下一个要发送的字节(操作USART_DR)写入TDR中,而不用比及移位寄存器中一切位发送完毕,一切位发送完毕时(送出中止位后)硬件会设置TC标志。

另一方面,在刚刚初始化好USART还没有发送任何数据时,也会有TXE标志,由于这时发送数据寄存器是空的。

TXEIE和TCIE的含义很简单,TXEIE答应在TXE标志为1时发生中止,而TCIE答应在TC标志为1时发生中止。

至于什么时分运用哪个标志,需求依据你的需求自己决议。但我以为TXE答应程序有更富余的时刻填写TDR寄存器,确保发送的数据流不间断。TC能够让程序知道发送完毕的切当时刻,有利于程序控制外部数据流的时序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言senddata串口发送数据,STM32的串口函数_库函数USART_SendData问题和解决方法 的相关文章

随机推荐