yimingliang2019 发表于 2019-6-26 14:38:04

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

最近在做串口升级官方例程 有一段代码一帧数据分两次用HAL_UART_Receive接收 可是我这样调试 得不到数据 请教大神!

songshiqun2010 发表于 2019-6-26 14:50:22

一种基于HAL+UART+DMA环形队列接收数据实现方法

songshiqun2010 发表于 2019-6-26 14:52:58

void Get_ID_command_Function(uint8_t *PID)
{       
        uint8_t Number=0,temp;
        temp=Get_ID_command;
        temp=0xFF-Get_ID_command;
        while(HAL_UART_Transmit(&huartx,temp,2,TimeOUT_USART)!=HAL_OK){}
        while(HAL_UART_Receive(&huartx,&temp,1,TimeOUT_USART)!=HAL_OK){}
        switch(temp){
        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==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_size + PACKET_OVERHEAD_SIZE, timeout);//这里超时 收不到数据

      /* Simple packet sanity check */
      if (status == HAL_OK )
      {
      if (p_data != ((p_data) ^ 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_size) != crc )
          {
            packet_size = 0;
            status = HAL_ERROR;
          }
      }
      }
      else
      {
      packet_size = 0;
      }
    }
}
*p_length = packet_size;
return status;
}

串口发送一帧数据下来只能收到第一个字节第二个HAL_UART_Receive就超时了   求解

songshiqun2010 发表于 2019-6-26 16:31:09

yimingliang2019 发表于 2019-6-26 15:06
你好 !你这样能调通? 如果有一个while超时 代码就会死循环啊。 static HAL_StatusTypeDef ReceivePacket( ...

波特率多少?数据位?校验?

songshiqun2010 发表于 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吗

songshiqun2010 发表于 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( ...

你解决没?我也遇到同样的问题。 怎么都查不出原因。
页: [1]
查看完整版本: 一帧数据能分两次用HAL_UART_Receive接收吗