你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

一帧数据能分两次用HAL_UART_Receive接收吗

[复制链接]
yimingliang2019 提问时间:2019-6-26 14:38 /
最近在做串口升级  官方例程 有一段代码  一帧数据分两次用HAL_UART_Receive接收 可是我这样调试 得不到数据 请教大神!
收藏 评论8 发布时间:2019-6-26 14:38

举报

8个回答
byronsong 回答时间:2019-6-26 14:52:58
void Get_ID_command_Function(uint8_t *PID)
{       
        uint8_t Number=0,temp[2];
        temp[0]=Get_ID_command;
        temp[1]=0xFF-Get_ID_command;
        while(HAL_UART_Transmit(&huartx,temp,2,TimeOUT_USART)!=HAL_OK){}
        while(HAL_UART_Receive(&huartx,&temp[0],1,TimeOUT_USART)!=HAL_OK){}
        switch(temp[0]){
        case ACK_MCU:
                while(HAL_UART_Receive(&huartx,&Number,1,TimeOUT_USART)!=HAL_OK){}
                //for(i=0;i<Number+1;i++)
                while(HAL_UART_Receive(&huartx,PID,Number+1,TimeOUT_USART)!=HAL_OK){}
                while(HAL_UART_Receive(&huartx,temp,1,TimeOUT_USART)!=HAL_OK){}
//        printf("Get_ID ACK 1\n");
                if(temp[0]==ACK_MCU){
//                        LED(ON);
//                        printf("Get_ID ACK 2\n");
                }else{
//                        LED(OFF);
                        printf("Get_ID NACK 2\n");
                }
                break;
        case NACK_MCU:
                printf("Get_ID NACK 1\n");
                break;
        default:
                break;
        }
}
yimingliang2019 回答时间:2019-6-26 15:06:05
你好 !你这样能调通? 如果有一个while超时 代码就会死循环啊。 static HAL_StatusTypeDef ReceivePacket(uint8_t *p_data, uint32_t *p_length, uint32_t timeout)
{
  uint32_t crc;
  uint32_t packet_size = 0;
  HAL_StatusTypeDef status;
  uint8_t char1;

  *p_length = 0;
  status = HAL_UART_Receive(&UartHandle, &char1, 1, timeout);
  if (status == HAL_OK)
  {
    switch (char1)
    {
      case SOH:
        packet_size = PACKET_SIZE; //128
        break;
      case STX:
        packet_size = PACKET_1K_SIZE;  //1024
        break;
      case EOT:
        break;
      case CA:
        if ((HAL_UART_Receive(&UartHandle, &char1, 1, timeout) == HAL_OK) && (char1 == CA))
        {
          packet_size = 2;
        }
        else
        {
          status = HAL_ERROR;
        }
        break;
      case ABORT1:
      case ABORT2:
        status = HAL_BUSY;
        break;
      default:
        status = HAL_ERROR;
        break;
    }
    *p_data = char1;

    if (packet_size >= PACKET_SIZE )
    {
     status = HAL_UART_Receive(&UartHandle, &p_data[PACKET_NUMBER_INDEX], packet_size + PACKET_OVERHEAD_SIZE, timeout);//这里超时 收不到数据

      /* Simple packet sanity check */
      if (status == HAL_OK )
      {
        if (p_data[PACKET_NUMBER_INDEX] != ((p_data[PACKET_CNUMBER_INDEX]) ^ NEGATIVE_BYTE)) // 有问题了
        {
          packet_size = 0;
          status = HAL_ERROR;
        }
        else
        {
          /* Check packet CRC */
          crc = p_data[ packet_size + PACKET_DATA_INDEX ] << 8;
          crc += p_data[ packet_size + PACKET_DATA_INDEX + 1 ];
          if (HAL_CRC_Calculate(&CrcHandle, (uint32_t*)&p_data[PACKET_DATA_INDEX], packet_size) != crc )
          {
            packet_size = 0;
            status = HAL_ERROR;
          }
        }
      }
      else
      {
        packet_size = 0;
      }
    }
  }
  *p_length = packet_size;
  return status;
}

串口发送一帧数据下来  只能收到第一个字节  第二个HAL_UART_Receive就超时了     求解
byronsong 回答时间:2019-6-26 16:31:09
yimingliang2019 发表于 2019-6-26 15:06
你好 !你这样能调通? 如果有一个while超时 代码就会死循环啊。 static HAL_StatusTypeDef ReceivePacket( ...

波特率多少?数据位?校验?
byronsong 回答时间:2019-6-26 16:34:03
yimingliang2019 发表于 2019-6-26 15:06
你好 !你这样能调通? 如果有一个while超时 代码就会死循环啊。 static HAL_StatusTypeDef ReceivePacket( ...

huart3.Init.BaudRate = 115200;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.WordLength = UART_WORDLENGTH_9B;
huart3.Init.Parity = UART_PARITY_EVEN;
yimingliang2019 回答时间:2019-6-27 09:01:51
songshiqun2010 发表于 2019-6-26 16:31
波特率多少?数据位?校验?

我的是115200 8 N 1  我真的调不通  方便留个QQ吗
byronsong 回答时间:2019-6-27 10:12:24
yimingliang2019 发表于 2019-6-27 09:01
我的是115200 8 N 1  我真的调不通  方便留个QQ吗

改成 115200 9 even 1 啊。GD32f103 GD32F303 上验证过 OK.
frankmcu 回答时间:2020-6-12 10:39:48
yimingliang2019 发表于 2019-6-26 15:06
你好 !你这样能调通? 如果有一个while超时 代码就会死循环啊。 static HAL_StatusTypeDef ReceivePacket( ...

你解决没?我也遇到同样的问题。 怎么都查不出原因。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版