| 这里的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);
}
 | 
来源: 整理文章为传播相关技术,网络版权归原作者所有,如有侵权,请联系删除。