OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2414|回复: 1

使用HAL库做串口接收数据,复位后第一个字节接收不到

[复制链接]

13

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2018-3-13
在线时间
41 小时
发表于 2019-8-20 17:52:35 | 显示全部楼层 |阅读模式
10金钱
  1. /**
  2.   * @brief Receive an amount of data in blocking mode.
  3.   * @param huart UART handle.
  4.   * @param pData pointer to data buffer.
  5.   * @param Size amount of data to be received.
  6.   * @param Timeout Timeout duration.
  7.   * [url=home.php?mod=space&uid=60778]@note[/url]   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  8.   *         address of user data buffer for storing data to be received, should be aligned on a half word frontier (16 bits)
  9.   *         (as received data will be handled using u16 pointer cast). Depending on compilation chain,
  10.   *         use of specific alignment compilation directives or pragmas might be required to ensure proper alignment for pData.
  11.   * @retval HAL status
  12.   */
  13. HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
  14. {
  15.   uint16_t* tmp;
  16.   uint16_t uhMask;
  17.   uint32_t tickstart = 0;

  18.   /* Check that a Rx process is not already ongoing */
  19.   if(huart->RxState == HAL_UART_STATE_READY)                    <font color="#ff0000">//这里进不去,发送第二个字节才能进,应该在配置上加什么样的初始化</font>
  20.   {
  21.     if((pData == NULL ) || (Size == 0U))
  22.     {
  23.       return  HAL_ERROR;
  24.     }

  25.     /* In case of 9bits/No Parity transfer, pData buffer provided as input paramter
  26.        should be aligned on a u16 frontier, as data to be received from RDR will be
  27.        handled through a u16 cast. */
  28.     if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
  29.     {
  30.       if((((uint32_t)pData)&1U) != 0U)
  31.       {
  32.         return  HAL_ERROR;
  33.       }
  34.     }

  35.     /* Process Locked */
  36.     __HAL_LOCK(huart);

  37.     huart->ErrorCode = HAL_UART_ERROR_NONE;
  38.     huart->RxState = HAL_UART_STATE_BUSY_RX;

  39.     /* Init tickstart for timeout managment*/
  40.     tickstart = HAL_GetTick();

  41.     huart->RxXferSize = Size;
  42.     huart->RxXferCount = Size;

  43.     /* Computation of UART mask to apply to RDR register */
  44.     UART_MASK_COMPUTATION(huart);
  45.     uhMask = huart->Mask;

  46.     /* as long as data have to be received */
  47.     while(huart->RxXferCount > 0U)
  48.     {
  49.       huart->RxXferCount--;
  50.       if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
  51.       {
  52.         return HAL_TIMEOUT;
  53.       }
  54.       if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE))
  55.       {
  56.         tmp = (uint16_t*) pData ;
  57.         *tmp = (uint16_t)(huart->Instance->RDR & uhMask);
  58.         pData +=2U;
  59.       }
  60.       else
  61.       {
  62.         *pData++ = (uint8_t)(huart->Instance->RDR & (uint8_t)uhMask);
  63.       }
  64.     }

  65.     /* At end of Rx process, restore huart->RxState to Ready */
  66.     huart->RxState = HAL_UART_STATE_READY;

  67.     /* Process Unlocked */
  68.     __HAL_UNLOCK(huart);

  69.     return HAL_OK;
  70.   }
  71.   else
  72.   {
  73.     return HAL_BUSY;
  74.   }
  75. }
复制代码

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2018-3-13
在线时间
41 小时
 楼主| 发表于 2019-8-20 18:01:53 | 显示全部楼层
在初始化的时候,加上        HAL_UART_Receive_IT(&UART2_Handler, (uint8_t *)&aRxBuffer, 1);        同样会进入 HAL_BUSY
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 13:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表