拓冰建站拓冰建站
首页 / 资讯中心 / 正文

空调控制器通信协议全解析:从I2C到MQTT的实战指南

做空调控制器的嵌入式开发很容易遇到一个现象单板功能调试没问题传感器数据也能读到但联调时室内机、室外机、线控器和云端 APP 就是对不上。问题往往不在某一个芯片而在通信协议这一层没有打通。这次我们就把空调开发里最常见的通信链路完整梳理一遍从 MCU 和传感器之间的板级通信到室内外机、线控器之间的板间通信再到 Wi-Fi 模块和云平台之间的网络通信。每一层会用哪些协议帧格式怎么设计排查问题时先看哪里都会写清楚。文章适合正在做空调、热泵、新风、暖通控制器或者准备转家电嵌入式方向的同学。如果你已经会点灯、会读传感器但还不清楚 I2C、UART、RS485、Modbus、MQTT 这些协议在真实项目里如何组合使用这篇文章可以收藏备用。1. 空调通信协议全景与核心能力速览空调控制器不是单一 MCU 就能完成的设备。通常一个系统里会包含主控板、室内风机驱动、室外压缩机变频驱动、温度传感器、湿度传感器、显示面板、线控器、Wi-Fi 模块等多个节点。这些节点之间的通信需求不同所以不会只用一种协议完成所有数据传输。一个空调项目的通信能力需要从下到上分层理解。通信层级常见协议/总线传输介质典型用途调试重点板级通信I2C、SPI、UART、单总线PCB 走线MCU 读取温湿度传感器、EEPROM、Flash、触控芯片时序、上拉电阻、地址冲突、波特率板间通信UART、RS485、Modbus、CAN、私有总线排线、双绞线室内外机通信、线控器通信帧格式、CRC、总线竞争、抗干扰端侧网络Wi-Fi、BLE、红外空口配网、APP 控制、遥控信号强度、断线重连、配网流程云端通信MQTT、HTTP/HTTPS、TLS以太网/4G/Wi-Fi设备上报、远程控制、OTA 升级主题设计、心跳、证书、消息幂等应用层协议JSON、Protobuf、私有二进制基于上面任意传输层设备影子、控制指令、告警上报字段兼容、版本管理、超时重试从这张表能看出想独立负责一个空调项目至少需要掌握板级总线和网络通信协议两层内容。板级解决“MCU 能不能正确读到外设数据”网络层解决“设备能不能把状态稳定上报到云平台”。这里先提醒一句空调强电部分涉及压缩机、PFC 电路、高压母线调试通信时不要带电插拔通信线也不要只拿万用表去戳强电区域。协议测试尽量在隔离电源和独立工装上进行。2. 空调项目的通信边界板级、板间与云端很多新手拿到原理图后习惯直接找代码但更建议先画通信拓扑图。拓扑图不复杂它决定了你写的驱动、协议解析、状态上报分别要放在哪一层。一个典型的分体式空调通信结构如下室内主控板面对用户负责读取室温、管温、显示、接收遥控和线控器指令再通过室内外通信线把压缩机频率、风机转速、四通阀状态发给室外机。室外主控板面对强电驱动负责压缩机变频驱动、室外风机、温度采样、过压过流保护并把运行状态回传给室内机。如果设备需要接入 APP室内主控板会通过 UART 或 SPI 接一个 Wi-Fi 模块模块再走 MQTT 上报云平台。商用空调或多联机系统里还有网关、集控器和楼宇自控系统协议会更多常见是 Modbus、BACnet、私有 TCP 协议等。从功能上划分板级通信是“MCU 和芯片之间的会话”板间通信是“主控板之间的互信对话”云端通信是“设备与平台之间的双向消息”。调试时如果先明确了当前查的是哪一层定位问题的范围会小很多。最常见的定位错误是云端没收到数据就认为是 Wi-Fi 模块坏了。实际可能是 MCU 没有通过 UART 把数据给到模块也可能 MCU 给了数据但协议格式错误。所以每一层的日志和抓包手段在做项目初期就应该准备好。3. 板级通信MCU 与传感器、驱动芯片怎么传数据3.1 I2C温湿度传感器、EEPROM 与地址冲突排查空调主控板上相当一部分传感器是 I2C 接口比如有些温度传感器、气压/湿度传感器、电表计量芯片、EEPROM。I2C 只有两根线SCL 时钟线和 SDA 数据线属于半双工同步通信。写 I2C 驱动时要确认三点总线速率、设备地址、寄存器地址。同一个 I2C 总线上如果挂了多个设备每个设备地址不能冲突。排查时可以先扫描总线地址确认设备是否在线。下面是一个用 Linux 用户态工具读取 I2C 设备的通用步骤实际工程里如果 MCU 不带操作系统则需要按芯片手册操作寄存器。# 安装 i2c-tools用于排查设备地址和寄存器 sudo apt-get install -y i2c-tools # 查看当前 I2C 总线编号 ls /dev/i2c-* # 扫描总线上挂载的设备地址0x48 这类地址是扫描结果举例 sudo i2cdetect -y 1在裸机或 RTOS 环境里I2C 读取通常遵循“起始信号 设备地址 寄存器地址 重复起始 读数据”的流程。MCU 侧的注意点包括SCL 高电平期间 SDA 不能变化、每次读取后要发 ACK/NACK、通信完成后释放总线。// 示意I2C 读多个字节lgic 需根据具体芯片适配 // reg_addr 为设备内部寄存器地址buf 为接收缓存 int i2c_read_reg(uint8_t dev_addr, uint8_t reg_addr, uint8_t *buf, uint16_t len) { i2c_start(); if (i2c_write_byte(dev_addr 1 | 0) ! 0) { i2c_stop(); return -1; } if (i2c_write_byte(reg_addr) ! 0) { i2c_stop(); return -1; } i2c_start(); i2c_write_byte(dev_addr 1 | 1); for (uint16_t i 0; i len; i) { buf[i] i2c_read_byte(i (len - 1) ? 0 : 1); } i2c_stop(); return 0; }实际项目中I2C 数据异常最常见的原因是上拉电阻阻值不合适或 SCL/SDA 接反。环境温度传感器如果读数跳变优先查电源纹波和焊接而不是立刻怀疑协议写错。3.2 SPIFlash 存储、显示驱动与高速外设SPI 在空调板上的使用场景通常是外挂 Flash 存运行日志或出厂参数、触控显示模组、部分 ADC 芯片。SPI 有 SCK、MOSI、MISO、CS 四根线速度比 I2C 快适合数据量较大的场景。SPI 调试时要先确认时钟极性 CPOL、时钟相位 CPHA 和片选极性。这几项如果和从机不匹配读回来的数据会错位有时表现为“第一个字节丢了”或“整包数据全是 0xFF”。空调主控板上使用 SPI Flash 时还需要考虑写寿命和掉电保护。比如运行参数不能频繁写 Flash否则可能磨损存储介质。别等到产品出货后才发现参数丢失在系统设计阶段就要规划好“哪些数据放 RAM、哪些数据放 Flash、多久写一次、写失败后怎么降级”。// 示意SPI 读 Flash ID确认 SPI 时序是否正常 uint8_t spi_flash_read_id(void) { uint8_t cmd 0x9F; uint8_t id 0; spi_cs_low(); spi_write_read(cmd, 1); spi_write_read(id, 1); // 实际上应读 3 字节此处仅示意 spi_cs_high(); return id; }如果 MCU 自带硬件 SPI优先用硬件 SPI 而不是 GPIO 模拟。硬件 SPI 有波特率分频、FIFO、DMA 等机制在高负载通信下更稳定。非要在资源紧张的 8 位 MCU 上模拟 SPI建议把时钟频率降下来避免信号完整性问题。3.3 UART调试日志、传感器与 Wi-Fi 模块的通用接口UART 是空调开发里最万能的接口。MCU 的调试串口用 UART很多传感器模组用 UARTWi-Fi 模块和 MCU 之间也常用 UART。UART 是异步串行通信需要收发双方约定波特率、数据位、停止位、校验位。工程上收到的 UART 数据是字节流没有起始帧和结束帧的概念。为了让接收端知道一帧从哪里开始到哪里结束通常会定义帧头、长度、命令字、数据和校验。// 示意UART 接收状态机按“帧头长度数据CRC”解析 #define FRAME_HEAD1 0xAA #define FRAME_HEAD2 0x55 typedef enum { WAIT_HEAD1, WAIT_HEAD2, WAIT_LEN, WAIT_DATA, WAIT_CRC } uart_rx_state_t; uint8_t rx_buf[128]; uint16_t rx_len 0; uint16_t rx_index 0; void uart_rx_byte(uint8_t byte) { static uart_rx_state_t state WAIT_HEAD1; switch (state) { case WAIT_HEAD1: if (byte FRAME_HEAD1) state WAIT_HEAD2; break; case WAIT_HEAD2: if (byte FRAME_HEAD2) { state WAIT_LEN; } else { state WAIT_HEAD1; } break; case WAIT_LEN: rx_len byte; rx_index 0; state (rx_len 0) ? WAIT_DATA : WAIT_CRC; break; case WAIT_DATA: if (rx_index sizeof(rx_buf)) { rx_buf[rx_index] byte; } if (rx_index rx_len) state WAIT_CRC; break; case WAIT_CRC: // 比较校验值这里仅保留状态转移逻辑 state WAIT_HEAD1; break; } }调试 UART 时不要只看数据“有没有”还要看数据“对不对”。经常有人把 TX 和 RX 接反或者共地没接好导致数据乱码。先用串口助手自发自收确认板子 USB 转串口链路正常再接外部设备。3.4 单总线与 I/O 模拟低成本传感器的选择空调开发中还会遇到 DHT11/DS18B20 这类单总线传感器或者用普通 GPIO 模拟时序读取数据。单总线的特点是线少、成本低但时序要求严格通信速率不高。DHT11 这类传感器常用于低成本环境检测方案。如果产品对温度精度要求高建议直接选用 I2C 或模拟量输出的高精度传感器DHT11 更适合做“有没有大概温度”的粗略检测而不是精确控温依据。单总线调试时最容易遇到的问题有两个一是 GPIO 模式切换顺序不对从输出模式切换到输入模式后没有延时二是主机时序中断优先级被打断导致读取超时。// 示意单总线复位脉冲不同传感器时序不同 int onewire_reset(void) { gpio_set_mode(PIN, OUTPUT); gpio_write(PIN, 0); delay_us(480); // 拉低 480us 左右 gpio_write(PIN, 1); gpio_set_mode(PIN, INPUT); delay_us(70); uint8_t presence gpio_read(PIN); // 读取存在脉冲 delay_us(410); return presence 0 ? 0 : -1; }如果你在写空调的控温逻辑更建议把传感器层抽象成接口。这样换传感器型号时不需要改 PID 或逻辑层代码只替换底层驱动即可。4. 板间通信室内外机、线控器与主控之间怎么约定帧格式4.1 RS485、Modbus 与抗干扰设计空调室内外机之间距离可能超过十几米环境里还有压缩机、风机带来的强电磁干扰所以不能简单用 TTL 电平的 UART 直接长距离传输通常会用 RS485 或 CAN。RS485 是差分传输抗共模干扰能力强支持多点组网。很多空调线控器、集控器采用 RS485 总线协议层则使用 Modbus RTU 或空调厂商的私有协议。Modbus RTU 的帧结构相对固定地址码、功能码、数据区、CRC 校验。地址码决定这次通信是发给哪个从机功能码决定是读寄存器还是写寄存器。终端电阻和屏蔽层接地会影响通信质量总线末端不匹配时会出现数据偶发错误。// 示意Modbus RTU CRC16 计算 uint16_t modbus_crc16(const uint8_t *data, uint16_t len) { uint16_t crc 0xFFFF; for (uint16_t i 0; i len; i) { crc ^ data[i]; for (uint8_t j 0; j 8; j) { if (crc 0x0001) { crc (crc 1) ^ 0xA001; } else { crc crc 1; } } } return crc; }写板间通信程序时主机和从机的状态机要分开设计。主机负责扫描、超时重试、切换从机地址从机不能长时间占用总线也不能在主查询之外主动抢占总线否则会造成总线冲突。4.2 CAN 总线在多联机与商用空调中的应用多联机系统、商用空调的节点更多UART 加 RS485 有时并不够用。CAN 总线有仲裁机制多节点竞争总线时不会像 RS485 一样出现双方同时发送导致乱码。CAN 的报文有 ID 优先级适合做报警和实时控制混合传输。空调项目里使用 CAN工作重点不是“把 CAN 寄存器配通”而是通信矩阵的定义。哪个报文 ID 表示压缩机频率、哪个 ID 表示故障代码、信号在报文里的起始位和长度是多少这些必须提前设计完否则各个控制器联调时会非常痛苦。CAN 调试时要关注总线波特率是否一致终端电阻是否正确。系统只有两个节点时如果两端都没有加 120 欧姆终端电阻通信会不稳定。4.3 压缩机与风机的模拟量/PWM 控制通信不只有数字总线这一种形式。空调主控给压缩机驱动器、风机驱动器下发目标转速常用的是 PWM 占空比或 0-10V 模拟量信号。PWM 信号看起来简单但它本质也是一种通信因为接收端要从占空比里解析出你表达的百分比。PWM 调试时重点关注频率和占空比精度。如果 PWM 频率选得不合适驱动器会产生噪声甚至电流波形畸变。模拟量控制则需要关注地线压差两端地电位不一致会导致给定转速偏大或偏小。这类信号的调试建议用示波器看实际波形不要只在代码里打印占空比。代码算出的 50% 和引脚实际输出的 50% 在硬件链路异常时不一定相等。5. 端侧网络通信Wi-Fi、BLE 与断线重连5.1 Wi-Fi 模块与 MCU 的常见交互方式空调接入 APP通常不是让 MCU 直接跑完整 TCP/IP 协议栈而是在主控板上增加一个 Wi-Fi 模块。模块负责 Wi-Fi 连接、TCP 或 TLS 通信MCU 通过 UART/SPI 与模块交换数据。这种架构下MCU 并不需要理解太复杂的网络状态机只需要通过 AT 指令或厂商封装库让模块联网。模块返回的数据里包含连接状态、信号强度、收到的云端消息。MCU 要做的是把控制命令解析出来并执行把状态打包后通过模块发出去。如果使用 AT 指令框架通常流程是这样的初始化串口、查询模块版本、设置 Wi-Fi 账号密码、连接云平台、建立双向数据通道。# 示意指令流程不同模组指令集不同以厂商手册为准 AT ATE0 ATCWMODE1 ATCWJAPyour_ssid,your_password # 连接 MQTT/TCP 地址 ATMQTTCONNyour_broker_host,1883,1 # 发布消息 ATMQTTPUBdevice/status,online,1,0MCU 与 Wi-Fi 模块的串口波特率建议先保守一点比如 9600 或 115200。波特率太高而模块端缓冲不够时长数据包会丢字节。另外MCU 给模块发长数据前需要等待模块返回“可以接收”的信号不能一上来就连续写几 KB。5.2 断线重连与状态上报策略空调设备不像手机用户不会每天都重启。Wi-Fi 信号不稳定、路由器重启、云端服务器切换都可能导致模块断线。断线后必须能自动恢复。断线重连策略要分层次处理先恢复 Wi-Fi 连接再恢复 MQTT 或 TCP 连接最后重新订阅主题。只重连某种连接会导致状态不一致比如 Wi-Fi 已连上但 MQTT 没恢复以为自己在线的设备实际接收不到指令。从工程角度看建议做以下边界处理模块周期性查询连接状态而不是只在发包失败时才确认掉线。重连使用指数退避最短间隔 1 秒最长间隔 5 分钟避免网络抖动时反复重连。MCU 重新连上云平台后要主动上报一次当前完整状态而不是等用户查询。控制指令响应要有超时和补发策略避免“按了关机但实际没关掉”。这里特别提醒空调是强电设备远程控制类指令必须在本地控制器有最终保护逻辑。不能依赖云端下发速度来决定压缩机是否停机安全保护必须跑在本地。5.3 BLE 配网与红外遥控的取舍空调产品常把 BLE 用于配网、近距离调试或者与遥控器联动。BLE 的优点是手机不需要连到同一个 Wi-Fi可以先通过蓝牙把 Wi-Fi SSID 和密码发给设备再由设备去连接路由器。红外遥控仍然是空调的标配。红外遥控是单向通信主机无法知道遥控器是否真的收到信号所以会通过连续的重复码来降低丢码概率。调试红外时需要用逻辑分析仪或示波器抓波形常见问题是载波频率不对、引导码时间和接收端不匹配。从协议分层看红外码虽然简单但必须在应用层定义“开机、关机、模式、温度、风速”等状态位。不同厂商的码表可能完全不同产品开发时要考虑兼容已有遥控器还是只支持自家遥控器。6. 云端接入MQTT、HTTP/HTTPS 与 OTA6.1 为什么空调云接入优先用 MQTT空调状态上报不是一次性的而是持续的。设备需要把室温、设定温度、运行模式、功耗、故障码周期性告诉云端云端也要随时下发控制指令。MQTT 是发布订阅模型非常适合这种双向、低频、可变数据量的通信。设备端作为 MQTT 客户端连接云平台 Broker。上报数据发到一个 Topic接收控制命令订阅另一个 Topic。云端或 APP 端通过 Topic 区分不同设备、不同消息类型。这个模型比每个设备建立一条 TCP 长连接更好管理也容易做设备分组。MQTT 还有一个特性是遗嘱消息。设备非正常断开时可以遗嘱通知云端让云端把设备状态标记为离线。设备主动发送遗嘱不一定能清掉需要平台侧配合使用。6.2 发布订阅示例与消息结构设计下面给出一段用 Python 模拟 MQTT 客户端上报状态的示例。实际设备端更多是 C 语言 SDK但消息模型相同。示例中的 broker 地址、用户名和密码需要替换为实际平台参数。import paho.mqtt.client as mqtt import json import time broker_host your-cloud-broker.example.com broker_port 8883 client_id ac_unit_demo_001 username device_account password device_secret def on_connect(client, userdata, flags, rc): print(connect result:, rc) # 订阅云端下发给设备的控制主题 client.subscribe(f/devices/{client_id}/commands) def on_message(client, userdata, msg): print(recv command:, msg.topic, msg.payload.decode()) client mqtt.Client(client_idclient_id, protocolmqtt.MQTTv311) client.username_pw_set(username, password) client.tls_set() # 如果平台要求 TLS client.on_connect on_connect client.on_message on_message client.connect(broker_host, broker_port, keepalive60) client.loop_start() report { ts: int(time.time()), power: 1, mode: 2, set_temp: 26.0, room_temp: 28.1, fault_code: 0 } # 设备状态上报 client.publish(f/devices/{client_id}/status, json.dumps(report), qos1) while True: time.sleep(1)消息结构不建议直接用厂家私有二进制上报到云端后再解析。云端排障时JSON 或 Protobuf 的可读性比二进制好很多。如果设备资源紧张也可以在设备端保持二进制协议由网关或边缘端转换成 JSON只是会增加链路复杂度。MQTT 的 QoS 不是越高越好。QoS 0 可能丢消息QoS 2 握手流程长设备端资源消耗大。大多数空调控制场景使用 QoS 1 可以在不丢失消息和实现复杂性之间取得平衡。具体还要看平台支持能力。6.3 HTTP/HTTPS 与设备证书、OTA 升级智能空调除了常连接还有一类低频接口通过 HTTP/HTTPS 完成设备激活、获取时间、下载 OTA 升级包、上传日志等。这类请求不需要保持长连接设备主动发起云端返回响应。空调 OTA 升级要格外谨慎。一次升级包如果损坏或中途断电可能导致整机无法运行。工程上建议多区备份至少保留一个可回退的固件区域。升级包下载完成后要校验长度、CRC 或签名校验不通过不能跳转执行。涉及设备身份认证时不建议在固件里硬编码全局通用密钥。每个设备使用独立证书或一机一密的密钥体系密钥存储在安全区域。如果所有设备共用一把密钥一旦固件被提取整个产品线都有安全风险。7. 通信协议设计与工程约束7.1 协议帧设计的模板写通信协议之前先确定要传哪些数据运行状态、控制指令、故障告警、版本信息、OTA 分包。不要一开始就写一个大而全的帧而是先用最简单的扩展方式设计。一个通用的二进制帧可以包含以下字段字段长度说明帧头2 字节固定为 0xAA 0x55用于同步版本1 字节协议版本便于扩展命令字1 字节标识数据用途数据长度2 字节数据区字节数数据区N 字节具体业务字段校验2 字节CRC16 或校验和设备端收到一帧后先找帧头再校验长度最后算 CRC。校验失败的数据帧直接丢弃不能进入业务处理否则空调可能执行到错误指令。7.2 版本兼容与字段扩展空调产品的生命周期很长现场可能同时存在老版本和新版本的主控板。云端下发控制命令时不能假设所有设备都支持相同协议字段。版本扩展的原则是向后兼容增加字段时不要把旧字段语义改掉接收端不认识新命令字时返回“不支持”而不是直接丢弃处理未知字段时跳过长度不能因此导致整包解析失败。协议文档需要明确每个字段的默认值、单位、变化范围。比如设定温度统一使用摄氏度还是 0.1 摄氏度初始化值为多少上下限是多少。调试时很多“设备自动关机”的问题都源于协议解析时把保留字段当成了有效数据。7.3 数据日志与现场问题复现不管通信协议设计得多完善现场问题仍然会发生。协议里最好增加运行日志字段主控板周期性保存最近一次故障码、最近几条通信错误记录。这样售后拿到设备后能快速判断是通信问题、电源问题还是执行机构问题。日志不要只记录十六进制字节流还要记录解析后的业务值。否则拿到日志后还要手动对照协议文档定位效率很低。8. 通信开发调试与验证流程做空调通信开发不建议直接拿整机联调。更稳妥的顺序是工装验证、单板验证、双板联调、整机联调。每步都要有明确的观测手段。8.1 工具准备工具用途USB 转 TTL 串口查看 MCU 日志、连接 Wi-Fi 模块USB 转 RS485调试室内外机、线控器通信逻辑分析仪抓取 I2C、SPI、UART、单总线时序示波器观察 PWM、模拟量、电源纹波万用表检查供电、通断、接线MQTT 调试客户端订阅设备 Topic验证云端消息空调项目里逻辑分析仪的使用频率可能比示波器还高。定位 I2C 无响应、SPI 数据错位、红外码抓取逻辑分析仪能快速看到总线上具体波形。8.2 分层验证顺序先验证板级通信读到的传感器温度合理、Flash 能正常读写、触摸按键没有误触发。这一步通过后再做板间通信室内机能够把模式、温度、风速发给室外机室外机能回传压缩机状态。再做 Wi-Fi 模块确认模块能连上网、能和 MQTT 服务器建立连接、MCU 通过串口发的 JSON 数据能到达云端。最后做云端闭环远端 APP 或云平台下发一条“设置制冷 26 度”指令查看空调执行后状态是否回传一致。这个闭环不通过可能是命令字、字段单位、Topic 或 QoS 任一环节出错。8.3 模拟器与自动化回归如果有网关或线控器开发阶段可以制作一个“模拟室外机”或“模拟室内机”的工具。模拟器用上位机软件按照协议发送固定帧验证主控板是否正确响应。这样不需要反复拆装整机效率更高。批量测试在空调项目里也有意义。同一协议固件要跑多个设备观察是否有数据冲突、总线占用异常、状态上报乱序等问题。可以在上位机里同时连接多个串口或 MQTT 设备记录每个设备的响应时间和异常帧数。9. 空调通信常见问题与排查方法以下按工程经验整理了一些典型问题排查时先根据现象缩小到具体协议层。问题现象可能原因排查方式解决方案I2C 读不到传感器数据设备地址不对、上拉缺失、SCL/SDA 接反i2cdetect 扫描或逻辑分析仪看波形核对原理图、补上拉电阻或调整引脚SPI 读回数据全为 0xFFCPOL/CPHA 不匹配、CS 时序错误示波器抓取 SCK、MOSI、CS 波形调整 SPI 模式、确认从机手册UART 输出乱码波特率不一致、TX/RX 接反、缺共地串口助手自发自收统一波特率、接好共地RS485 偶发通信失败终端电阻缺失、总线干扰观察错误帧统计加终端电阻、检查屏蔽层接地室内外机偶发断连通信帧没有应答和重试机制抓取主机发出的帧序列增加超时重传Wi-Fi 模块连不上网SSID/密码错误、路由器 5G 频段通过 AT 指令查询连接状态使用 2.4G 或调整模块配置MQTT 频繁掉线心跳间隔不匹配、网络不稳定查看 MQTT 回连日志调大 keepalive、指数退避重连云端下发不生效Topic 错误、payload 字段名不一致MQTT 客户端订阅 topic 抓包对照协议文档修复发布订阅关系设备离线但界面显示在线遗嘱消息未设置强制断网观察云端状态设置遗嘱消息、平台侧做心跳检测固件升级后无法启动升级包写错地址或校验失败查看 bootloader 日志使用双分区、增加升级包签名校验排查通信问题时一次只改一个变量。不要同时调整波特率、换模块、改地址否则很难判断是哪一步修复了问题。每次修改后保留日志便于对比。10. 安全边界与工程规范空调通信不能只考虑“能通”还要考虑“安全”。如果产品支持远程控制断线、误操作、云端数据异常都必须被本地逻辑兜底。压缩机启动有最小延时限制、风机调速有最大电流限制通信层无论如何也不能绕过这些保护。开发过程涉及用户数据时注意收集范围最小化不采集与空调功能无关的数据。固件中的设备证书、密钥、用户 Token 要妥善保护不能把生产环境的密钥提交到代码仓库里。这里也再次强调空调开发会接触市电和高压驱动电路。实验时必须加隔离变压器、使用隔离探头或工装不要热插拔通信插头不要徒手触摸功率部分。代码调试可以大胆但硬件操作必须按照安全规范进行。11. 做空调项目时的最佳实践建议如果把前面内容压缩成可执行的开发顺序可以按下面这样做先画通信拓扑图标出每个节点用什么接口波特率或频率是多少帧格式大致是什么。这块不画清楚后续联调会很累。再定协议文档至少包含命令列表、字段类型、取值范围、错误码。协议文档要在编码前评审一次避免后期大量改动。编码时把每个通信外设封装成独立模块I2C、SPI、UART、RS485、MQTT 分别提供初始化、发送、接收、解析接口。业务逻辑不要直接操作寄存器否则以后换 MCU 或换模块时工程会非常脆弱。调试阶段准备一个上位机或脚本工具能快速模拟各种通信帧。不要只在整机上靠按键去触发指令那样无法覆盖边界场景。比如超时重发、断电恢复、多次重连这些情况用脚本模拟比手工触发更高效。第一批功能跑通后再做异常注入测试通信线断开、总线短路、从机不响应、云端服务器不可达、升级中断。空调类产品对可靠性要求很高这些异常才决定产品在真实环境里是否稳定。最终你会发现协议本身不难难的是多个处理器、多个总线、多套协议栈协同工作时的一致性和异常处理。把通信架构和协议边界想清楚再开始写驱动很多坑可以在设计阶段就避开。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门