这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» STM32» 【转载】标准库bspuartfifo.c里面串口发送函数UartSend修正完善

共1条 1/1 1 跳转至

【转载】标准库bspuartfifo.c里面串口发送函数UartSend修正完善--from三叶

工程师
2024-02-21 00:10:43 打赏


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



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




这里再提供一个标准库的解决方案:

  1. static void UartSend(UART_T *_pUart, uint8_t *_ucaBuf, uint16_t _usLen)

  2. {

  3. uint16_t i;


  4. for (i = 0; i < _usLen; i++)

  5. {

  6. /* 如果发送缓冲区已经满了,则等待缓冲区空 */

  7. while (1)

  8. {

  9. __IO uint16_t usCount;


  10. DISABLE_INT();

  11. usCount = _pUart->usTxCount;

  12. ENABLE_INT();


  13. if (usCount < _pUart->usTxBufSize)

  14. {

  15. break;

  16. }

  17. else if(usCount == _pUart->usTxBufSize)/* 数据已填满缓冲区 */

  18. {

  19. if((_pUart->uart->CR1 & USART_CR1_TXEIE) == 0)

  20. {

  21. USART_ITConfig(_pUart->uart, USART_IT_TXE, ENABLE);

  22. }

  23. }

  24. }


  25. /* 将新数据填入发送缓冲区 */

  26. _pUart->pTxBuf[_pUart->usTxWrite] = _ucaBuf[i];


  27. DISABLE_INT();

  28. if (++_pUart->usTxWrite >= _pUart->usTxBufSize)

  29. {

  30. _pUart->usTxWrite = 0;

  31. }

  32. _pUart->usTxCount++;

  33. ENABLE_INT();

  34. }


  35. USART_ITConfig(_pUart->uart, USART_IT_TXE, ENABLE);

  36. }

来源: 整理文章为传播相关技术,网络版权归原作者所有,如有侵权,请联系删除。


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]