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

一帧数据能分两次用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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版