eric2013 发表于 2019-11-20 10:52:56

标准库bsp_uart_fifo.c里面串口发送函数UartSend修正完善

这里的bug,客户反馈了很多次,我每次都要解释一遍,已经解释了好几年。
此处的含义是用户一次性发送的数据不要超过缓冲区大小,超过会卡死在里面:



后来发布的V6得HAL库程序里面直接做了个超过缓冲区的处理,解决之前超过缓冲大小的问题:



static/image/hrline/4.gif
这里再提供一个标准库的解决方案:

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 = _ucaBuf;

                DISABLE_INT();
                if (++_pUart->usTxWrite >= _pUart->usTxBufSize)
                {
                        _pUart->usTxWrite = 0;
                }
                _pUart->usTxCount++;
                ENABLE_INT();
        }

        USART_ITConfig(_pUart->uart, USART_IT_TXE, ENABLE);
}




byccc 发表于 2019-11-20 16:17:08

终于改了

tianqi911 发表于 2020-5-21 10:40:27

顶。碰到来此处。

ezio.xiang 发表于 2024-1-10 22:30:36

虽然这个帖子很老了,我现在遇到一个问题,我的从机挂在主机上,我的从机回复主机的命令是18个字节的数据,设备每次第一次上电,主机查询,我回复的是对的,但是,后面在查询,就会莫名其妙的丢失前三个字节,但是呢,我用串口调试工具,就一点问题没有,请问,这个是send函数的问题吗?
页: [1]
查看完整版本: 标准库bsp_uart_fifo.c里面串口发送函数UartSend修正完善