尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

空调嵌入式通信协议地图:从I2C/SPI到RS485/CAN与MQTT

空调嵌入式通信协议地图:从I2C/SPI到RS485/CAN与MQTT 空调嵌入式开发中真正容易把人卡住的往往不是某个寄存器也不是单个外设的驱动而是“信号到底该走哪一条路”。一块主控板上温度采集可能走I2C显示或存储可能走SPI无线模组与主控之间经常是UART到了室内机与室外机之间又可能是RS485或CAN总线最后数据要上云、要让手机App能控制又得换成MQTT。很多新手习惯于在开发板的例程里把每个驱动跑通一旦把所有模块装回真正的空调整机就开始出现各种“时好时坏”的问题却又不知道该怀疑哪一段链路。如果要把这类问题讲透就不能只盯着某一个通信协议看。空调开发所需要的是一张从板级到云端的嵌入通信协议分层地图同时知道每一层为什么存在、有哪些约束、会出现哪些典型故障以及用什么顺序排查。这篇文章会从真实产品的角度把这整条链路拆开来讲。1. 空调开发要懂的不只是一个协议而是一张协议地图1.1 从主控板到云平台的每一跳通信手段都不一样空调从外观上看起来像一个整机但内部实际上是一个分布式系统甚至在物理上被分成室内机和室外机两部分。主控板上要连接的不只是按键、显示、蜂鸣器这些简单部件还有温度传感器、EEPROM、风机驱动、压缩机驱动、电子膨胀阀、四通阀、线控器、无线模组等。更关键的是这些部件并不都放在同一块PCB上也不会都用同一种接口接在主控MCU旁边。传感器和存储芯片可能就在MCU附近距离只有几厘米室内外机之间却可能隔着几米甚至几十米的铜管和线束用户手里的遥控器则既不接电线也不使用MCU里的UART或I2C而是通过红外载波进行无线传输手机App更远数据要先经过家里Wi-Fi、路由器、云服务器最后再转回到用户界面。可以看出整机内不同部件之间的物理距离差别很大通信的带宽、实时性、成本和抗干扰要求也完全不同。没有一种通信协议能同时满足所有场景。I2C便宜、线少、适合板内设备但传输距离短不适合跨机箱Wi-Fi无线能力很强却不适合在室外机和室内机之间做固定控制链路因为成本和可靠性都不划算。所以实际的产品里必定是一层一层地选择合适的协议让整个系统最终协作起来。1.2 分层不是学术问题而是一种调试和取舍的框架理解了“空调通信是多层结构”之后我们先建立一个粗略的地理坐标第一段是板级通信主控MCU与板上EEPROM、传感器、触摸面板、显示Flash之间的通信常见是I2C、SPI、UART通常在一块PCB内部或短排线下完成。第二段是设备内部通信室内机与室外机、主控板与线控器、内机与其他功能模块之间的通信常见是UART直连、RS485或CAN总线距离从几十厘米到几十米。第三段是用户近场入口红外遥控器、蓝牙配网模块它们负责用户与设备之间建立控制或配置通道。第四段是联网与云端通信Wi-Fi模组、以太网、MQTT、HTTP这类IP网络协议让设备与云平台、手机App之间交换业务数据。过去很多工程调试之所以低效是因为没有把地图画清楚。出现问题时只会在当前层反复重启或者反复打印日志却没有意识到问题可能已经跨了好几个协议区段。比如App下发了一条规定“切换到制冷26摄氏度”这个指令要拆分到很多环节模组收到MQTT消息、UART传给主控、主控再通过RS485或CAN发给室外机、室外机驱动压缩机调速这中间任何一跳出问题设备都不会按要求动作。而分层地看问题最大的价值不在于显得“架构专业”而在于让调试人员能按边界切分。每两个协议层之间总有一个明确的接口、报文或状态变化可以作为排查断点。2. 板级通信先把几厘米内的 I2C、SPI、UART 理顺2.1 常用总线不是“谁强用谁”而是距离、速度、线数和成本之间的权衡在空调主控板上最常见到的板级通信协议通常是I2C、SPI和UART有时还会看到单总线之类的专用接口。它们看起来都是“通信”但在设计上有很明显的差别选型逻辑也不一样。I2C使用两根信号线一根时钟线SCL、一根数据线SDA设备通过地址来判断消息是不是发给自己的。温度采集、EEPROM、触摸按键这类对速度要求不高、节点数量又有限的设备用I2C通常很合适。硬件上两根线就能完成多设备通信给PCB布局省下不少路径但需要注意上拉电阻、走线长度和地址冲突。如果同一个I2C总线上挂了两个相同地址的设备访问就会错乱这在产品里并不少见。SPI通常是四根线起步包含片选、时钟、主发从收、从发主收等信号。它的特点是速度快、全双工适合显示控制器、外部Flash、需要连续读写大量数据的设备。代价是信号线多占用的GPIO多而且片选管理要谨慎一旦软件没有把对应的片选引脚拉对主控在跟错误的设备说话整个系统可能表现出非常奇怪的随机行为。UART则是异步串行通信点对点一根发送、一根接收通信双方需要约定波特率、停止位和校验位。UART在板内更多被用于无线模组与主控之间的数据管道也常被引出作为调试串口。板级用的UART往往距离很短真正需要长距离传输时会通过RS485收发器把TTL电平转换成差分信号。从选型角度来说板级通信并不适合“哪条总线速度更快就用哪条”。空调控制场景里很多交互报文非常短一次只读写几个字节真正需要高吞吐的场合并不多。更优先考虑的是稳定、抗干扰、资源占用、成本、现有方案经验以及传感器或芯片原厂推荐的参考设计。如果电路板上的I2C走线不合理哪怕总线速率只设成100kHz也可能出现偶发读错数据的问题。这都属于典型的“快不等于稳”案例。总线典型对象线数关键特点常见坑点I2CEEPROM、温度、触摸2线 地多设备共用一根总线地址寻址地址冲突、上拉电阻、走线过长SPIFlash、显示4线以上高速、全双工、片选GPIO占用多片选和时钟相位配置容易出错UART无线模组、调试口2线 地异步点对点约定波特率波特率不一致、电平不匹配、丢字节2.2 板级调试的关键是先确认物理层再看协议层很多人遇到I2C读不到数据第一反应就是反复修改软件里的寄存器配置或延时参数结果改了大半天仍然没有输出。以工程经验来说排查顺序应该更靠前。第一步先确认电源和地。所有板级总线通信都依赖同一个参考地如果芯片没有正常供电或者两个模块之间地电位差太大总线自然无法工作。第二步用示波器或逻辑分析仪看波形。做板级调试时示波器能看到的不只是“有没有信号”还能看出波形上升沿是否变形、时钟线是否被拉死、应答位是否存在。没有工具时也可以通过反复读寄存器并打印错误码来判断但逻辑分析仪会让排查快很多。第三步是确认地址、命令字和寄存器配置。曾经遇到过I2C读不到温度数据最后发现是该型号传感器默认地址和代码里定义的不一样也遇到过SPI屏幕不显示最后是时序极性配置反了。这类问题不是通信物理层坏了而是主控和从设备对“会话规则”的理解不一致。第四步要看软件对错误状态的处理。板级通信并不需要设计成一旦读失败就让整机停机很多系统会设计为连续失败几次后按默认值继续运行同时记录故障码。这样在真实使用中不会因为一次干扰就让空调中断工作。最后补充一点板级通信的线缆不能想当然拉长。I2C、SPI本身面向PCB级短距离设备如果为了测试用长杜邦线把它拉到半米出现波形畸变和锁死并不是奇怪的事。这时候不要急着怪芯片先换短连线或加缓冲后再试。3. 内机外机现场总线室内外机之间才是空调通信的“主力战场”3.1 为什么室内机和室外机之间很少直接用Wi-Fi如果说板级通信是“螺丝壳里做道场”那么室内机与室外机之间的通信就是更接近工业现场的总线设计。这段距离通常有数米而且线束要穿过空调管路和安装环境对成本、可靠性、抗干扰都有很高要求。不少没有接触过空调开发的人会问既然都要联网了为什么不让室内机和室外机之间也通过无线通信或者干脆使用Wi-Fi/以太网协议答案在工程约束里。室内外机一般出厂时就用电源线和通讯线绑定在一起通信线是固定且短距离的不需要像消费电子那样考虑“随时入网”另一方面压缩机、变频驱动器工作时会产生明显的电磁干扰Wi-Fi这类高频无线信号在金属外壳和复杂电磁环境中并不一定可靠而且无线方案的成本、认证和功耗都要高不少。所以家用空调中常见的方式是保留一条低成本的现场总线。这条总线上会传输开机/停机、运行模式、设定温度、内风机转速、外机故障码、压缩机运行状态等信息。有的设计方案使用UART直接连接两板有的用RS485实现半双工差分总线还有不少厂家采用CAN总线或者在UART基础上做私有协议封装。并不是所有型号都完全相同但技术思路都是用一个适合短距离、低速率、高可靠的通信方式把“主控策略”和“功率驱动部分”连接起来。3.2 RS485 和 CAN选择的核心不是谁更“高级”提到空调内外机通信最常被拿出来对比的就是RS485和CAN总线。RS485是差分信号传输的一种常用标准半双工方式很常见支持一主多从结构。它的优点是成本低、抗干扰能力强传输距离能做到几十米到几百米工程上很成熟。在空调线控器、内外机通信、集中控制器等场景都有广泛应用。使用RS485时通常会有一个主机轮询或周期调度各从机按地址响应。CAN总线同样是差分传输但它的设计更强调多主实时通信和错误处理能力。CAN控制器自带仲裁机制多个节点可以主动发送消息总线根据ID优先级决定谁先发。它还具备比较完善的错误监测能力当某个节点出现异常时可以自动离线不至于拖垮整条总线。这种特性在很多工业控制和汽车电子中很重要空调领域使用CAN更多的是为了应对节点较多、实时性要求较高的场合。从工程经验看选择RS485还是CAN往往不是“CAN比RS485先进所以一定选CAN”而要综合几个方面来分析节点数只有两个节点时两者都能满足如果线控器、内外机、集中控制器都要挂上总线CAN的仲裁能力更省心。成本与BOMRS485收发器一般更便宜配套工具和资料也丰富。实时性如果系统内多个节点都会主动上报重要状态CAN的仲裁机制比RS485主从轮询更容易满足实时性。软件成熟度一个团队如果已经有大量RS485产品经验也没有必要为了“先进”强行切换平台。无论用哪种总线协议帧通常会包括帧头、地址或ID、功能码、数据段、校验字段。校验往往采用CRC等算法而不是只累加一个字节因为差分总线虽然抗干扰好但并不保证数据内容不会被干扰。如果实际项目中帧格式没有明确给出要先确认平台协议文档不要凭记忆拼帧。3.3 红外遥控、蓝牙配网和线控器的位置经常被忽略空调开发中最容易忽略的通信其实是用户实际能接触到的那些入口遥控器、配网模块、线控器。红外遥控通常使用的协议是对38kHz载波信号进行脉冲编码比如常见的NEC编码。这种协议不是“主板协议”但它是空调从“按键操作”到“整机联动”链路中的第一跳。调试红外接收时不能只把重点放在遥控器有没有电还要检查接收头周围有没有遮挡、接收头与主板之间电平是否匹配、红外波形有没有被其他光源干扰。蓝牙配网则是近年来智能空调里很常见的辅助通道。因为手机大多不带红外发射而且Wi-Fi配网需要输入SSID和密码通过蓝牙先把Wi-Fi信息传给设备让模组连接路由器就自然很多。它通常负责的只是“配网阶段”或近场调试配网完成后的业务控制仍然走Wi-Fi和云端。线控器则像空调的一个固定面板通过线缆连接主控可能走RS485也可能走CAN。它的存在提醒我们空调的产品形态不只是一种面向酒店、公寓、办公楼的多联机或中央空调会有大量类似集控、网关的节点通信协议树比单个家用空调复杂得多。因此在梳理“空调通信”时如果只盯着云平台和Wi-Fi就会漏掉最靠近用户的这一层而后台排查时又容易把遥控问题误判成主板问题。4. 连上云端MQTT、HTTP 与空调智能控制的关系4.1 主控与无线模组之间的接口往往是串口空调要上云并不是把MQTT协议直接跑在主控MCU的所有GPIO上。一般情况下产品里会有一个独立的无线模组比如Wi-Fi模组负责连接路由器、维护TCP连接、跑MQTT客户端。空调主控只通过UART等接口和这个模组交换数据。这种分工在架构上非常合理。Wi-Fi模组内的协议栈、TLS加密、网络重连机制都由模组处理而主控则继续专注于压缩机、风机、温度控制等强实时任务。主控与模组之间通常用AT指令或私有串口帧格式。模组上报的可能是“已连接路由器”、“MQTT连接成功”、“收到一条控制指令”主控需要做的可以只是解析其中的业务字段。了解这一段的工程师排查问题时会习惯性地去问是主控没有收到串口数据还是模组压根没有连接上云平台两种可能的处理路径完全不同。如果主控一直没收到数据应该先查串口参数、模组供电和网络配置如果主控收到了报文但执行结果不符合预期就要把目光转向业务逻辑而不是网络。4.2 为什么智能空调常选 MQTT而不是把所有消息都走 HTTP在设备联网上云时有一个绕不开的问题到底使用HTTP定时轮询还是要建立一条长连接来实时收发消息HTTP对请求-响应场景非常成熟比如设备上传日志、下载OTA固件包、获取某个配置信息。但如果是手机App要随时把“开机”“调整温度”这样的控制指令发给设备靠HTTP轮询会非常繁琐而且延迟不可控。设备长时间在线时也更需要一条能保持双向通信的连接。MQTT恰好适合这种场景。它基于发布/订阅模型中间有一个消息代理Broker。空调设备会上报到某个主题例如状态上报也会订阅另外一个主题用于接收云端或App下发的控制命令。MQTT支持QoS级别可以根据业务需要选择“最多一次”“至少一次”或“正好一次”的消息投递语义。它还支持保活机制设备定期发送心跳让Broker知道设备仍然在线。空调设备大多数时候不需要大量传输数据却要求设备在线可被随时找到MQTT的低带宽成本和高实时性就显得很有优势。实际产品中MQTT不是唯一的协议。很多设备也会通过HTTPS上报日志或在固件升级时走HTTP下载不同目的选用不同协议这本就是一张协议地图的一部分。为方便理解下面用一个非常简单的JSON示例展示设备上报云端时可能存在的结构。它并不是某种云平台的强制性标准真正落地时请以项目文档为准。{ deviceId: AC-E1-0001, timestamp: 1720000000000, status: { power: true, mode: cool, setTemperature: 26 }, fault: { code: 0, message: normal } }这种结构的好处是让人一眼能看到设备身份、时间、状态事件和故障信息。真实系统里可能用二进制编码、protobuf或更精简的字段但无论使用哪种协议的核心目的都一样让每个消息有明确的语义并且让云端和设备对字段的理解保持一致。4.3 从“收到云端指令”到“执行动作”中间还有一层状态机很多刚开始做接入的人有一个误解认为云端给设备下发一条“开机”消息设备就应该立刻上电。如果照着这个思路做会出现很多奇怪问题空调明明处于待机状态但压缩机可能不会立刻启动因为压缩机有启动保护时间制热模式切换时可能先让风机停一会儿防止吹冷风设备离线之后重新上线可能还需要恢复断电前状态。这些都不是单纯的一条协议消息能解决的。协议负责把指令可靠地送到设备但设备对指令的响应仍然受控于主控里的状态机。主控收到“设置制冷26度”的消息后只会把它当作一个目标状态最终是否立即启动压缩机、电子膨胀阀开度多大都要结合当前内管温度、风机状态、系统压力等判断。这一点需要时刻记住否则在排查问题时很容易认为“消息已经发到设备了设备就应该动起来”忽略了还隔着一条业务控制逻辑。4.4 配网、在线状态和断网记忆也是协议设计的一部分智能空调不是插上网线就能工作的。和手机App绑定设备时常见方案是先把设备置于配网模式通过蓝牙或SoftAP传递Wi-Fi的SSID和密码。配网成功后设备要保存这些信息否则断电后要重新配置用户不会接受。因此主控侧通常需要有一个非易失存储区域用来记录Wi-Fi配置和云平台接入信息同时还要有恢复 “重新配网”的方法。断网记忆同样重要。空调不会因为短时间内Wi-Fi断开就停止制冷它会继续保持当前运行状态等网络恢复后再尝试重新连接云平台。这样的设计需要在链路中明确区分“控制层”和“通信层”控制层仍然按本地逻辑运行通信层则负责在断线期间缓存少量命令或者等恢复后补发状态。5. 从故障现象到协议定位一条可以反复使用的排查链路5.1 不要从现象直接跳到“改代码”实际工程项目里最浪费时间的往往是出现故障后立刻打开代码开始改而不是先确认故障发生在那一段通信链路上。比如“空调不制冷”可能是温度传感器坏、室外机通信断、压缩机驱动上电时序不对、冷媒系统故障也可能是云平台下发模式错乱。如果一上来就调整通信协议经常越改越乱。建议的做法是把从板级到云端的层级当成排查地图从下往上或从上往下逐段缩小范围。一种很实用的顺序是先看最靠近业务的现象App端有没有显示设备离线有没有下发成功云端后台有没有收到最近的设备心跳再看联网链路Wi-Fi信号强度是否正常设备模组有没有TCP连接MQTT连接是否存活最近一次消息收发有没有异常。再看设备内部通信主控有没有收到无线模组传来的串口数据如果收到了主控有没有通过现场总线转发给室外机再看板级和传感器传感器读数是否正常主控的I2C总线能否读到温度读到的数值是否符合物理范围最后才怀疑执行机构压缩机、风机有没有充分供电是否有接触不良或硬件故障。这个顺序并不是固定教条。当问题表现为“App控制没反应”时从上往下排查更高效当问题表现为“机器完全不开机”时先查硬件供电反而更合理。但有一个共同原则就是在相邻两层之间找到清晰的“切分证据”比如主控串口日志里有没有输出收到的报文。有这个证据就能把怀疑范围大幅缩小。5.2 每层的常见故障与对应排查工具不同协议层故障的表现也不太一样使用工具可以给每层做快速体检。协议层常见故障典型排查工具或方法板级总线传感器读不到、读值跳变、EEPROM写失败万用表、示波器、逻辑分析仪现场总线内外机不联动、线控器无响应、偶发通讯故障总线分析仪、示波器、地址/校验/帧测试红外与近场遥控器无效、蓝牙配网无法建立红外接收头输出波形检查、蓝牙抓包日志Wi-Fi与模组网连不上、MQTT频繁断线模组AT日志、路由器管理界面、抓包云端业务App状态不刷新、指令没下发云端日志、消息轨迹、设备影子记录每次都建议把所有日志的时间基准统一。主控、模组、云端日志如果各用各的时间会导致消息到底到没到完全无法对账。可以用设备本地时间、云端接收时间再加上一个唯一消息ID来串联。5.3 一个真实项目中很常见的断案思路App下发温度没反应假设用户反馈用手机App把温度从26度调到18度App显示成功但空调一直不制冷。先不要急着说云端或压缩机坏了。按排查链路走云端后台查设备是否在线回查消息记录看App有没有成功把“18度”下发到设备。模组日志查主控有没有收到这条命令。如果消息已经从云端到模组但主控串口没看到问题多半在模组或主控的串口接线。主控日志查收到命令后是否执行了模式判断。如果收到命令但判断不符合当前运行条件可能并不执行。查看冷媒系统的状态如果当前内管温度已经很低压缩机保护或者四通阀状态不对即使收到18度指令整机也可能不会立刻进入强力制冷。最后再检查传感器实际读数是否正常比如室温是不是已经低于18度如果是空调不重设置也符合控制逻辑。这个例子说明一个看似简单的“协议通信问题”落到真机上往往是软件状态机、故障保护、传感器数据甚至用户预期共同作用的结果。把协议层之间的日志切分开才能准确判断问题归属。6. 长期可维护比“第一次能跑通”更重要6.1 先跑通最小闭环再一层层加上去做空调这类产品协议种类多不等于一开始就要全部打通。更稳妥的路径是先跑最小闭环第一步只让主控板上的传感器、按键、显示工作先确认板级通信稳定。第二步接上室内外机通信链路让主控可以控制外机启停并返回故障代码。第三步接入无线模组通过AT命令行或串口调试工具确认模组能联网、能收发MQTT消息。第四步对接云平台和App完成一次完整的“App下发→设备执行→状态上报”闭环。最后才去处理批量设备、OTA升级、安全策略和故障恢复。每一层都设计一个明确的自测命令或测试点能够大大减少集成阶段互相推诿的可能。没有测试点时出问题只能靠猜而猜是最贵的排查方式。6.2 给协议留版本、兼容和回退空间空调产品生命周期很长一款主板可能生产多年云平台却可能在不断升级。企业经常为了兼容老机型让云端同时支持多个协议版本。因此上报数据中最好带一个“协议版本”或“模型版本”字段新老版本报文差异较大时给每类消息都设计一个最小必要字段集合。比如无论云端如何升级至少要保证设备侧能解析“开机/关机、设置模式、设置温度”这几个基础指令否则用户用App操作老设备会直接失败。给协议做兼容也需要考虑异常回退。比如某条新指令格式错误设备不应该直接卡死更不应该忽略所有后续报文。正确做法是丢弃该条报文应答一个错误码同时保留正常处理其他消息的能力。6.3 安全不应该等到产品做完了再加很多嵌入式开发者在做板级通信时对安全不太敏感因为I2C、RS485等总线一般只在设备内部出现外部很难直接接触。但一旦接入Wi-Fi和云平台设备就暴露在不可信的公共网络中。设计通信时至少要考虑到设备身份认证每个设备有唯一密钥或证书不能让攻击者伪造一个设备接入云端。传输加密公网传输使用TLS加密私有总线若担心被监听可以增加校验和应答机制。消息防重放控制指令如果可以被重放可能被用于重复触发同一个动作因此需要消息时间戳或递增序列号。远程升级安全OTA固件包必须签名校验否则一旦下发通道被劫持可能把恶意固件刷入设备。这些能力和具体通信协议是配套的。MQTT只负责消息路由TLS只负责传输加密设备密钥管理、字段校验和业务权限则由产品侧决定。只有在每一层都考虑边界才能避免产品在真实环境中被攻击。6.4 硬件平台与成本会反过来影响协议选型最后要提醒的是不同空调品类受硬件成本和控制复杂度影响很大。一台简单的窗机可能主控直接通过UART读取传感器不需要复杂的云平台一台商用多联机则可能有外机、多个内机、集中控制器、网关还会用到RS485或CAN等规模更大的组网。开发者在看各种“标准架构”时要清楚它只是众多实现中的一种。例如有低成本方案会把温度传感器直接用ADC采集模拟电压而不用数字I2C传感器有成熟的平台方案可能把Wi-Fi模块和主控封装成同一个模组这时板级协议不复存在。因此协议地图的作用并不是告诉所有人“每一层必须用某个协议”而是提醒开发者在做选型时列出每一层真正的需求再决定要不要减少一层或者合并两个模块。不要为了技术上的酷炫给产品增加不需要的节点、成本和电路。从板级到云端的通信协议链很像一条实时协作的流水线。每一层都有自己要解决的矛盾和约束板级要解决成本与稳定现场总线要解决距离与抗干扰云端要解决消息的可靠通知与随时可达。做空调开发最忌讳的是只盯着一个协议把局部的问题当成全部。先把整条链路的层级和断点画出来再逐一设计、验证和排查你会发现自己不再被各种偶发问题牵着走。
返回列表