这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 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 跳转至

回复

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