LoRa 点对点链路丢包,通常分两种情况:一种是近距离丢包率就很高,说明基础配置或硬件连接本身就有问题;另一种是近距离正常,拉远距离、装入外壳或连续发送一段时间后才开始丢包,说明问题出在链路余量或稳定性上。两种情况的排查方向完全不同,不能混在一起处理。
另外,丢包也不一定发生在无线链路上。接收端没收到完整数据,或者主机程序在读取和处理时遗漏,最终表现都一样,都是接收端少包。
所以排查的第一步,不是急着调射频参数,而是先记录几个基础数据:发送端实际发出了多少包、接收端完整收到了多少包、两端的基本配置、包长、发送间隔和测试距离。这些信息拿到手,基本就能判断问题出在哪一层,下一步该往哪个方向查。
本文统一按发包数和收包数计算丢包率:
丢包率 =(发包数 - 收包数)÷ 发包数 × 100%
本文讨论由两个 LoRa 模块组成的点对点通信链路,不覆盖 LoRaWAN 网关、回传和网络服务器。文中涉及两类模块,它们能提供的观察信息不同,排查时不要混用。
|
模块类型 |
本文示例 |
主机可以直接看到 |
|
SPI 收发模块 |
NiceRF LoRa2021 及其 LR2021 芯片 |
主机直接下发收发命令,可记录 TxDone、RxDone、IRQ、FIFO 和单包状态 |
|
透明 UART 数传模块 |
主机主要查看本机 UART 写入、对端 UART 输出和模块配置,通常看不到模块内部的 TxDone、RxDone 等状态 |
使用其他型号时,应按对应手册确认它属于哪一类,以及主机实际能读取哪些参数和状态。
1、近距离丢包率高
说明基础链路本身就没建立起来,问题通常出在配置或硬件连接上,跟射频性能关系不大。
1.1 核对两端的配置是否匹配
先按所用模块的手册核对可以设置的参数。SPI 收发模块和 UART 数传模块的配置入口不同,不使用同一张参数清单。
SPI 收发模块核对无线参数
第一轮核对频率、BW、SF、CR、包头模式和 CRC。以 LR2021 为例,使用隐式包头模式时还要核对固定载荷长度;使用显式包头模式时,确认接收端允许的最大长度不小于发送长度。基础参数一致后,若仍出现 CRC 错误、包头错误或收不到 RxDone,再查前导码、SyncWord、IQ、频率校准、超时和接收模式。
UART 数传模块核对无线和串口参数
先核对两端的工作频段、信道、空中速率、工作模式,以及手册要求两端必须一致的网络参数;LoRa6100Pro-mini 包括 NET ID。每个模块的串口参数都要和各自的本地主机匹配。启用 AES、CRC 或寻址时核对对应开关;若启用 AES 还需核对密钥,启用寻址则核对 ID。
不要只比较初始化代码,尽量读回两端当前生效值。LoRa6100Pro-mini 支持通过设置模式读回当前参数,具体操作见产品手册。使用其他 UART 型号时,按对应手册确认进入设置模式的方法和可读字段。
发现不一致时只修正对应项,然后按开头的基础测试条件(短距离、固定包长和固定间隔)复测。配置一致但问题没有变化,再进入与症状对应的章节。
1.2 用一轮简单测试判断丢在哪一段
SPI 收发模块先看发送和接收是否完成
如果 SPI 主机能看到每次无线发送和接收结果,就分别记录 TxDone、RxDone、CRC 错误和主机最终收到的包数,用来判断数据丢在发送、无线链路还是主机处理。总体丢包率仍按本章开头的发包数和收包数计算。如果重传由主机程序或 UART 数传模块固件实现,测试期间可先关闭重传,或把重传次数单独记录,避免重传掩盖底层链路问题。
|
现象 |
更可能出问题的位置 |
下一步 |
|
发送命令后没有 TxDone,或发送超时增加 |
SPI 时序、供电或发送控制 |
1.4 检查收发时序,2.2 检查供电 |
|
TxDone 正常,对端 CRC 或包头错误增加 |
参数差异、弱信号、干扰或频偏 |
先看1.1,再看2.1 |
|
TxDone 正常,对端没有 RxDone |
接收端未处于 RX 状态、参数不一致、链路问题或碰撞 |
1.1、1.2、2.1 |
|
RxDone 数接近发送数,主机程序收到的包数仍偏低 |
IRQ、FIFO、缓存或解析 |
1.3 |
TxDone 只说明本次发射流程已经结束,不能证明对端收到。
透明 UART 数传模块先看两端串口收发
透明 UART 数传模块通常看不到模块内部的重传、TxDone 和 RxDone。此时按本地主机的发包数和对端主机的收包数计算丢包率,不必寻找模块没有开放的内部状态。
|
现象 |
更可能出问题的位置 |
下一步 |
|
本机 UART 已完整写出,对端 UART 完整收到的包数仍偏低 |
无线配置、链路、碰撞或发送缓存 |
1.1、1.2、1.3、2.1 |
|
对端 UART 出现半帧、帧边界错位或时延逐包增长 |
串口参数、组包、缓存或输入过快 |
1.3 |
两类模块都适用的对照现象
|
现象 |
更可能出问题的位置 |
下一步 |
|
增大发包间隔后明显恢复 |
接收端没有及时重新进入 RX、主机阻塞或缓存来不及处理 |
1.2、1.3 |
|
单节点正常,多节点同时发送才丢 |
同信道同时发射冲突或调度问题 |
1.4 |
|
A→B 明显差于 B→A |
单侧供电、天线、馈线或射频前端 |
2.2 |
|
近距离高功率异常,降功率或拉开距离后恢复 |
接收输入电平或射频前端 |
2.1 |
1.3 检查主机接口与数据处理
SPI 收发模块检查 IRQ、FIFO 和主机处理
对 LoRa2021/LR2021,每次接收结束后,用 GetLoraPacketStatus 保存最近一包的 SNR、包 RSSI 和载荷长度;启用多 SF 接收时,再记录由哪个检测器收到该包。一轮测试结束时,用 GetLoraRxStats 读取并对照接收包总数、CRC 错误、包头错误和错误同步(false sync)的计数增量。
主机处理按下面的顺序查:
核对 DIO 与 IRQ 映射,以及 IRQ 的读取和清除顺序;
每次 RxDone 后先取得包长,再及时读出 FIFO;
对照 RxDone、FIFO 完整读取、应用校验通过和主机程序收到数据四个计数;
如果程序使用接收队列,再增加成功入队数;
不把 FIFO 中有数据直接算成有效消息。LR2021 的接收 FIFO 为 256 字节,CRC 错误数据也会写入 FIFO,仍要结合 IRQ、应用层校验结果和消息 ID 或序号判断。
如果 RxDone 数仍接近发送数,而 FIFO 完整读取数或主机程序收到的包数开始落后,说明大部分包已经到达接收芯片,问题出在主机读取、解析或缓存阶段。如果需要确认主机处理速度是否跟不上,可缩短包间隔或临时增加主机负载;问题随之加重时,就继续检查读取、解析和缓存。
透明 UART 数传模块先做回环,再检查缓存和帧边界
透明 UART 数传模块通常看不到模块内部的 TxDone、RxDone 等状态。LoRa6100Pro-mini 的 Non MESH 模式会把本机串口数据经无线转发到对端串口。主机首先能确认的是本机 UART 是否完整写出,以及对端 UART 是否完整收到数据。
先做有线回环,检查主机 UART、驱动、电平转换和接线。第一轮只确认 UART 是否完整写出、接收缓冲区是否溢出。出现半帧、校验失败或时延累积后,再检查帧边界和任务调度延迟;使用 DMA 接收时,同时检查 DMA 是否按预期完成。

LoRa6100Pro-mini 典型应用电路。排查前先核对主机与模块共地、TXD/RXD 连接,以及 CS、SET 的状态。
若主机持续写入串口的速度高于 LoRa6100Pro-mini 按当前空中速率转发的速度,待发送数据就可能来不及完整转发。先降低应用发送速率;如果问题缓解,再分别改变报文长度和包间隔。开启 LBT 后,信道持续忙会延后发送,主机也应相应控制写入速率,避免待发送数据超出缓存容量。
复测时观察端到端时延是否逐包增长。如果时延持续累积,就继续降低输入速度,并检查模块和主机缓存是否积压。
1.4 连续发送、多节点或 SPI 没有 TxDone 时检查收发时序
两类模块增大发包间隔后恢复
先增大发包间隔。如果丢包明显减少,再按模块类型补充时间记录。第一轮不必给每个环节都加时间戳。
SPI 收发模块按时间记录主机发出发送请求、TxDone、对端 RxDone、FIFO 读取完成、主机程序收到数据以及重新进入 RX。
UART 数传模块记录本机 UART 写完和对端 UART 完整收到数据的时间。
若 SPI 收发模块能读到接收状态,且某个丢包的发生时刻落在接收端尚未重新进入 RX 的时段内,就修正接收流程或加大发包间隔。以 LR2021 为例,SetRx 的单次接收模式在收到一包后会回到配置的 fallback mode(即预先设置的后续状态);连续接收模式会自动继续搜索新包。模式选错或接收结束后没有及时重新下发接收命令,都会使接收端在一段时间内不处于 RX,错过这期间到达的数据包。其他芯片应按各自的接收模式定义处理。
UART 数传模块看不到上述芯片状态时,不按 TxDone、RxDone 或 SetRx 排查。增大发包间隔后恢复的,转到1.3 检查串口输入速度、缓存和帧边界。
两类模块都要检查主机任务中是否有长时间关中断、阻塞式日志、Flash 擦写或高优先级任务。确认这些动作与丢包同时出现后,再处理对应任务,不必一开始就为所有任务增加日志。
SPI 收发模块发送命令后没有 TxDone
LoRa2021 提供 SPI、BUSY 和 DIO7/8/9 信号,主机可据此记录命令、忙状态和收发事件,相关引脚定义见产品规格书。

LoRa2021 模块引脚位置,可据此核对 SPI、BUSY、复位和 DIO 接线。
对 LoRa2021/LR2021,先按时间顺序记录主机发出发送请求、BUSY 释放、SetTx 以及 TxDone 或 Timeout。BUSY 变低后再发送 SPI 命令,并在下一条响应中检查上一条命令状态和 CmdError,确认 SetTx 已被芯片接受。命令已被接受但没有 TxDone 时,再确认是否出现 Timeout,并核对 DIO/IRQ 映射、发送超时参数以及 IRQ 的读取和清除顺序。
如果发射同时出现复位、BUSY 异常或模块端电压跌落,转到2.2 检查供电。
两类模块单节点正常,多节点同时发送才丢
先只开一个发送节点,再开启第二个节点,最后让两个节点错开发送。如果单节点稳定、同时发送恶化、错开后恢复,问题更像同时发射冲突或调度,而不是链路距离。
LR2021 的 CAD 依靠 LoRa 相关性检测,可配置为只检前导码或检测任意 LoRa 符号,并支持多个 SF 并行;但它只识别 LoRa 信号,对非 LoRa 或邻道干扰会判为空闲,因此适合用于 CSMA 类的发送前避让。要按能量门限判断信道是否被占用(含非 LoRa 干扰)或满足 LBT 法规要求,应使用基于 RSSI 的通用 CAD 或模块自带的 LBT 功能。是否存在同时发射冲突,仍由单节点、同时发送和错开发送三轮对照判断。修正时可选择轮询、固定时隙、错开发送或有限随机退避。
2、近距离正常,远距离或特定条件下丢包
近距离没问题,拉远距离、装外壳或连续发送后才丢包,说明基础链路是通的,问题出在链路余量或稳定性上。
2.1 丢包随距离、信道或温度变化时检查无线链路
距离、遮挡或姿态改变后变差
这种情况首先要判断的是:链路余量够不够。
如果模块能输出每包的 RSSI,拿丢包前后已收到数据包中较低的 RSSI,跟当前配置对应的接收灵敏度比较,就能算出链路余量还剩多少。SNR 单独观察变化趋势,不参与余量计算。注意只选与当前频率、带宽和扩频因子对应的灵敏度规格行,不同配置下差别很大。
余量不足(RSSI 接近或低于灵敏度):提高扩频因子或减小带宽可以改善接收灵敏度,但代价是空中时间变长、时延增大、空中速率降低;增加编码冗余也会延长传输时间并增加能耗,要根据实际需求取舍。
余量充足但仍然丢包:问题大概率不在链路预算上,转去查天线安装、匹配或射频前端。
如果模块不能输出每包 RSSI,用短距离测试、距离变化和天线姿态做对照就行
丢包随信道、时段或位置变化
短距离测试稳定,丢包率却随信道或时段明显变化,优先查现场干扰。
手边有频谱仪或接收机时,直接扫一下当前频段,看非 LoRa 信号、宽带信号或邻道信号分别出现在哪个频率、占用多宽带宽、持续多久,干扰来源基本就能定位。
没有仪器时,用对照法排查:硬件不动,先换信道复测,再换时段,最后才动安装位置或天线姿态。SPI 收发模块同时比较 TxDone、RxDone 和错误计数;透明 UART 数传模块比较本机发送数和对端完整收包数。模块能输出 RSSI/SNR 或错误计数时一并保存。换信道后丢包率明显变化,说明干扰集中在某个频段;换时段后变化明显,说明干扰源是间歇性的。
只在窄 BW 或温度变化时出现
这种情况大概率是频率偏了。BW越窄,对频率精度的要求越高,稍微偏一点就可能收不到。温度变化也会影响晶振频率,所以问题会跟着温度走。
先换一对已知正常的模块复测,或者在其他条件不变的情况下换到更宽的带宽试试。如果换宽带宽就好了,基本可以确认是频率基准的问题。
确认之后,核对两端的实际载频、晶振或 TCXO 配置,以及频率校准流程是否正确。有条件的话,用仪器测一下实际载频偏了多少。频率基准有问题就得校准或更换振荡源,靠提高扩频因子是绕不过去的。
近距离高功率时反而异常
保持其他条件不变,降低发射功率或逐步拉开两端距离。只有丢包率随之下降时,才按目标芯片和射频前端规格检查接收端允许的输入电平、外部增益和板级射频路径。结果没有变化时,回到开头按现象重新分流,再查1.1 的参数、1.2 的接收状态或1.3 的主机处理。
2.2 发射时复位、装壳后变差或只有一个方向差
发射时复位或 SPI 没有 TxDone
没有示波器时,先换用已知正常的供电方案做对照。现象随供电变化时,再测模块 VCC 引脚附近的发射瞬态电压。
SPI 收发模块记录最低电压是否与 TxDone、Timeout、BUSY 异常或复位同时出现。
UART 数传模块记录最低电压是否与串口停止输出或模块复位同时出现。
LoRa2021 的工作电压范围为 1.8~3.6 V。若开始发射时出现电压跌落,再按目标频段、功率档、规格书和参考设计检查去耦与电源裕量。
裸板正常,装入外壳后变差
天线应在最终装机状态下检查。先确认天线频段、连接器、馈线和 50 Ω 射频路径,再分别改变极化方向、离地高度以及人体或金属遮挡。LoRa2021 的 Sub-GHz 与 2.4G/S_ANT 天线端口分别引出,应按当前规格书核对所用频段与天线端口。
A→B 明显差于 B→A
方向差异可能来自 A 端发射链路,也可能来自 B 端接收链路。分别交换天线、馈线、连接器和供电,每次只换一个部件。如果故障跟随某个部件移动,就继续检查该部件或对应射频路径。
3、修正后先快速复测, 再做正式验收
每次只改一项,然后回到开头的基础测试条件(短距离、固定包长和固定间隔),比较修改前后的发包数、收包数和丢包率。结果没有变化时,恢复原来的设置,再检查其他原因;结果明显改善时,再重复一轮确认。
找到原因后,再按项目要求确定最大允许丢包率、允许的最长连续丢包、发包数、测试时长和重复轮次,作为最终验收条件。
我们公开的 LoRa2021 距离测试 提供了一份发包数和收包数记录示例:测试使用 860.5 MHz、21 dBm ±1 dB、SW868-ZD210 天线和 10 字节载荷,每组发送 100 包。在 876 m、1.4 km 和 1.8 km 三个测试点,SF10、BW 125 kHz 这一组均记录为 100/100。项目复测可沿用这种记录格式,并按实际安装场景设定目标距离和通过门槛。

LoRa2021 点对点距离测试现场。记录测试板、天线、安装位置和周边环境,复测时才能按相同条件比较结果。
参考文献
[1] Semtech. LR2021/22 Datasheet v2.1
[2] Semtech. SX1261/SX1262 Datasheet
[3] Semtech. AN1200.22 LoRa Modulation Basics (Rev.2, May 2015)
[4] Semtech. AN1200.48 LoRa Channel Activity Detection (CAD) with SX126x
[5] Semtech. AN1200.59 Selecting the Optimal Reference Clock v1.7
[6] Semtech. AN1200.37 Recommendations for Best Performance (Thermal Relief)
[7] NiceRF LoRa2021 全频段无线通讯模块 规格书 V1.3