STM32 单片机谷德GD60914系列红外温度芯片UART通讯参考例程分享
本文介绍了基于STM32 HAL库的UART通信实现方法,重点讲解了温度传感器数据传输的指令控制与解析流程。主要内容包括:UART初始化配置、发送指令函数编写、接收中断回调处理以及主程序逻辑设计。文中提供了完整的代码示例,涵盖硬件适配注意事项、数据解析方法和常见指令模式(如物温/额温/单次测量)。特别强调不同MCU平台在实现时的差异调整,以及实际应用中需注意的波特率匹配、数据格式处理等关键点。该方
以 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 指令控制与温度数据交互~
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)