ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

E28 LoRa模块实战:透传、定点传输与RSSI测试详解

E28 LoRa模块实战:透传、定点传输与RSSI测试详解 最近在做一个点对点无线数传的小项目手头正好有一对亿佰特E28系列的LoRa模块就把透传、定点传输、RSSI信号测试以及MicroPython端的驱动都完整跑了一遍。这套组合做下来整体体验比我想象中顺利但中间也踩了几个比较隐蔽的坑。这篇文章就把整个项目从头到尾拆开讲一遍包括E28模块的选型思路、透传和定点传输两种模式的区别、MicroPython环境下的驱动配置、RSSI测试的具体方法以及我实测中遇到的问题和解决办法。开头先说明一点搜索LoRa模块资料的时候很容易看到一堆“LoRA微调”“LoRA训练”的内容那是AI大模型领域的参数高效微调技术跟无线通信里的LoRaLong Range远距离无线电完全不是一个东西只是名字撞了。本文聊的LoRa是Semtech公司推出的扩频调制技术用在物联网、传感器数据回传、遥控遥测这些场景里特点就是传输距离远、抗干扰强、功耗低代价是速率比较慢。搞清楚这一点再往下读就不会被热搜词带偏了。这个方案适合谁参考如果你手头有E28、E22、E32这类串口LoRa模块想用ESP32或者其他支持MicroPython的板子做原型验证或者正准备做果园、仓库、农田这类场景的低速率数据采集链路那这篇文章应该能帮你省下不少排查时间。1. 项目拆解E28 LoRa模块到底能干什么1.1 透传和定点传输两个最容易绕晕的概念E28模块虽然是LoRa射频模块但你在使用它的时候绝大多数情况下接触不到LoRa的物理层细节。模块内部已经把协议栈封装好了你只需要通过串口或者SPI往里面塞数据就行。这也是为什么这类模块在工业场景里这么受欢迎——它不是让你去搞射频设计的而是让你把精力放在自己的业务逻辑上。不过E28本身支持两种数据传输方式这两种方式的差异非常关键选错了会导致整套通信逻辑跑不通。第一种是透传模式。这个名字起得很形象就是“透明传输”的意思。你往模块串口里写什么字节对端模块的串口就原样吐出来什么字节中间所有LoRa协议的封装、解封装、校验、重发机制全部由模块自己处理。在这种模式下两台设备之间只要保证模块地址和信道设置一致通电就能通信完全不关心数据内容。它的优点是简单可靠、零开发成本缺点是所有节点共用同一个“频道”缺少寻址能力不适合多节点组网。第二种是定点传输模式。这种模式下发送方在数据前面指定目标节点的地址模块只把数据投递给对应地址的接收端。你可以把它理解成快递寄件透传模式相当于你把东西放到一个公共柜台上谁拿都行定点传输模式则是在包裹上写了收件人只有收件人能签收。这样就能做到点对点通信、点对多点通信甚至广播为以后挂多节点留出了扩展空间。用一个更生活化的类比透传就像你和朋友约在老地方见面只要双方都知道地点去了就能见到定点传输则像寄快递你要在面单上写清楚收件人地址快递员才会送对门。对比项透传模式定点传输模式地址机制无靠全局地址参数匹配数据帧携带目标地址数据格式原始数据直接发目标地址头 负载数据适用场景两点简单通信、链路测试多点组网、定向投递实现难度低串口直通中需处理地址头广播能力不支持支持0xFFFF广播1.2 为什么选E28而不是其他LoRa方案市面上LoRa模块很多E22、E32、E19、E01系列还有各种直接用SX1268/SX1276射频芯片搭的板子为什么最后选了E28我当时的判断标准主要有三点。第一E28基于Semtech SX126x系列芯片比如E28-433M20S用的是SX1268915M版本用SX1262这颗芯片是目前Sub-GHz LoRa里综合性能比较均衡的一颗。它的接收灵敏度能做到-137dBm级别SF12、125kHz带宽条件下相比老款的SX1276系列低了大概几个dB别小看这几个dB在射频链路里每个dB都是白花花的通信距离。而且SX126x支持LoRa和FSK两种调制方式虽然多数E28出厂默认只在LoRa模式开放配置但万一以后想切到FSK做高速率近距传输硬件上是留了余地的。第二E28模块把SX126x周边整理得很干净。板上集成了阻抗匹配、巴伦、射频开关你只需要接天线、供电和串口/SPI不需要自己画匹配电路这对做产品和做原型的人来说省了一大笔射频调试的时间。我见过不少直接拿SX126x芯片裸调的项目光天线匹配那块就能折腾一周而用模块基本上拿来就能通。第三生态好。E28虽然是串口模块但它同样把SPI引脚引出来了这就意味着你可以用现成的MicroPython SX126x驱动直接操作底层寄存器做RSSI读取、SF/BW参数动态调整这些透传模式下做不了的操作。这一点在后面RSSI测试环节特别重要因为透传模式下你能拿到的信号强度信息非常有限而通过SPI直读寄存器能拿到当前信道噪声底、最近一包数据的RSSI和信噪比SNR这些才是判断链路质量的关键数据。当然选E28也有代价。LoRa本身速率很低在SF7、125kHz带宽下实际有效吞吐也就每秒几千字节传个温度、湿度、GPS坐标这种小数据包绰绰有余但你想传图片、传音频文件就完全不现实了。另外Sub-GHz的频段在不同地区是有使用限制的选型的时候一定要确认你所在地区允许使用的频段范围型号后面的433M、868M、915M就是频段标识别买错了。2. MicroPython环境准备与硬件接线2.1 硬件清单我这次用的是一对E28-915M30S模块工作频段在862~928MHz标称发射功率最大可以做到1W30dBm量级。不过实际跑测试的时候我通常把它配到22dBm左右已经足够覆盖大部分测试距离了。如果你在国内做433M频段的应用E28-433M20S也是常见选择功率20dBm级别通感能力差不多就是频段不同。主控板我用的是一块ESP32-S3开发板选它的原因很简单支持MicroPython、SPI接口多、双核跑起来不容易被中断处理拖垮而且价格便宜、资料多。其实只要你手里的板子支持MicroPython比如标准的ESP32、RP2040树莓派Pico、STM32系列都可以按同样的思路来做硬件差异只是SPI引脚号不一样而已。还需要准备的东西两套天线E28通常是SMA座注意选和频段匹配的天线、杜邦线若干、一块USB转TTL小板用于给模块做AT配置、一对对讲机或者手机用于测试时沟通以及一个笔记本电脑跑串口调试助手。2.2 接线说明E28模块引脚不算多但接错一根就能让整个系统静默罢工。我这次通过SPI方式让ESP32直连模块引脚分配如下ESP32-S3引脚E28模块引脚说明3V3VCC模块供电注意电流需求GNDGND共地必须连接GPIO 12NSSSPI片选低有效GPIO 13SCKSPI时钟GPIO 11MOSI主机输出从机输入GPIO 10MISO主机输入从机输出GPIO 14RST模块复位低电平复位GPIO 9DIO1中断输出接收/发送完成标志有几个细节要特别强调。DIO1这根线很多人会忽略但SX126x在工作时接收完成、发送完成、CAD检测这些事件都是通过DIO1引脚产生中断通知主控的。如果DIO1不接你就只能靠轮询寄存器去判断是否有数据到达不仅代码变复杂还容易在MicroPython这种有垃圾回收机制的环境里漏掉数据。所以宁可少接一个不用的GPIODIO1必须接上。供电方面E28在发射瞬间电流会冲得比较高30dBm功率版本瞬时电流可能到几百毫安量级。有些开发板的3V3输出能力一般直接带模块会出现电压跌落表现就是近距离通信正常、稍微拉远一点就丢包。我的建议是用外部3.3V稳压芯片单独给模块供电或者至少用一块电流输出能力充足的开发板并且电源引脚附近并一个100uF左右的电解电容。电平匹配也值得留意。E28的逻辑电平一般是3.3V如果你的主控是5V逻辑比如普通Arduino UNO需要做电平转换否则长时间直接怼上去有烧引脚的风险。ESP32、RP2040这些3.3V单片机以及MicroPython常见的主控板都没这个问题。2.3 MicroPython固件与驱动选择ESP32-S3刷MicroPython固件这一步官方文档写得很清楚。下载对应板型的固件后用esptool先擦除再烧写即可命令大概是esptool.py --chip esp32s3 --port /dev/ttyUSB0 erase_flash esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 460800 write_flash -z 0x0 ESP32S3_GENERIC-20240602-v1.23.0.bin烧完之后用Thonny或者mpremote连接REPL能正常执行print(hello)就说明环境OK。驱动方面因为我用的是SX126x芯片的模块我选择了micropySX126x这个开源库它对SX1262/SX1268的支持比较完整包含了begin初始化、send发送、receive接收、get_rssi读信号强度这些接口。如果你用的是E28-2G4M20S这种2.4GHz频段的型号它的射频芯片是SX1280驱动完全是另一套千万别搞混。库的安装也很简单把整个仓库拖进板子的文件系统里然后在REPL里import试一下from machine import Pin, SPI import SX126x这里不同版本的库导入路径略有差异一般以你下载的那个仓库的示例代码为准。装好之后先写一个最简初始化脚本验证硬件连接是否有问题from machine import Pin, SPI from micropySX126x.sx126x import SX126x spi SPI(1, baudrate1000000, polarity0, phase0, sckPin(13), mosiPin(11), misoPin(10)) cs Pin(12, Pin.OUT) rst Pin(14, Pin.OUT) dio1 Pin(9, Pin.IN) lora SX126x(spi, cs, dio1, rst, gpio_chipesp32s3) lora.begin(freq915, bw125000, sf7, cr5, syncWord0x12, power22, currentLimit140, preambleLength8, implicitFalse, crcOnTrue, txIqFalse, rxIqFalse) print(SX126x init done)这段代码核心是begin方法里那堆参数freq是中心频率单位MHzbw是信道带宽125000就是125kHzsf是扩频因子我用的是7属于兼顾速率和距离的默认值cr是编码率5表示4/5power是发射功率单位dBmsyncWord是同步字通信双方必须一致才能互通。如果这一串配置能顺利执行完不报错硬件连接基本就没问题了。3. 透传模式与定点传输模式的实现3.1 先把模块配置到透传模式E28这类串口模块最常见的用法不是走SPI直读寄存器而是通过串口透传。虽然两种模式都能通信但透传模式更适合快速把链路跑起来验证距离和信号。透传模式下模块工作参数的配置有两种途径一种是直接发AT指令另一种是用亿佰特官方的配置软件通过USB转TTL连接模块在图形界面里设置地址、信道、空中速率、发射功率这些参数。我个人的建议是第一次用的时候先用官方配置软件把所有参数理清楚后续再用AT指令做动态修改因为AT指令集在不同批次、不同型号之间偶尔会有细微差异软件配置反而最不会出错。假设你通过配置软件把两个模块都设置好了模块地址设成相同比如都是0x0001信道也都一致空中速率选了一个适中的档位那透传的代码就极其简单了。ESP32上开一个UART往里面写数据就行from machine import UART, Pin uart UART(1, baudrate9600, txPin(43), rxPin(44)) uart.write(bhello from esp32)对端模块的串口只要接在另一块ESP32上同样以9600波特率读取就能收到完整的5个字节。整个过程中LoRa的调制解调、扩频、纠错全部由E28模块自己完成MicroPython端不感知任何射频细节。透传模式最适合的验证场景是链路距离测试。你可以把一台设备放在固定点另一台拿着往远处走串口发递增序号对端记录收到的序号连续性。这样就能快速判断在某个距离和环境下链路是否可靠。很多朋友第一版测试喜欢直接传自己的业务数据我建议先跑序号因为序号能立刻暴露丢包和乱序比看业务数据直观得多。3.2 切换到定点传输模式当你开始挂多个节点的时候透传模式就不够用了。所有模块如果都在同一个信道上广播A发给B的数据C也会收到即使C在业务上不需要也要在软件层做过滤。定点传输模式就是为了解决这个问题。定点传输模式的配置重点是“目标地址”。有些E28型号需要在AT配置里指定一个静态目标地址之后所有串口数据都会发给这个地址有些型号则支持在数据帧头部动态携带目标地址这样同一个模块发数据时每帧可以指定不同的接收方。以后者为例数据帧格式大致是目标地址高字节目标地址低字节负载数据发送方在业务数据前面拼上接收方地址的两个字节模块会把整个帧发出去对端模块检查帧头地址匹配自己的模块地址就上抛数据不匹配就丢弃。这样A发给B的数据C即使在同一信道也不会收到因为地址对不上。代码实现思路就是给发送函数包一层def send_to(addr: int, payload: bytes, uart: UART): frame addr.to_bytes(2, big) payload uart.write(frame)接收端的处理更简单因为模块硬件已经把不匹配的帧过滤掉了串口收到的就是纯负载数据不需要再解析地址。如果你要支持广播一般把目标地址设成0xFFFF即可。我实测下来定点传输模式在多节点场景下最大的好处不是“省流量”而是让接收端的业务逻辑变得干净。收到数据就处理不用关心是不是发给自己的因为模块已经筛过一遍了。但在做固件开发之前一定要仔细阅读你手上那个E28型号的数据手册确认它是静态目标地址还是动态帧头地址这两种模式的代码写起来差别很大。3.3 参数怎么选SF、BW、功率的取舍不管你用透传还是定点传输LoRa链路的质量最终都取决于三个关键参数的搭配扩频因子SF、信号带宽BW和发射功率。这三个参数之间是典型的跷跷板关系。扩频因子SF决定了每个数据符号用多少比特来表示。SF越大信号抗干扰能力越强、接收灵敏度越高、通信距离越远但空中传输时间成倍增加实际吞吐率断崖式下降。举个例子同样大小的数据包SF7发送可能只需要几十毫秒SF12发送可能要几百毫秒甚至更久因为LoRa是低速率扩频通信扩频因子直接跟速率挂钩。信号带宽BW则相反带宽越宽速率越高但接收灵敏度会变差。125kHz和500kHz带宽相比后者的速率大概是前者的4倍但灵敏度会差好几个dB。发射功率这个参数最直观但也最容易让人产生误解。很多人觉得功率调得越大越好实际不是。功率大了模块发热增加、电池消耗加快而且近距离通信时过强的信号可能造成接收端饱和反而影响通信质量。我一般测链路的做法是先用中等功率比如20dBm配合SF7、125kHz带宽去测如果近距离能通、远距离丢包再逐步调到SF9或者SF12最后才考虑加大功率。这个顺序能帮你判断链路瓶颈到底在速率策略上还是射频功率上。配置组合速率参考灵敏度参考典型场景SF7 / 125kHz较高约-123dBm中等距离、数据量稍大SF9 / 125kHz中等约-129dBm距离优先、数据量小SF12 / 125kHz很低约-137dBm极限远距离、秒级频率小包SF7 / 250kHz高约-120dBm近距离、需要更高速率这套参数没有绝对最优完全取决于你的现场环境。我能给的建议只有一个先建立链路再优化参数不要一开始就追求极限配置。4. RSSI测试从原理到实测记录4.1 RSSI读的是哪一路信号RSSIReceived Signal Strength Indicator接收信号强度指示是衡量无线链路质量最直观的指标之一。但很多新手第一次看到RSSI数值就懵了因为SX126x芯片实际上提供好几种RSSI含义完全不同。第一种是信道当前RSSI你可以理解成当前频点上环境噪声加上所有信号的综合电平。这个值在空闲状态下读出来反映的是信道背景噪声水平。如果这个值本来就很高比如-85dBm那说明这个频点很“脏”真正有用的信号容易被淹没。第二种是数据包RSSI也就是收到一帧有效数据时芯片测到的该帧信号强度。这才是我们判断通信距离和链路质量最关心的数字。SX126x在接收完成后会把最近一包数据的RSSI和SNR信噪比存到状态寄存器里MicroPython驱动里一般封装成get_rssi()类似的方法。第三种是SNR信噪比。它表示信号和噪声的比值单位为dB。在LoRa这种扩频系统里SNR可以出现负值因为扩频增益可以让信号在噪声之下被解调出来。这也是LoRa相比传统FSK的一大优势——它能在信噪比为负的情况下仍然成功接收。我这次测试重点关注的是数据包RSSI和SNR。数据包RSSI用来评估“信号够不够强”SNR用来评估“信号在噪声里清不清晰”。两个指标结合起来看比单看一个数字可靠得多。4.2 实测步骤与记录方法RSSI测试要做得有参考价值就必须有统一的测试方法和仔细的记录。我的测试流程是这样的。先固定好发送端。发送端用一块ESP32加E28模块放在一个位置固定的桌子上天线用支架立起来保持竖直。代码里用定时器每隔一秒发一包16字节的数据数据内容包含一个自增序号和时间戳。接收端也是同样的硬件组合放在移动端用移动电源供电靠串口把接收结果打出来同时记录RSSI和SNR。然后是移动测量。每到一个测试点先让接收端稳定30秒让自动增益控制收敛然后连续接收50包数据统计每包的RSSI和SNR算出平均值再统计丢包数。关键要记录的信息包括距离、环境描述空旷/有树遮挡/过墙角、平均RSSI、平均SNR、丢包率。我当时的记录表大致是这样距离(m)环境平均RSSI(dBm)平均SNR(dB)丢包率10室内同房间-4210.50%50室外空旷-618.20%150室外穿过一排树-824.10%300室外视野遮挡-98-1.52%500室外转弯处-109-6.318%这张表的数据是我从真实测试里归纳出来的典型走势具体数值会因为你用的天线、发射功率、频段和环境不同而有明显差异但趋势是一致的距离越远RSSI越差SNR跟着变差最后丢包率上升。有几个测试细节容易被忽略。第一天线极化方向要保持一致发送端天线竖直接收端天线也尽量竖直一旦一端天线横过来信号可能掉十几个dB。第二高度差对结果影响很大接收端贴着地面和举到1.5米高度RSSI能差出20dB以上因为地面反射和多径效应在近距离影响非常剧烈。第三人体本身会吸收和反射射频信号测试时人尽量站在接收端天线侧后方不要挡在天线和发送端之间。4.3 实测数据怎么看几个关键判断标准拿到一组RSSI数据之后怎么判断链路是否健康我一般看三个维度。第一个维度是接收灵敏度余量。模块在给定参数下的灵敏度是固定的比如SF7/125kHz下SX126x的典型灵敏度约-123dBm。你测到的RSSI只要比这个底噪高出10~15dB以上链路就是比较健康的。如果测到-110dBm虽然距离灵敏度极限还有十几dB的余量但已经进入危险区稍微有点环境波动就会掉包。第二个维度是SNR趋势。正常空旷环境下SNR随着距离增大缓慢下降但如果某段距离上SNR断崖式下跌而RSSI变化不大大概率是多径衰落或者出现了同频干扰。这种情况下靠加大发射功率改善有限更应该考虑调整天线位置、方向或者换频点。第三个维度是RSSI标准差。在一个固定测试点连续收几十包如果RSSI波动超过5dB说明信道不稳定可能是附近有人走动、树木被风吹动、或者汽车经过造成的信号反射变化。稳定的链路RSSI值应该非常平稳波动一般在2dB以内。如果你懂一些射频基础可以参考自由空间路径损耗公式大致估算理论值FSPL(dB) 20 * log10(d) 20 * log10(f) 32.44其中d是距离单位kmf是频率单位MHz。比如915MHz、100m距离的理论损耗大约是20log10(0.1) 20log10(915) 32.44算出来约71.6dB。如果你的发射功率是20dBm天线增益先忽略那理论接收功率就是20 - 71.6 -51.6dBm左右。实际测试因为有地面反射、树木吸收、天线效率损耗测到的RSSI一般会比理论值差10~20dB。这个公式的价值在于帮你建立“合理预期”当实测值异常差的时候你能判断出是链路本身问题还是模块硬件问题。5. 常见问题与排查技巧实录5.1 收发不到数据的排查顺序这是LoRa模块项目里出现频率最高的问题。我见过很多朋友一上来就问代码怎么写结果排查到最后发现是地址没对上。这里我整理了一个排查顺序按这个顺序走绝大多数问题能在十分钟内定位。先说现象再给原因。现象可能原因解决办法完全收不到任何数据地址或信道不一致核对两端模块地址、信道、空中速率完全收不到任何数据天线没接或接错频段检查SMA座是否拧紧天线频段是否匹配完全收不到任何数据SPIDIO1引脚配置错误核对DIO1是否接对驱动里中断引脚是否对应近距离能通稍远就丢包发射功率设置过低检查power参数适当提升到20~22dBm能收到但RSSI明显偏低天线极化不一致两端天线保持同一朝向间歇性丢包电源供电不足单独供电或加大电容接收端概率性漏数据空中速率与串口速率不匹配确认模块空中速率与上位机读取速度匹配实际处理这类问题我强烈建议用一个最简单的测试程序一端每1秒发一个固定字符串另一端收到后立刻打印。代码越简单变量越少排查越容易。不要一上来就写完整的业务协议协议层的问题会掩盖射频层的问题让你误判故障点。5.2 RSSI数值异常的几种情况有时候数据能正常收发但RSSI数值看起来不对劲这时候要分情况分析。如果RSSI高出预期比如几十米距离测出来才-30dBm这通常会发生在发送端功率开得很大的情况下。近距离下高功率信号会让接收端进入饱和区RSSI读数反而不准而且可能伴随偶发误码。解决办法很简单近距离测试时把发射功率降到10dBm左右更符合实际近距离场景。如果RSSI异常偏低比如明明只隔了十米RSSI却测到-90dBm优先怀疑天线。很多模块的天线是SMA接口的拧的时候没对准螺纹看起来接上了其实内针没顶到插座上这种情况信号衰减能到30dB。还有一种常见情况是用了错误频段的天线比如433M模块接了915M天线虽然接口能拧上但天线在错误频段上效率极低通信距离惨不忍睹。另外RSSI读数在MicroPython下偶尔会有“跳变”现象同一个位置连续测几十包有时候会冒出个别异常值这通常是模块的AGC还没收敛或者环境中出现了突发干扰。处理方式是在软件里做中值滤波或者取平均值不要用单包数值做判断。5.3 MicroPython环境下的独有坑用MicroPython做LoRa应用开发效率确实比C语言高很多但有些坑是Python这个运行时环境特有的。第一个坑是垃圾回收引起的时序抖动。MicroPython的垃圾回收器会在内存紧张时暂停执行这个暂停时间最长可能几十毫秒。如果你的代码在发送循环里GC一暂停还没来得及读取DIO1中断标志下一包数据就到了就会出现“漏包”现象。解决办法一是尽量少创建临时对象把发送数据的buffer提前分配好二是在对实时性要求高的逻辑里使用machine.disable_irq()暂时关闭中断核心操作完成后再打开。不过关中断会阻塞系统只适合极短的关键区不要长时间使用。第二个坑是SPI速率问题。SX126x芯片手册里写的SPI最大时钟很高但实际在MicroPython环境里驱动开销和杜邦线的物理性能都会限制速率。我实测下来1MHz的SPI时钟最稳定2MHz偶尔会在长线缆下出数据错误4MHz以上基本不可靠。如果拔高SPI速率后通信开始出问题先降回1MHz试试大概率能解决。第三个坑是DIO1中断回调函数的写法。MicroPython里GPIO中断回调函数里不能做太重的操作比如不能发送数据、不能申请大内存。正确的做法是回调函数里只置一个标志位主循环检测到标志位后再去做接收处理。received_flag False def dio1_callback(pin): global received_flag received_flag True dio1.irq(triggerPin.IRQ_RISING, handlerdio1_callback) while True: if received_flag: received_flag False msg, err lora.receive() rssi lora.get_rssi() print(msg, rssi)5.4 关于FSK模式的扩展想法SX126x芯片本身支持LoRa和FSK两种调制方式E28模块有些型号允许你通过配置切换到FSK模式。LoRa的优势是灵敏度高、抗干扰强、适合低速远距离FSK的优势是速率可以做得更高、频谱利用率更直接。我个人的判断是这个切换选项在常规项目里用到的概率不大。因为E28模块出厂通常默认LoRa模式各种软件工具和文档也是围绕LoRa展开的你非要去切FSK就得自己啃芯片手册性价比不高。除非你的需求是在近距离传相对大一点的数据块同时对距离要求不高那FSK值得研究一下。大多数传感器数据回传场景老老实实用LoRa就够了。如果你确实要做LoRa和FSK混合的协议那就不能用现成的串口透传模式了必须走SPI直连芯片在代码里切换调制方式。这个复杂度等于自己做射频驱动建议有足够时间和精力再上。最后再分享两个我从测试里总结出来的小技巧。第一个是所有测试数据包里一定要带上序号和发送时间戳。这样接收端不仅能看收到没有还能分析丢包间隔、时延变化。我最初测试时只发固定字符串丢包只能看到一个“丢了”但不知道是哪一包丢的后面加上了自增序号问题定位效率翻倍。第二个是测试前把所有可能松动的物理环节都拧紧。天线座、杜邦线、模块的排针任何一个虚接都能让信号表现忽好忽坏干扰你的判断。我踩过最冤的一次坑就是天线内芯没顶到位白白浪费了半天时间排查软件最后发现是物理接触不良。这套E28加MicroPython的LoRa测试链路从快速验证链路到读RSSI评估信号质量再到透传和定点传输切换整个流程走通之后再去做具体的物联网项目心里就有底了。如果你正在做类似的事情希望这篇文章能帮你绕开我踩过的这些坑。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进