ESP32(M5Stamp Pico)同时使用SoftwareSerial与BluetoothSerial编译报错求助
问题背景
自制搭载M5Stamp Pico与LoRa模块的电路板,需在21、22引脚通过SoftwareSerial与LoRa通信,同时用蓝牙实现手机串口数据传输,但同时引入SoftwareSerial与BluetoothSerial库时出现编译错误:
C:\Path...\AppData\Local\Temp\arduino-sketch-C3A1C31318E964BF44FA1E35A7FE7344\libraries\espsoftwareserial-main\SoftwareSerial.cpp.o: in function std::function<void ()>::operator()() const':
c:\Path...\arduino15\packages\m5stack\tools\xtensa-esp32-elf-gcc\gcc8_4_0-esp-2021r2-patch5\xtensa-esp32-elf\include\c++\8.4.0\bits\std_function.h:686:(.iram1.66[_ZNK8delegate6detail12DelegateImplIPvvEclEv]+0x24): dangerous relocation: l32r: literal placed after use: .literal._ZNK8delegate6detail12DelegateImplIPvvEclEv
collect2.exe: error: ld returned 1 exit status
核心需求
- 在M5Stamp Pico的21、22引脚实现与LoRa模块的串口通信
- 同时实现手机与电路板的蓝牙串口数据传输
- 解决库兼容问题或找到可行的替代方案
已尝试方案
- 网上搜索相关错误解决方案,无效
- 测试其他蓝牙库,未找到支持串口传输的替代库
解决方案
方案1:修改SoftwareSerial库编译配置(快速修复)
该错误源于espsoftwareserial库的代码被分配到iram1内存段,与BluetoothSerial的内存布局冲突。修改库配置强制移出iram段:
- 找到Arduino库目录下的
espsoftwareserial-main文件夹 - 打开
library.properties文件,添加编译宏:
build.extra_flags=-DESP_SOFTWARE_SERIAL_NO_IRAM
- 清理Arduino项目缓存(菜单栏
项目→清理项目文件)后重新编译
方案2:用硬件串口替代SoftwareSerial(推荐)
M5Stamp Pico基于ESP32-Pico-D4,自带3个硬件串口,完全无需依赖SoftwareSerial,稳定性和性能更优。可通过引脚映射将硬件串口2指定到21、22引脚:
#include <BluetoothSerial.h> BluetoothSerial SerialBT; HardwareSerial radio(2); // 使用硬件串口2 void setup() { Serial.begin(115200); SerialBT.begin("M5Stamp_LoRa"); // 设置蓝牙设备名称 // 映射串口2到21(RX)、22(TX),波特率匹配LoRa模块参数 radio.begin(9600, SERIAL_8N1, 21, 22); } void loop() { // LoRa数据转发到蓝牙 if (radio.available()) { String loraData = radio.readStringUntil('\n'); SerialBT.println(loraData); } // 蓝牙数据转发到LoRa if (SerialBT.available()) { String btData = SerialBT.readStringUntil('\n'); radio.println(btData); } }
方案3:替换蓝牙库
若坚持使用SoftwareSerial,可尝试用ESP32 BLE Serial库替代BluetoothSerial(经典蓝牙)。BLE串口库的内存占用模式与SoftwareSerial冲突概率更低,且支持手机通过BLE串口助手实现数据传输。
内容的提问来源于stack exchange,提问作者Roman

