ESP32启用BLE时控制Dynamixel XL320电机编译错误求助
ESP32控制Dynamixel XL320的蓝牙兼容问题解决方案需求
核心需求
- 基于ESP32实现多台Dynamixel XL320电机控制,需完成三个功能:
- 向电机发送控制数据(控制模式、目标速度等)
- 读取电机状态数据(当前位置、当前速度等)
- 通过蓝牙与ESP32进行通信
库兼容问题
找到两类相关库,但均无法满足全部需求:
- 第一类:基于
BluetoothSerial库,可实现电机控制与蓝牙通信,但无法读取电机的RX串口数据 - 第二类:支持电机的读写操作,但严重依赖
SoftwareSerial库,与BluetoothSerial存在兼容性冲突,编译时触发以下错误:
C:\Users\nicol\AppData\Local\Temp\arduino_build_322778\libraries\EspSoftwareSerial\SoftwareSerial.cpp.o: In function `std::function<void ()>::operator()() const': C:\Users\nicol\Documents\Arduino\libraries\EspSoftwareSerial\src/SoftwareSerial.h:188:(.iram1.54[delegate::detail::DelegateImpl<void*, void>::operator()() const]+0x22): dangerous relocation: l32r: literal placed after use: .literal._ZNK8delegate6detail12DelegateImplIPvvEclEv collect2.exe: error: ld returned 1 exit status Usando librería BluetoothSerial con versión 1.0 en la carpeta: C:\Users\nicol\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\BluetoothSerial Utilizando biblioteca Arduino-Dynamixel-XL320-master en carpeta: C:\Users\nicol\Documents\Arduino\libraries\Arduino-Dynamixel-XL320-master (legacy) Usando librería EspSoftwareSerial con versión 7.0.1 en la carpeta: C:\Users\nicol\Documents\Arduino\libraries\EspSoftwareSerial exit status 1 Error compilando para la tarjeta ESP32 Dev Module.
触发错误的最简测试代码
// ###########BLE COMM########## #include "BluetoothSerial.h" #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED) #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it #endif BluetoothSerial SerialBT; //############SERVO COMM############# #include "Dynamixel-XL320.h" DynamixelXL320 xl320(21, 19); void setup() { Serial.begin(9600); ////// BLE SerialBT.begin("Robot_centipede"); //Bluetooth device name ////// servos xl320.begin(DynamixelXL320::Baud::BAUD_57600); } void loop() { }
尝试过的修改方案
尝试将第二类库中的SoftwareSerial替换为ESP32原生的HardwareSerial,但库中部分依赖中断的核心函数(如下所示)逻辑复杂,修改后无法正常读取电机数据:
void SoftwareSerial::enableRx(bool on) { if (m_rxValid && on != m_rxEnabled) { if (on) { m_rxLastBit = m_pduBits - 1; // Init to stop bit level and current tick m_isrLastTick = (microsToTicks(micros()) | 1) ^ m_invert; if (m_bitTicks >= microsToTicks(1000000UL / 74880UL)) attachInterruptArg(digitalPinToInterrupt(m_rxPin), reinterpret_cast<void (*)(void*)>(rxBitISR), this, CHANGE); else attachInterruptArg(digitalPinToInterrupt(m_rxPin), reinterpret_cast<void (*)(void*)>(rxBitSyncISR), this, m_invert ? RISING : FALLING); } else { detachInterrupt(digitalPinToInterrupt(m_rxPin)); } m_rxEnabled = on; } }
寻求的解决方案
需要一款不依赖SoftwareSerial、可与BluetoothSerial兼容,且支持ESP32对Dynamixel XL320电机进行读写操作的库,或可行的库修改方案。
内容的提问来源于stack exchange,提问作者Satna
相关产品推荐
相关产品推荐

