发出命令后无法从 PuTTY 上的 NTC 热敏电阻读取连续值

Unable to read continuous values from NTC thermistors on PuTTY after giving commands

提问人:Sherbeen 提问时间:10/11/2023 最后编辑:pmacfarlaneSherbeen 更新时间:10/12/2023 访问量:59

问:

while (1)
{

// User giving input
uint8_t input;
HAL_UART_Receive(&huart2, &input, sizeof(input), HAL_MAX_DELAY);  //receiving the command

//if (input=='1')
if (input=='1'&& system==0)
{
system=1;   //start measurement
HAL_UART_Transmit(&huart2, (uint8_t\*)"Temperature measurement started.\\r\\n", 35, HAL_MAX_DELAY);
}
//else if(input=='2')
else if(input=='2' && system==1)
{
system=0;  //stop measurement
HAL_UART_Transmit(&huart2, (uint8_t\*)"Temperature measurement stopped.\\r\\n", 35, HAL_MAX_DELAY);

//Turning off LED when measurement stops
HAL_GPIO_WritePin(GPIOA, GREEN_LED, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, RED_LED, GPIO_PIN_RESET);
}

//if(input=='1')
if(system==1)
{
float V_ref= 3.3;
char buffer\[100\];
// ADC Value from Channel 0 (First NTC)
ADC_Select_CH0();
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);

            adc_value1 = HAL_ADC_GetValue(&hadc1);  //Read ADC from Channel 0
            HAL_ADC_Stop(&hadc1);
    
            float voltage1= (adc_value1 / 4095.0)* V_ref;    // Convert ADC value to voltage
    
            resistance1 = (refResistance1*voltage1)/(V_ref - voltage1); //Voltage Divider Equation
            temperature_ntc1 = findTemp1(resistance1);   // Calculate temperature from resistance
    
             // ADC Value from Channel 1 (Second NTC)
             ADC_Select_CH1();
             HAL_ADC_Start(&hadc1);
             HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
             adc_value2 = HAL_ADC_GetValue(&hadc1); //Read ADC from Channel 1
             HAL_ADC_Stop(&hadc1);
    
             float voltage2= (adc_value2 / 4095.0)* V_ref;
             resistance2 = (refResistance2*voltage2)/(V_ref- voltage2);
             temperature_ntc2 = findTemp2(resistance2);
             // Check temperature differences and control the LED's
       if (fabs(temperature_ntc1 - temperature_ntc2)> 1.0)
       {
            //Temperature difference btw 2 NTC'S greater than 1 degree, RED LED should blink
            HAL_GPIO_WritePin(GPIOA, RED_LED, GPIO_PIN_SET);
            HAL_GPIO_WritePin(GPIOA, GREEN_LED, GPIO_PIN_RESET);
    
       }
       else
       {
            HAL_GPIO_WritePin(GPIOA, GREEN_LED, GPIO_PIN_SET);
            HAL_GPIO_WritePin(GPIOA, RED_LED, GPIO_PIN_RESET);
       }
    
           // Transmit the temperature values
           sprintf(buffer, "Temperature_NTC1: %.2f °C \r\n", temperature_ntc1);
           HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
           sprintf(buffer, "Temperature_NTC2: %.2f °C \r\n\r\n", temperature_ntc2);
           HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer), HAL_MAX_DELAY);
    
           // Updating the older temperature measurements
           oldtemp1 = temperature_ntc1;
           oldtemp2= temperature_ntc2;
     }
    
    /* USER CODE BEGIN 3 */

}
/\* USER CODE END 3 \*/
}

我正在尝试计算和读取两个 NTC 热敏电阻的值,目前通过 UART 将其发送到 PuTTY 控制台。我正在使用 STM32 核板。我想输入命令“1”以连续读取和显示 PuTTY 中的值,输入命令“2”以停止测量和读取。我的代码运行良好,并且在给出此输入 ==1 和 2 命令之前连续传输值。但是在此之后,PuTTY 仅在按下“1”时显示温度值,这意味着我需要按住“1”才能显示值,没有连续传输。这是我的代码中的问题,还是在存在标志条件时无法连续传输?我想确保我的硬件连接和引脚配置是正确的,因为该值在没有输入条件的情况下连续传输。

这是我的while循环在STM32 IDE中的样子。输出现在显示“温度测量已开始,并且仅在每次都按”1“时才显示 Temperature_NTC1 和 Temperature_NTC2 的值。如果不输入“1”,我就不会获得连续的温度。我想要的是,当我输入一次“1”时,温度值会连续播放,而当我输入“2”时,温度值会停止。

`

C STM32 腻子 串口 HAL

评论

0赞 chux - Reinstate Monica 10/12/2023
旁白:我怀疑应该是.adc_value1 / 4095.0(adc_value1 + possible fraction offset like 0.5) / 4096.0

答:

1赞 pmacfarlane 10/11/2023 #1

HAL_UART_Receive(..., HAL_MAX_DELAY);将永远阻止,直到输入字符。

最简单的解决方案是使用较小的超时值,并检查函数的返回值。像这样:

while (1)
{
    uint8_t input;

    if (HAL_UART_Receive(&huart2, &input, sizeof(input), 10) == HAL_OK)
    {
        // Process input
    }
    else
    {
        // Error or timeout - no input to process
    }

    // The rest of your code that reads and displays a value
}

这使用 10 毫秒的超时。如果输入了一个字符,则对其进行处理,否则继续循环。

2赞 Geisterfahrer 10/12/2023 #2

我将使用中断函数实现它:

HAL_UART_Receive_IT();

每次微控制器 (MCU) 通过 UART 接收数据时,都会调用中断功能。在与 UART 关联的回调函数中,您可以实现管理 UART 操作所需的代码。

不要忘记在源代码 stm32fXxx_it.c 中实现 UART 回调函数,此文件负责中断服务例程。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  HAL_UART_Receive_IT(huart, pData, Size);
}

通过利用这种方法,您可以确保系统在等待数据从 UART 接口到达时不会变得无响应。这使您的 MCU 能够有效地处理传入数据,而不会阻止执行。

您可以在此处获取更多信息: https://wiki.st.com/stm32mcu/wiki/Getting_started_with_UART#UART_with_Interrupt