ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

嵌入式物联网常用通信协议全解析:从UART到LoRa一次讲透

嵌入式物联网常用通信协议全解析:从UART到LoRa一次讲透 做嵌入式这几年有一个特别真实的感受通信协议这玩意儿平时没人会从头教你一遍但只要你上手调板子、接传感器、搭物联网设备就一定会撞上UART、I2C、SPI、RS485这一堆名词。刚开始我也是一头雾水串口调试助手打开CH340驱动装不上波特率对不上数据全是乱码后来踩的坑多了才慢慢把这些协议的关系理清楚。这篇文章把从传统串口到物联网常用的10大通信协议一次讲透包括优缺点、传输距离、典型应用场景后面还会带上我实际调试中积累的避坑经验。无论你是刚开始学单片机、做物联网毕业设计还是正在选型智能硬件方案这篇都值得收藏后慢慢看。1. 先理清思路通信协议到底在解决什么问题1.1 通信协议的本质先说点基础但容易忽略的东西。通信协议的本质就是通信双方约定好的一套共同语言包括数据怎么封装、怎么同步、怎么校验、出错怎么办。没有协议两个设备之间的电平信号就算接对了也是一堆无法解析的噪声。我把常见的通信协议分成两个层面来理解物理层协议和逻辑层协议。比如UART、SPI、I2C它们规定了电平标准、时序关系、数据帧格式属于偏物理和链路层的协议而Modbus、MQTT这种是建立在具体传输通道之上的应用层逻辑协议。两者是分层协作的关系不能混为一谈。很多初学者容易犯的错就是把RS232和UART画等号。其实UART是一种通用的异步收发机制而RS232只是定义了UART信号在物理连接上的电平标准和接口形态。两者的关系就像是说普通话和通过电话线上说普通话的区别。1.2 有线与无线选型的第一道分水岭从项目选型的角度看第一道分水岭不是快慢而是有线还是无线。有线通信的特点就是稳定、可预期、不受环境干扰前提是布线合理适合固定位置、有供电条件、对可靠性要求高的场景。无线通信的优势是免布线、灵活部署但代价是要考虑频段资源、功耗、信号遮挡、干扰等一系列问题。从串口到物联网的演进本质上是把近距离、有线、点对点的通信方式逐步扩展到远距离、无线、多节点组网。但底层逻辑没变RS485的差分信号思想在CAN总线里被继承UART的异步帧结构被无线透传模块拿来当透明传输的接口基础。理解这条演进路线比死记参数表有用得多。2. 有线界的四大金刚从UART到RS4852.1 UART最基础的串口通信几乎所有设备都绕不开UART全称是通用异步收发传输器它的核心特点是异步也就是说收发双方不共享时钟信号而是通过约定波特率来同步。常见的波特率有9600、115200、460800等。波特率就是每秒传输的比特数这个值双方必须一致否则收到的数据就是乱码。UART的数据帧一般由起始位、数据位通常8位、校验位可选、停止位组成。实际调试中我习惯把串口参数固定为115200-8-N-1也就是波特率115200、8位数据、无校验、1位停止位。这个组合在绝大多数单片机场景下都能直接跑通是免配置的首选。UART的优点是协议简单、实现成本极低几乎任何单片机都自带UART外设缺点是只能点对点通信传输距离短TTL电平下一般不超过一米速率上限也不高。我在调试ESP32-S3和PC通信时最常用的方式就是USB转TTL模块配合串口调试助手查看日志输出。这里有个容易踩的坑CH340和FTDI两种USB转串口芯片在Windows下驱动不通用换了模块就要重新装驱动不然设备管理器里永远显示一个黄色的感叹号。2.2 I2C芯片内部通信的轻骑兵I2CInter-Integrated Circuit是飞利浦公司现NXP提出的两线制同步串行总线两根线分别是时钟线SCL和数据线SDA。它的最大优势就是接线少所有设备挂在同一条总线上通过设备地址来区分标准模式下最多可以挂接上百个设备。I2C的通信速率标准模式是100kbps快速模式400kbps高速模式3.4Mbps。实际项目中I2C主要用于板级芯片之间的通信比如单片机读取温湿度传感器、陀螺仪、EEPROM存储芯片等。在ESP32和STM32的项目里I2C几乎是标配外设。但I2C也有短板一是传输距离非常短一般不超过几十厘米常用于同一块电路板内部二是需要外接上拉电阻而且上拉电阻的阻值会影响通信速率和稳定性这个参数新手经常忽略三是总线仲裁机制比较复杂多个主设备同时通信时容易出现数据冲突。我个人的经验是I2C调试如果遇到SDA线被拉死始终为低电平的情况十有八九是设备地址写错了或者从设备没有正常供电复苏。可以试着重新上电并在初始化时先给总线发送一个停止信号来复位。2.3 SPI高速同步总线的效率之王SPISerial Peripheral Interface是Motorola提出的一种高速、全双工、同步串行总线。它用四根线通信SCLK时钟、MOSI主出从入、MISO主入从出、CS片选。因为SCLK由主机主动产生所以SPI的通信速率可以非常高从几MHz到几十MHz都很常见。SPI的优势是速度和灵活性特别适合大数据量传输的场景比如驱动TFT液晶屏、读写SD卡、连接外部Flash芯片。它的缺点是引脚占用多每个从设备都需要一根独立的CS片选线设备一多单片机的GPIO就不够用了。另外SPI没有标准的应答机制从设备是否正确收到数据主机往往不知道需要在上层协议里自行处理。实际做项目时SPI速率不是越快越好。我就遇到过SPI时钟频率设置过高导致显示屏出现雪花点的情况。排查了很久最后降低速率到总线的三分之一才稳定下来。这是因为长走线、信号反射、电平匹配等因素都会限制实际可用的SPI速率。PCB Layout上的走线长度和阻抗匹配对SPI稳定性影响很大这一点容易被新手忽略。2.4 RS232与RS485走向工业现场的远距离通信RS232是最早的串口标准之一它最大的贡献是把TTL电平的单端信号改成了正负电压的逻辑电平逻辑1为-15V到-3V逻辑0为3V到15V从而提高了一定的抗干扰能力理论传输距离可以到15米左右。但我们日常用的USB转串口模块出来的通常是TTL电平要接到真正的RS232设备上必须经过MAX232这类电平转换芯片。RS232的缺点是显而易见的只能点对点通信全双工方式需要三根线TX、RX、GND传输速率一般不超过115200bps实际使用中更保守抗干扰能力在工业现场依然不够用。RS485则是为了解决RS232的痛点而生的。它采用差分信号传输用两根线A和B上的电压差来表示逻辑0和1共模抑制能力强传输距离可达1200米在波特率较低时而且支持多点通信一条总线上最多可以挂接32个标准负载。正因为这些优势RS485成了工业自动化、楼宇自控、门禁系统里最经典的通信总线。在STM32F103这类单片机上做RS485通信有个经典组合UART外设 MAX3485收发器 方向控制引脚。发送数据前拉高方向引脚发送完成后拉低再切回接收这个切换时机如果处理不好就会出现最后一字节数据丢失的问题。很多人用Modbus协议通信的时候总是偶发通信失败方向切换就是首要怀疑对象。3. 总线与工业协议CAN和Modbus的那些事3.1 CAN总线为可靠而生汽车与工业的首选CANController Area Network是Bosch为汽车电子设计的串行通信协议后来在工业控制、医疗设备、船舶电子等领域也大量应用。CAN也是差分信号但比RS485更强的是它具备完善的错误检测、错误处理和优先级仲裁机制。每个节点都能检测总线错误并自动重发因此可靠性非常高。CAN的传输速率和距离成反比1Mbps时传输距离约40米而降到5kbps时可以达到10公里配合中继器。这个特性让它能灵活适配不同场景。它的多主结构也很特别任意节点都可以主动发起通信总线仲裁由硬件自动完成不需要主站轮询。从应用角度看CAN总线最大的门槛是学习曲线。帧格式有标准帧11位ID和扩展帧29位ID加上位填充机制、CRC校验、应答槽等概念刚接触时会比较懵。我的建议是先用USB转CAN分析仪配合CAN调试软件抓包看实际报文比单纯看书理解得快得多。工程上常遇到的问题是CAN总线终端电阻。标准CAN总线要求在物理链路两端各接一个120欧姆终端电阻用来消除信号反射。很多人在实验室里只接两个设备忘记加终端电阻结果通信时好时坏排查了半天才发现是这个问题。3.2 ModbusPLC世界的通用语言Modbus是Modicon公司现在的施耐德电气在1979年发明的应用层协议因为它简单、开放、易于实现至今仍是工业自动化领域的事实标准。Modbus协议本身不规定物理层它既可以跑在RS232/RS485串行链路上Modbus RTU/ASCII也可以跑在以太网上Modbus TCP。Modbus RTU是目前最常见的工业协议之一。它的数据帧包含从站地址、功能码、数据区、CRC校验。协议是主从模式一个主站轮询多个从站主站发出请求从站应答。我在STM32F103标准库环境下移植过FreeModbus协议栈走RS232接口实现Modbus RTU通信。整个过程不算复杂但有个关键点定时器配置必须精确到3.5个字符时间用来识别一帧数据的结束否则帧粘连会导致解析错误。Modbus最大的特点是简单到很难出错每个功能码的含义清晰明了01读线圈、02读离散输入、03读保持寄存器、04读输入寄存器、05写单个线圈、06写单个寄存器。调试时只要用Modbus Poll软件配合一个RS485转USB模块就能快速验证整个通信链路。在实际工业项目里Modbus往往和RS485组合成最经济的数据采集方案一台PLC做主站下面挂十几个传感器从站、仪表从站、执行器从站通过Modbus RTU协议轮询数据。这种方案成本低、稳定性好即使到现在也依然大量存在。3.3 工业现场的协议组合实战真正的工业项目往往不是只用一种协议而是多种协议协同工作。我做过的一个典型场景是设备层用RS485 Modbus RTU采集温湿度传感器和电能表数据通过边缘计算节点汇聚后再用以太网或Wi-Fi上传到云端平台。这就是常说的边缘计算节点在数据上云传输中的应用。在这个架构里串口负责打通设备层物联网协议负责打通平台层两者有明确的分工。千万不要想到一个需求就直接上最好的协议比如所有设备都搞Wi-Fi这样既贵又费电工业场景下其实远不如RS485可靠。4. 无线连接层物联网设备如何接入网络4.1 BLE蓝牙低功耗设备的默认选项BLEBluetooth Low Energy蓝牙低功耗是物联网场景里最常用的近距离无线协议之一。它的特点是功耗极低一颗纽扣电池可以让小型传感器工作数月甚至一年以上手机直接支持不需要额外的网关硬件配对连接相对简单。BLE的传输速率实际有效吞吐大概在几十kbps到1Mbps之间理论最大距离在城市环境下约10米到50米空旷环境下可以达到100米以上。它的应用场景包括智能手表手环、蓝牙温湿度标签、室内定位信标、蓝牙Mesh组网设备等。做BLE开发时最常接触的是Nordic的nRF52系列、TI的CC2640系列以及Espressif的ESP32系列。BLE协议栈的层次比较多GAP负责设备发现和连接GATT负责数据服务。和串口相比BLE的上手门槛明显更高建议先用厂商提供的Demo板跑通透传例程再根据业务修改服务和特征值。实际项目里我经常用BLE做无线串口板子出一个UART口接一个BLE透传模块手机端用通用的BLE调试APP往服务端写特征值数据就能通过蓝牙转发到单片机的串口。调试阶段特别方便不用频繁插拔USB线。4.2 Wi-Fi让设备更快接入互联网Wi-Fi的优点很直白速率高、直接能连家里或公司的路由器、设备端代码生态成熟。ESP8266和ESP32系列是物联网开发者最常用的Wi-Fi方案尤其是ESP32-S3它同时支持2.4GHz Wi-Fi和BLE相当适合做物联网项目的主控。但Wi-Fi的缺点也同样明显功耗大电池供电的场合很难长期运行连接可靠性受环境干扰影响大信道拥挤时延迟不稳定大量设备同时连同一个AP时并发能力有限容易出现设备掉线的问题。智能家居场景中Wi-Fi设备适合插座、灯泡、摄像头、门锁这类有持续供电条件的设备。设计时要注意断线重连机制我调试ESP32设备时遇到过这样的情况路由器重启后设备一直没能自动重连Wi-Fi导致云端数据断档。后来在代码里增加了Wi-Fi断线检测和自动重连逻辑才彻底解决。这属于典型的上线容易保活难的问题。4.3 LoRa远距离低功耗的物联网广域网LoRa是Semtech公司推动的一种远距离扩频通信技术在物联网领域有很重要的地位。它最显著的特点是灵敏度极高在城市环境下的通信距离可以达到2到5公里空旷环境下甚至可以达到10到15公里而发送功耗却非常低一般几十mW级别。LoRa的单点传输速率很低通常只有0.3kbps到50kbps所以它的定位不是传视频或大批量数据而是传小数据包。例如农业大棚的温湿度采集每小时传一次、智能水表电表的抄表数据、停车场地磁感应器状态等。实际应用中我们通常不谈裸LoRa而谈LoRaWAN它是一种定义了网络架构、MAC层策略、安全机制和服务器接口的标准协议。一个典型的LoRaWAN网络包含节点设备、网关、服务器三部分节点通过LoRa无线发送数据到网关网关通过以太网/4G/Wi-Fi转发到云端服务器。LoRa组网时最需要关注的是扩频因子SF、带宽BW和编码率CR这三个参数。扩频因子越高灵敏度越高距离越远但传输速率也越慢。我做过的一个农业项目里节点距离网关较远把SF从7调到了10之后距离确实上去了但数据包传输时间明显变长这也意味着功耗相应增加。参数调优是一个距离、速率、功耗三者之间的权衡过程。4.4 蜂窝物联网NB-IoT与Cat.1的选择难题蜂窝类物联网技术包括NB-IoT、LTE Cat.1、还有5G RedCap等它们的共同点是使用运营商授权的频谱资源因此覆盖广、无需自建网关插卡就能连平台。NB-IoT的特点是超低功耗、超强覆盖支持海量连接定向用于窄带物联网业务比如智能燃气表、智能水表、消防栓监控等。Cat.1则是目前很多物联网共享设备如共享单车、共享充电宝、支付终端选择的方案因为它速率比NB-IoT高得多可以支撑语音和中等速率的数据传输同时比5G/4G LTE标准更省电、更便宜。在国内市场Cat.1是中速率物联网的重要补充。选择NB-IoT还是Cat.1主要看业务上报数据量、时延要求、是否需要下行控制指令。如果设备一天只上报几个字节NB-IoT足够了如果需要频繁下行控制、远程升级、交互式操作Cat.1更合适。物联网项目方案选型的时候不能只看实验室效果还要考虑运营商网络的真实覆盖质量。我在一个项目中就吃过亏NB-IoT模块在测试台信号满格但设备装到客户现场地下室之后网络注册一直失败。所以做这类项目之前最好先去现场做一次信号覆盖测试。5. 10大协议对比总表与选型决策5.1 关键参数快速对比表把前面提到的协议整理成一张表方便后续对照协议类型最大传输距离典型速率网络拓扑功耗主要应用场景UART (TTL)有线串行1米最高数Mbps点对点低板级调试、传感器直连I2C有线串行0.5米100k/400k/3.4Mbps多主多从低板内芯片寄存器读写SPI有线串行1米实际走线受限可达几十MHz一主多从低屏、存储器、高速传感器RS232有线串行约15米通常≤115200bps点对点中老式设备调试、控制台RS485有线差分约1200米通常≤10Mbps主从多节点中工业现场、楼宇自控、Modbus RTUCAN有线差分40m1M / 10km低速最高1Mbps经典多主多从中汽车电子、工业控制Modbus应用层协议取决于物理层取决于物理层主从轮询取决于物理层PLC/仪表/HMI组网BLE无线10~100米有效吞吐几十至数百kbps点对点、星型、Mesh极低穿戴设备、室内定位、透传Wi-Fi无线数十米数十至数百Mbps星型高智能家居、音视频传输LoRa无线扩频2~15公里0.3~50kbps星型/网状极低广域抄表、农业监测、智慧城市这张表里的数据是常规参考值工程实际会受环境、天线、波特率、供电等多方面影响所以只能用作方案初选。5.2 场景驱动的协议选型方法我在选型时很少直接问这个协议好不好而是先问这个项目到底要什么。如果是板级传感器数据采集优先考虑I2C或SPI因为它们方便、可靠、低功耗不需要额外硬件。如果是两台设备室内短距离通信比如门禁主机和读卡器之间RS232和RS485都行但RS232接口简单、成本更低如果距离超过20米就必须RS485了。如果是工业多条产线汇聚数据RS485 Modbus RTU几乎是性价比最优解协议简单、元器件便宜、抗干扰强很多电表和PLC都原生支持Modbus协议。如果是智能家居设备Wi-Fi可以和路由器直连开发快捷但需要低功耗或者需要与手机近距离互动的设备选BLE更合适。考虑到功耗和稳定性的平衡现在用ESP32系列开发产品时我常常让设备同时支持Wi-Fi和BLE正常业务走Wi-Fi配网阶段走BLE这样用户体验和开发效率都可以兼顾。如果是分布很分散的户外终端设备优先考虑LoRa或NB-IoT。LoRa适合自建网络、不依赖运营商、覆盖范围可控的场合NB-IoT适合已有运营商网络覆盖且通信数据量极小的场景。两者相比LoRaWAN在国内需要申请使用合法频段并保证功率合规NB-IoT更加插电即用但流量资费和模块成本都是长期运营要考虑的因素。6. 调试工具与常见问题实录6.1 串口调试助手和驱动每天都要用的这些工具串口调试助手是嵌入式开发和物联网调试中出场率最高的工具围绕它有一个庞大的生态工具集。它们的使用逻辑基本一致选择串口号、设置波特率、打开串口、收发数据。但在Windows系统上串口模块驱动的坑却不少。最常见的两类USB转串口芯片是CH340和FTDI。CH340是国产芯片价格便宜绝大多数廉价开发板上用的都是它FTDI是国外品牌芯片稳定性和兼容性更好但正品价格贵市面上假货也很多。驱动方面Windows系统插上CH340模块常常需要手动安装驱动FTDI芯片的驱动通常会被系统自动识别。如果设备管理器里识别不到COM口多半就是驱动问题。使用串口调试助手时还有一个新手经常困惑的问题串口为什么会自动换行这其实是发送设置引起的串口调试助手常见的发送选项有发送新行发送\r\n发送\r\n十六进制显示等。到设备端如果只按\n处理就会出现部分设备收到数据但不执行命令的现象。建议统一定义通信帧的结尾符为\r\n并在协议解析时兼容\r和\n单独出现的情况。6.2 电平转换与接线一接错就烧板的教训这是开发中最常遇到又最不该犯的低级错误。很多用户的开发板IO口是3.3V电平而RS232要求正负电压RS485是5V差分电平。如果直接把开发板的TTL串口接到RS232/RS485总线上轻则通信失败重则烧毁芯片。所以必须使用转换芯片例如MAX3232完成TTL到RS232的转换MAX3485完成TTL到RS485的转换。接线方面还需注意RS485的A/B线不能接反接反的后果是收不到任何数据。如果总线上有多个设备A和B分别并联注意不要跨接成环并确保双端接地或合理单端接地。另外RS232接口的地是必须接的因为RS232是单端信号收发双方要有共同的电平参考点不接地会出现很奇怪的乱码问题。在Linux系统下使用USB转串口模块时需要注意权限问题有时候需要用命令给串口设备增加权限读取串口数据还会遇到数据丢失的情况。数据丢失的常见原因有三个应用层读取不及时导致缓冲区溢出、波特率过高时USB转串口芯片处理不过来、操作系统驱动的默认FIFO缓冲设置不合理。排查思路一般是先降低波特率再检查上位机的读取线程调度。6.3 无线通信的干扰排查思路Wi-Fi和BLE都在2.4GHz频段工作所以在智能家居设备集中的环境里信道干扰非常常见。Wi-Fi网络频繁掉线、BLE设备连接闪断很多都是因为信道拥挤导致的。我常用的排查方法是先用手机或PC扫描周边2.4GHz网络的信道占用情况然后把设备固定到不那么拥挤的信道比如1、6、11之外的非重叠信道中找一个空闲信道但实际要看扫描结果减少共信道干扰。对于LoRa需要注意的是同频干扰问题。多个网关如果设置在同频点上行数据包冲突的概率会显著上升。实际项目里选择LoRa频点时一定要先做现场频谱扫描看看这个频段是不是已经被别的系统占用了。即便LoRa有扩频增益也无法完全避免强干扰源的影响。再补充一个容易被忽视的点天线方向性。2.4GHz频段的PCB天线有很强的方向性如果设备安装时天线紧贴金属表面或者旁边有密集的走线通信距离会大幅缩水。测试物联网设备发射功率和接收灵敏度时最好在无遮挡的微波暗室或者开阔环境下进行不然测出来的数据对实际工程参考价值不大。7. 最后说点个人体会我做嵌入式开发和物联网项目这几年最大的感受是通信协议并不是越高级越好关键是匹配场景。一个农业大棚监测项目用LoRa可能比Wi-Fi更合适因为覆盖范围和功耗是主要矛盾而一个室内环境监测设备用BLE可能比LoRa更合适因为成本和手机直接交互的优势太明显。调试协议栈的时候也慢慢明白把底层机制搞懂对排查问题特别有帮助。比如你理解了UART的帧结构和波特率容差就能理解为什么收发两端时钟芯片的误差累积到一定程度后会出现偶发乱码你理解了CAN的仲裁机制就能理解为什么总线负载率超过30%后冲突会突然增多你理解了Modbus RTU的帧结束定时规则就知道该用定时器精确识别帧边界而不是傻等串口空闲中断。如果让我给刚入行的人一句建议先从UART和串口调试助手玩起熟悉数据怎么从单片机到PC然后再扩展到I2C和SPI这些总线协议有了一定基础后再去研究RS485、CAN这些工业总线和无线通信。这一条路径走下来你对物联网通信的理解会非常扎实。本文章节参考了不少我和同行在项目里遇到的实际问题包括长江三角洲地区的智慧农业应用、珠三角的智能家居方案、华北的工业设备联网案例希望能对正在做通信协议选型和调试的朋友有实际帮助。
返回列表