提问人:Sherbeen 提问时间:10/11/2023 最后编辑:pmacfarlaneSherbeen 更新时间:10/12/2023 访问量:59
发出命令后无法从 PuTTY 上的 NTC 热敏电阻读取连续值
Unable to read continuous values from NTC thermistors on PuTTY after giving commands
问:
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”时,温度值会停止。
`
答:
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 毫秒的超时。如果输入了一个字符,则对其进行处理,否则继续循环。
我将使用中断函数实现它:
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
评论
adc_value1 / 4095.0
(adc_value1 + possible fraction offset like 0.5) / 4096.0