基于stm32自动检测控制

在合并模块代码的过程中串口无法正常通信,代码编译烧录一切正常,模块不能正常工作

#stm32f103c8t6 #spg30 #ds18b20 #sg90


int main(void)
{
  /* USER CODE BEGIN 1 */
  short temperature;
    uint16_t TVOC = 0, CO2 = 0;
    uint8_t ID[6]={0};
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM3_Init();
  MX_TIM4_Init();
  MX_I2C2_Init();
  /* USER CODE BEGIN 2 */
  while(DS18B20_Init())
    {
//      printf("DS18B20 checked failed!!!\r\n");
      HAL_Delay(500);
  }
    while(sgp30_init() < 0)
  {
        printf(" sgp30 init fail\r\n");
        HAL_Delay(1000);
  }
    if(sgp30_get_serial_id(ID) < 0)
    {
        printf(" sgp30 read serial id failed\r\n");
    }else
    {
        printf(" sgp30 read serial id is:");
        for(int i = 0; i < 6; i++)  printf("%02X", ID[i]);
        printf("\r\n");
    }
    
    do
    {
        if(sgp30_read(&CO2, &TVOC) < 0)
        {
            printf("\r\n spg30 read failed");
        }else
        {
            printf(".");
        }
        HAL_Delay(500);
    }while(TVOC == 0 && CO2 == 400);
        
//    printf("DS18B20 checked success!!!\r\n");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    if(sgp30_read(&CO2, &TVOC) < 0)
        {
                printf(" sgp30 read fail\r\n");
        }
        else
        {
                printf(" CO2:%5dppm        TVOC:%5dppb\r\n", CO2, TVOC);
        }
        if(CO2>10)
        {
          Set_SG90_angle(&htim3,TIM_CHANNEL_1,1,20000,20);
        }
        
        
        temperature = DS18B20_Get_Temp();
        if(temperature < 0)
            printf("????? -%d ?\r\n",temperature/10);
        else
            printf("????? %d ?\r\n",temperature/10);
        if(temperature>10)
        {
          Set_SG90_angle(&htim3,TIM_CHANNEL_2,1,20000,20);
        }

  }
  /* USER CODE END 3 */
}

模块的初始化全部使用的while循环做的判断。如果有一个模块初始化失败,则会一直循环等待,自然就不会有串口打印了。
如下所示:

while(DS18B20_Init())
    {
//      printf("DS18B20 checked failed!!!\r\n");
      HAL_Delay(500);
  }

按以下修改下,先测试确定是卡死在哪个函数处。

printf("1----\r\n",);
 while(DS18B20_Init())
    {
//      printf("DS18B20 checked failed!!!\r\n");
      HAL_Delay(500);
  }
printf("2----\r\n",);
    while(sgp30_init() < 0)
  {
        printf(" sgp30 init fail\r\n");
        HAL_Delay(1000);
  }
printf("3----\r\n",);
    if(sgp30_get_serial_id(ID) < 0)
    {
        printf(" sgp30 read serial id failed\r\n");
    }else
    {
        printf(" sgp30 read serial id is:");
        for(int i = 0; i < 6; i++)  printf("%02X", ID[i]);
        printf("\r\n");
    }
    printf("4----\r\n",);
    do
    {
        if(sgp30_read(&CO2, &TVOC) < 0)
        {
            printf("\r\n spg30 read failed");
        }else
        {
            printf(".");
        }
        HAL_Delay(500);
    }while(TVOC == 0 && CO2 == 400);

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^