这里的bug,客户反馈了很多次,我每次都要解释一遍,已经解释了好几年。 此处的含义是用户一次性发送的数据不要超过缓冲区大小,超过会卡死在里面:
后来发布的V6得HAL库程序里面直接做了个超过缓冲区的处理,解决之前超过缓冲大小的问题:
这里再提供一个标准库的解决方案:
static void UartSend(UART_T *_pUart, uint8_t *_ucaBuf, uint16_t _usLen)
{
uint16_t i;
for (i = 0; i < _usLen; i++)
{
/* 如果发送缓冲区已经满了,则等待缓冲区空 */
while (1)
{
__IO uint16_t usCount;
DISABLE_INT();
usCount = _pUart->usTxCount;
ENABLE_INT();
if (usCount < _pUart->usTxBufSize)
{
break;
}
else if(usCount == _pUart->usTxBufSize)/* 数据已填满缓冲区 */
{
if((_pUart->uart->CR1 & USART_CR1_TXEIE) == 0)
{
USART_ITConfig(_pUart->uart, USART_IT_TXE, ENABLE);
}
}
}
/* 将新数据填入发送缓冲区 */
_pUart->pTxBuf[_pUart->usTxWrite] = _ucaBuf[i];
DISABLE_INT();
if (++_pUart->usTxWrite >= _pUart->usTxBufSize)
{
_pUart->usTxWrite = 0;
}
_pUart->usTxCount++;
ENABLE_INT();
}
USART_ITConfig(_pUart->uart, USART_IT_TXE, ENABLE);
}
|
来源: 整理文章为传播相关技术,网络版权归原作者所有,如有侵权,请联系删除。