八百标兵奔北坡~ 2023-05-27 18:57 采纳率: 50%
浏览 63
已结题

esp32蓝牙传输数据

在使用代码时套用的是Arduino中的BLE代码,但是里面传输的是广播一个数字。
现在要将从模块里获得的实验数据通过蓝牙传送到手机里,而不是一个指定的数字,查了资料都是一些经典的,各位带佬指点一下!

img

  • 写回答

2条回答 默认 最新

  • 关注

    可以将从模块获得的实验数据作为变量传递给 BLECharacteristic.setValue() 函数。以下是如何修改你的代码来传递实验数据:
     
    首先,在 setup() 函数中定义数据变量:
     

    float data_value = 0.0;
    
    

    请注意,data_value的类型应该与你所传输的实验数据的类型相匹配。
     
    在 loop() 函数中获取实验数据,并将其存储在变量data_value中:
     

    // 示例代码,获取实验数据,并将其存储在变量中
    data_value = read_experiment_data();
    
    

    修改 sendData() 函数,将实验数据传递给蓝牙从设备。首先,将value变量定义为一个字符数组,用于存储实验数据的字符串表示:
     

    char value[20];
    
    

    请注意,数组的大小应该足够大,以容纳实验数据的字符串表示。
     
    将data_value转换为字符串,并将其赋值给value数组:
     

    dtostrf(data_value, 7, 2, value);
    
    

    dtostrf() 函数将 data_value 转换为字符串,并将结果存储在value中。请注意,第一个参数指定要转换的值,第二个参数指定整数位数,第三个参数指定小数位数,第四个参数指定结果存储在哪个字符串数组中。
     
    使用 setValue() 函数将value数组传递给蓝牙从设备。在这里,我们需要将value强制转换为uint8_t*类型:

    experimentCharacteristic.setValue((uint8_t*)value, strlen(value));
    
    

    注意,setValue()函数的第一个参数是一个指向要传输的数据的指针,第二个参数是数据的长度。
     
    完整代码如下:
     

    #include <BLEDevice.h>
    #include <BLEServer.h>
    #include <BLEUtils.h>
    #include <BLE2902.h>
    
    BLEServer* pServer = NULL;
    BLECharacteristic* experimentCharacteristic = NULL;
    bool deviceConnected = false;
    bool oldDeviceConnected = false;
    float data_value = 0.0;
    
    char value[20];
    
    class MyServerCallbacks : public BLEServerCallbacks {
        void onConnect(BLEServer* pServer) {
          deviceConnected = true;
        };
    
        void onDisconnect(BLEServer* pServer) {
          deviceConnected = false;
        }
    };
    
    void setup() {
      Serial.begin(115200);
    
      BLEDevice::init("Experiment");
      pServer = BLEDevice::createServer();
      pServer->setCallbacks(new MyServerCallbacks());
    
      BLEService* pService = pServer->createService(BLEUUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E"));
    
      experimentCharacteristic = pService->createCharacteristic(
                          BLEUUID("6E400002-B5A3-F393-E0A9-E50E24DCCA9E"),
                          BLECharacteristic::PROPERTY_NOTIFY |
                          BLECharacteristic::PROPERTY_READ   |
                          BLECharacteristic::PROPERTY_WRITE  |
                          BLECharacteristic::PROPERTY_WRITE_NR
                        );
                          
      pService->start();
                            
      BLEAdvertising* pAdvertising = BLEDevice::getAdvertising();
      pAdvertising->addServiceUUID(BLEUUID(pService->getUUID()));
      pAdvertising->setScanResponse(true);
      pAdvertising->setMinPreferred(0x0);  
      pAdvertising->setMinPreferred(0x12);
      BLEDevice::startAdvertising();
    }
    
    void sendData() {
      
      dtostrf(data_value, 7, 2, value);
      
      experimentCharacteristic->setValue((uint8_t*)value, strlen(value));
      experimentCharacteristic->notify();
      Serial.print("Sent Value: ");
      Serial.println(value);
    }
    
    void loop() {
    
      // 获取实验数据
      data_value = read_experiment_data();
      
      if (deviceConnected) {
        sendData();
      }
      
      delay(500);
    }
    

     
    在上面的代码示例中,read_experiment_data()是一个函数或方法,用于从模块获取实验数据。我们还是需要根据实际情况编写此函数。
    注意,由于蓝牙从设备需要以固定的速率接收数据,所以需要以合适的频率发送实验数据,以避免数据溢出或丢失。在上面的示例代码中,我们使用了delay(500)函数来控制发送数据的速率。可以根据需要或实验要求调整发送数据的频率。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月5日
  • 已采纳回答 5月28日
  • 创建了问题 5月27日

悬赏问题

  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频
  • ¥15 惠普360g9的最新bios
  • ¥30 这个功能用什么软件发合适?
  • ¥60 微信小程序,取消订单,偶尔订单没有改变状态
  • ¥15 用pytorch实现PPO算法
  • ¥15 关于调制信号的星座图?
  • ¥30 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢
  • ¥15 机器学习预测遇到的目标函数问题