个人记载:
昨日做串口试验的时分一向没有成功的原因,接连调用USART_SendData总是会呈现前一个被后一个掩盖的状况。
之前觉得ST的官方库应该没有问题就没往这方面想,现在查查,的确有库的问题,仍是自己对库不太了解。
还有遇到的硬件复位今后,发送榜首个字符丢掉的状况。
1、后字节掩盖前字节
—————–加判别while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){}
2、硬件复位之后榜首个字符丢掉
—————–USART_ClearFlag(USART2,USART_FLAG_TC);
—————–USART_SendData(USART2,0x01);
—————–while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
转载正文:
1. 问题及现象
运用USART_SendData()函数非接连发送单个字符是没有问题的;当接连发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢呈现象。若发送的数据量很小时,此刻串口发送的仅仅最终一个字符,当发送数据量大时,就会导致发送的数据不可思议的丢掉。
如:
1
2
|
for(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
15
|
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);
}
|
修正后的函数界说体
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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){} //等候发送缓冲区空才干发送下一个字符
}
或许有人以为,为什么不预先在库函数中处理这个问题,而把解决办法抛给用户。个人以为ST这么做的原因是:运用发送中止功用。
|
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/256061.html