以 STM32 单片机 为例,基于 HAL 库编写 UART 通讯参考例程,实现通过 UART 发送指令、解析温度数据逻辑(不同单片机 / 库函数使用方式有差异,需根据实际硬件环境调整):

一、头文件与宏定义

#include "stm32f1xx_hal.h" // 以 STM32F1 系列为例,根据实际 MCU 替换

#include <string.h>

#include <stdio.h>

// UART 句柄,需与 CubeMX 配置或手动初始化一致 UART_HandleTypeDef huart1;

// 指令宏定义

#define CMD_OBJECT_TEMP 0xAA // 物温模式

#define CMD_FOREHEAD_TEMP 0xAB // 额温模式

#define CMD_WRIST_TEMP 0xAC // 腕温模式

#define CMD_SINGLE_ON 0xA1 // 打开单次测量

#define CMD_SINGLE_OFF 0xA0 // 关闭单次测量

// 温度数据缓冲区与标志

uint8_t uart_rx_buf[10] = {0}; // 接收缓冲区,根据实际数据长度调整

uint8_t uart_tx_buf[1] = {0}; // 发送指令缓冲区

uint8_t rx_flag = 0; // 接收完成标志

二、UART 初始化(需确保硬件引脚、波特率MS型号 9600/FS型号 115200等配置正确)

CubeMX 配置后,初始化代码会自动生成,核心初始化逻辑示例(手动初始化可参考):

void UART_Init(void)

{

huart1.Instance = USART1;

huart1.Init.BaudRate = 9600;

huart1.Init.WordLength = UART_WORDLENGTH_8B;

huart1.Init.StopBits = UART_STOPBITS_1;

huart1.Init.Parity = UART_PARITY_NONE;

huart1.Init.Mode = UART_MODE_TX_RX;

huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

huart1.Init.OverSampling = UART_OVERSAMPLING_16;

HAL_UART_Init(&huart1);

// 开启接收中断(按需选择:查询/中断/DMA 方式)

HAL_UART_Receive_IT(&huart1, uart_rx_buf, sizeof(uart_rx_buf));

}

三、发送指令函数

// 发送单字节指令

void UART_SendCmd(uint8_t cmd)

{

  uart_tx_buf[0] = cmd;

  HAL_UART_Transmit(&huart1, uart_tx_buf, 1, 100); // 阻塞发送,超时 100ms

}

四、接收中断回调(处理温度数据解析,需根据实际数据格式完善)

// 中断回调函数,接收完成后触发

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

  if (huart->Instance == USART1)

   {

   rx_flag = 1; // 标记接收完成

// 简单解析温度数据(示例逻辑,需根据实际协议完善)

if (uart_rx_buf[0] == '+' || uart_rx_buf[0] == '-')

   {

   int32_t temp_val = 0;

   sscanf((char *)uart_rx_buf, "%d", &temp_val); // 读取数值

   float temp = temp_val / 100.0f; // 转换为小数(如 +000365 → 36.5℃)

   printf("解析温度:%.1f℃\r\n", temp);

   }

// 重新使能接收中断,等待下一次数据

HAL_UART_Receive_IT(&huart1, uart_rx_buf, sizeof(uart_rx_buf));

  }

}

五、主逻辑:指令控制与流程示例

int main(void)

{

 HAL_Init();

 UART_Init(); // 初始化 UART

// 1. 关闭单次测量(默认自动发送模式)

UART_SendCmd(CMD_SINGLE_OFF);

HAL_Delay(100); // 延时等待设备响应

// 2. 发送物温模式指令,自动持续输出温度

UART_SendCmd(CMD_OBJECT_TEMP);

HAL_Delay(1000); // 等待 1 秒,模拟业务逻辑,实际可循环处理数据

// 3. 打开单次测量模式

UART_SendCmd(CMD_SINGLE_ON);

HAL_Delay(100);

// 4. 单次测量:发指令后仅返回 1 次温度

UART_SendCmd(CMD_FOREHEAD_TEMP);

HAL_Delay(500); // 等待接收并解析温度

while (1)

  {

    if (rx_flag)

   {

     rx_flag = 0; // 清除标志

     // 可在此处扩展数据处理逻辑,如上传到上位机、控制外设等

    }

    HAL_Delay(100); // 主循环延时

  }

}

六、关键说明

  • 硬件适配:需确保 UART 引脚、波特率、校验位等与传感器 / 设备匹配,不同 MCU 初始化方式有差异(如 STM32 标准库、Arduino 库等)。
  • 数据解析:温度数据格式(如 +000365)需严格按照协议处理,可扩展 CRC 校验、多字节数据拼接逻辑。
  • 工程指令:生产校准指令(如 0xA9,0xA2...)一般在产线使用,需结合专用工具 / 流程调用,示例中未展开。

以上为STM 32参考,根据实际MCU 平台调整代码细节,即可实现 UART 指令控制与温度数据交互~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐