MicroBit接收Reyax RYLR890/896 LoRa模块消息被截断问题求助
问题排查:Micro:Bit搭配RYLR890 LoRa模块接收消息截断
核心问题分析
消息截断大概率是串口接收缓冲区溢出或数据接收不完整导致的——Micro:Bit默认串口缓冲区容量有限(约64字节),加上onDataReceived的触发时机与数据传输节奏不匹配,容易出现丢字节的情况。
具体排查与修复步骤
1. 确认串口引脚连接方向
你代码中使用serial.redirect(SerialPin.P15, SerialPin.P14, ...),需严格对应LoRa模块的引脚:
- RYLR890的TX引脚 → Micro:Bit的P14(RX引脚)
- RYLR890的RX引脚 → Micro:Bit的P15(TX引脚)
若引脚接反,可能出现部分内容接收、部分丢失的情况,先确认接线无误。
2. 优化串口接收逻辑,避免缓冲区溢出
Micro:Bit的serial.readUntil(NewLine)在数据传输较快时,可能无法一次性读取完整内容,缓冲区满后会自动丢弃后续字节。建议改成逐字节循环读取的方式:
let messageRx = "" serial.onDataReceived(serial.delimiters(Delimiters.NewLine), function () { // 循环读取所有可用字节,直到遇到换行符 while(serial.available() > 0) { let char = serial.readString(1) if(char === "\n") break messageRx += char } parseRx(messageRx) // 重置接收缓存,准备下一次接收 messageRx = "" basic.clearScreen() basic.showIcon(IconNames.Happy) basic.clearScreen() })
3. 修复parseRx函数的字符串截取逻辑
你原代码中手动查找逗号的截取方式容易出错,比如substr的长度参数计算错误,或未处理消息中的换行/空白字符。改用split分割字符串更可靠:
function parseRx (message: string) { // 先去除首尾空白字符(包括换行、回车) message = message.trim() preamble = message.substr(1, 3) if (preamble == "RCV") { music.playTone(262, music.beat(BeatFraction.Whole)) // 用逗号分割AT命令返回的内容 let parts = message.split(",") // 确保分割后有足够的字段 if(parts.length >= 3){ sizeTx = parseInt(parts[1]) payload = parts[2] basic.showString("" + payload.length) if (payload.includes("WOR")) { basic.showIcon(IconNames.SmallHeart) } } } }
4. 调整串口波特率或发送间隔
尝试将串口波特率从9600降至4800,Micro:Bit的硬件串口对低波特率的处理更稳定;同时延长ESP32的消息发送间隔(比如5秒以上),给Micro:Bit足够的时间处理串口数据。
5. 校验LoRa模块参数一致性
确认发送端与接收端的RYLR890模块参数完全匹配:
- 频段(如433MHz/868MHz)
- 扩频因子(SF)
- 带宽(BW)
- 校验模式
参数不匹配会导致接收消息丢包或截断。
内容的提问来源于stack exchange,提问作者Sun Bee
相关产品推荐
相关产品推荐

