搜索
查看: 1305|回复: 8

[已解决] 一帧数据能分两次用HAL_UART_Receive接收吗

[复制链接]

该用户从未签到

1

主题

4

帖子

0

蝴蝶豆

新手上路

最后登录
2019-6-28
发表于 2019-6-26 14:38:04 | 显示全部楼层 |阅读模式
最近在做串口升级  官方例程 有一段代码  一帧数据分两次用HAL_UART_Receive接收 可是我这样调试 得不到数据 请教大神!
回复

使用道具 举报

该用户从未签到

37

主题

551

帖子

62

蝴蝶豆

金牌会员

最后登录
2024-3-30
发表于 2019-6-26 14:50:22 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

551

帖子

62

蝴蝶豆

金牌会员

最后登录
2024-3-30
发表于 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;
        }
}
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

4

帖子

0

蝴蝶豆

新手上路

最后登录
2019-6-28
 楼主| 发表于 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就超时了     求解
回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

551

帖子

62

蝴蝶豆

金牌会员

最后登录
2024-3-30
发表于 2019-6-26 16:31:09 | 显示全部楼层
yimingliang2019 发表于 2019-6-26 15:06
你好 !你这样能调通? 如果有一个while超时 代码就会死循环啊。 static HAL_StatusTypeDef ReceivePacket( ...

波特率多少?数据位?校验?
回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

551

帖子

62

蝴蝶豆

金牌会员

最后登录
2024-3-30
发表于 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;
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

4

帖子

0

蝴蝶豆

新手上路

最后登录
2019-6-28
 楼主| 发表于 2019-6-27 09:01:51 | 显示全部楼层
songshiqun2010 发表于 2019-6-26 16:31
波特率多少?数据位?校验?

我的是115200 8 N 1  我真的调不通  方便留个QQ吗
回复 支持 反对

使用道具 举报

该用户从未签到

37

主题

551

帖子

62

蝴蝶豆

金牌会员

最后登录
2024-3-30
发表于 2019-6-27 10:12:24 | 显示全部楼层
yimingliang2019 发表于 2019-6-27 09:01
我的是115200 8 N 1  我真的调不通  方便留个QQ吗

改成 115200 9 even 1 啊。GD32f103 GD32F303 上验证过 OK.
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

蝴蝶豆

新手上路

最后登录
2020-6-12
发表于 2020-6-12 10:39:48 | 显示全部楼层
yimingliang2019 发表于 2019-6-26 15:06
你好 !你这样能调通? 如果有一个while超时 代码就会死循环啊。 static HAL_StatusTypeDef ReceivePacket( ...

你解决没?我也遇到同样的问题。 怎么都查不出原因。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-20 21:40 , Processed in 1.167860 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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