数码之家

 找回密码
 立即注册
搜索
查看: 826|回复: 1

[Arduino] 菜鸟问题:ESP32S蓝牙为什么发同一个值?TX传的是不同值啊

[复制链接]
发表于 2022-3-18 22:29:17 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题是这样的,先上图:
手机端接收的,发现接收的notify都是同一个值:00 01 01 00 C0 C8 FD 3F 54 C0 FD.....3F 00 00 00 00
fe5b941d9408e2099719ad2689cfeaa0859422bf_2_337x750.jpeg.jpg
切回utf-8,就变成乱码了,变成这样:
59bdd35d3d49eaed8a7cdc4dd19cd22fe327a6f1_2_337x750.jpeg.jpg

由于我是菜鸟,只懂arduino软编程,C语言也只是略懂

蓝牙代码是用ESP32 example文件改来的,分析了很久没分析出什么,只好向高手求助了(;´༎ຶД༎ຶ`)

以下是代码:

#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
BLEServer *pServer = NULL;
BLECharacteristic *pTxCharacteristic;
bool deviceConnected = false;
bool oldDeviceConnected = false;
uint8_t txValue = 0;

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID
#define CHARACTERISTIC_UUID_RX "f78ebbff-c8b7-4107-93de-889a6a06d408"
#define CHARACTERISTIC_UUID_TX "ca73b3ba-39f6-4ab3-91ae-186dc9577d99"

class MyServerCallbacks : public BLEServerCallbacks
{
  void onConnect(BLEServer *pServer)
  {
    deviceConnected = true;
  };

  void onDisconnect(BLEServer *pServer)
  {
    deviceConnected = false;
  }
};

class MyCallbacks : public BLECharacteristicCallbacks
{
  void onWrite(BLECharacteristic *pCharacteristic)
  {
    std::string rxValue = pCharacteristic->getValue();

    if (rxValue.length() > 0)
    {
      Serial2.println("*********");
      Serial2.print("Received Value: ");
      for (int i = 0; i < rxValue.length(); i++)
        Serial2.print(rxValue[i);

      Serial2.println();
      Serial2.println("*********");
    }
  }
};
void setup()
{
  Serial1.begin(250000, SERIAL_8N1, 3, 1);
  Serial2.begin(250000, SERIAL_8N1, 16, 17);

  // Create the BLE Device
  BLEDevice::init("UART Service");

  // Create the BLE Server
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());

  // Create the BLE Service
  BLEService *pService = pServer->createService(SERVICE_UUID);

  // Create a BLE Characteristic
  pTxCharacteristic = pService->createCharacteristic(
      CHARACTERISTIC_UUID_TX,
      BLECharacteristic::PROPERTY_NOTIFY);

  pTxCharacteristic->addDescriptor(new BLE2902());

  BLECharacteristic *pRxCharacteristic = pService->createCharacteristic(
      CHARACTERISTIC_UUID_RX,
      BLECharacteristic::PROPERTY_WRITE);

  pRxCharacteristic->setCallbacks(new MyCallbacks());

  // Start the service
  pService->start();

  // Start advertising
  pServer->getAdvertising()->start();

  Serial2.println("\nSet Serial1 ok!");
  Serial2.println("Waiting a client connection to notify...");
}

void loop()
{
  if (deviceConnected)
  {
    // long time=millis();
    // for(int i=0;i<1000;){
    if (Serial1.available() > 0)
    {
      // int x=0;
      // if(char(Serial1.peek())=='s'){i++;}
      //   if(Serial1.peek()!='\n'){x++;}else{x=0;}


      //tx传值,通过蓝牙notify不间断发送通知
      Serial2.print(char(Serial1.peek()));
      pTxCharacteristic->setValue(&txValue, Serial1.read());
      pTxCharacteristic->notify();
      // if(x>10){
      //   Serial2.println();
      //   Serial2.println("Error!!!");
      //   delay(10000000000);
      // }
      delay(10);
    }
    // // }
    //   float a=1000/((millis()-time)/1000);
    //   Serial2.printf("Frequency domain:%f /n",a);
    //   delay(1000000);
  }
  // disconnecting
  if (!deviceConnected && oldDeviceConnected)
  {
    delay(500);                  // 让蓝牙堆栈有机会做好准备
    pServer->startAdvertising(); // 重启广播
    Serial2.println("start advertising");
    oldDeviceConnected = deviceConnected;
  }
  // connecting
  if (deviceConnected && !oldDeviceConnected)
  {
    // do stuff here on connecting在连接上做点事情
    oldDeviceConnected = deviceConnected;
    Serial2.println("start advertising");
  }
}

理想的蓝牙情况是这样的,把其它微控制器传上来的值(sEMG和6个数值)通过UART发送到ESP32,ESP32再把UART缓冲区的单个字符一个个的当通知信息发出去:
fe728ebdf4e71ada77f1ccb1f35b9f0e14fd631f_2_852x750.png

请问咋解决啊,为啥蓝牙接收同一个值,还是乱码(;´д`)ゞ

 楼主| 发表于 2022-3-19 12:27:15 | 显示全部楼层
解决了,是我搞错函数的用法了

BLECharacteristic.cpp库函数示意如下:

  1. <div><span style="color: #0000ff;">void</span> <span style="color: #267f99;">BLECharacteristic</span>::<span style="color: #795e26;">setValue</span>(<span style="color: #267f99;">std</span>::<span style="color: #267f99;">string</span> <span style="color: #001080;">value</span>) {</div><div>    <span style="color: #795e26;">setValue</span>((<span style="color: #267f99;">uint8_t</span>*)(<span style="color: #001080;">value</span>.<span style="color: #795e26;">data</span>()), <span style="color: #001080;">value</span>.<span style="color: #795e26;">length</span>());</div><div>}<span style="color: #008000;"> // setValue</span></div><font color="#000000">
  2. </font><div><span style="color: #0000ff;">void</span> <span style="color: #267f99;">BLECharacteristic</span>::<span style="color: #795e26;">setValue</span>(<span style="color: #267f99;">uint16_t</span><span style="color: #0000ff;">&</span> <span style="color: #001080;">data16</span>) {</div><div>    <span style="color: #267f99;">uint8_t</span> <span style="color: #001080;">temp</span>[<span style="color: #098658;">2</span>];</div><div>    <span style="color: #001080;">temp</span>[<span style="color: #098658;">0</span>] = <span style="color: #001080;">data16</span>;</div><div>    <span style="color: #001080;">temp</span>[<span style="color: #098658;">1</span>] = <span style="color: #001080;">data16</span> >> <span style="color: #098658;">8</span>;</div><div>    <span style="color: #795e26;">setValue</span>(<span style="color: #001080;">temp</span>, <span style="color: #098658;">2</span>);</div><div>}<span style="color: #008000;"> // setValue</span></div><font color="#000000">
  3. </font><div><span style="color: #0000ff;">void</span> <span style="color: #267f99;">BLECharacteristic</span>::<span style="color: #795e26;">setValue</span>(<span style="color: #267f99;">uint32_t</span><span style="color: #0000ff;">&</span> <span style="color: #001080;">data32</span>) {</div><div>    <span style="color: #267f99;">uint8_t</span> <span style="color: #001080;">temp</span>[<span style="color: #098658;">4</span>];</div><div>    <span style="color: #001080;">temp</span>[<span style="color: #098658;">0</span>] = <span style="color: #001080;">data32</span>;</div><div>    <span style="color: #001080;">temp</span>[<span style="color: #098658;">1</span>] = <span style="color: #001080;">data32</span> >> <span style="color: #098658;">8</span>;</div><div>    <span style="color: #001080;">temp</span>[<span style="color: #098658;">2</span>] = <span style="color: #001080;">data32</span> >> <span style="color: #098658;">16</span>;</div><div>    <span style="color: #001080;">temp</span>[<span style="color: #098658;">3</span>] = <span style="color: #001080;">data32</span> >> <span style="color: #098658;">24</span>;</div><div>    <span style="color: #795e26;">setValue</span>(<span style="color: #001080;">temp</span>, <span style="color: #098658;">4</span>);</div><div>}<span style="color: #008000;"> // setValue</span></div><font color="#000000">
  4. </font><div><span style="color: #0000ff;">void</span> <span style="color: #267f99;">BLECharacteristic</span>::<span style="color: #795e26;">setValue</span>(<span style="color: #0000ff;">int&</span> <span style="color: #001080;">data32</span>) {</div><div>    <span style="color: #267f99;">uint8_t</span> <span style="color: #001080;">temp</span>[<span style="color: #098658;">4</span>];</div><div>    <span style="color: #001080;">temp</span>[<span style="color: #098658;">0</span>] = <span style="color: #001080;">data32</span>;</div><div>    <span style="color: #001080;">temp</span>[<span style="color: #098658;">1</span>] = <span style="color: #001080;">data32</span> >> <span style="color: #098658;">8</span>;</div><div>    <span style="color: #001080;">temp</span>[<span style="color: #098658;">2</span>] = <span style="color: #001080;">data32</span> >> <span style="color: #098658;">16</span>;</div><div>    <span style="color: #001080;">temp</span>[<span style="color: #098658;">3</span>] = <span style="color: #001080;">data32</span> >> <span style="color: #098658;">24</span>;</div><div>    <span style="color: #795e26;">setValue</span>(<span style="color: #001080;">temp</span>, <span style="color: #098658;">4</span>);</div><div>}<span style="color: #008000;"> // setValue</span></div><font color="#000000">
  5. </font><div><span style="color: #0000ff;">void</span> <span style="color: #267f99;">BLECharacteristic</span>::<span style="color: #795e26;">setValue</span>(<span style="color: #0000ff;">float&</span> <span style="color: #001080;">data32</span>) {</div><div>    <span style="color: #0000ff;">float</span> <span style="color: #001080;">temp</span> = <span style="color: #001080;">data32</span>;</div><div>    <span style="color: #795e26;">setValue</span>((<span style="color: #267f99;">uint8_t</span>*)&<span style="color: #001080;">temp</span>, <span style="color: #098658;">4</span>);</div><div>}<span style="color: #008000;"> // setValue</span></div><font color="#000000">
  6. </font><div><span style="color: #0000ff;">void</span> <span style="color: #267f99;">BLECharacteristic</span>::<span style="color: #795e26;">setValue</span>(<span style="color: #0000ff;">double&</span> <span style="color: #001080;">data64</span>) {</div><div>    <span style="color: #0000ff;">double</span> <span style="color: #001080;">temp</span> = <span style="color: #001080;">data64</span>;</div><div>    <span style="color: #795e26;">setValue</span>((<span style="color: #267f99;">uint8_t</span>*)&<span style="color: #001080;">temp</span>, <span style="color: #098658;">8</span>);</div><div>}<span style="color: #008000;"> // setValue</span></div>
复制代码




然后我在void loop()编写如下


  1. <div><span style="color: #0000ff;">void</span> <span style="color: #795e26;">loop</span>()</div><div>{</div><div>  <span style="color: #af00db;">if</span> (<span style="color: #001080;">deviceConnected</span>)</div><div>  {</div><div>    <span style="color: #267f99;">std</span>::<span style="color: #267f99;">string</span>  <span style="color: #001080;">xiao</span> = <span style="color: #a31515;">""</span>;</div><div>    <span style="color: #af00db;">while</span> (<span style="color: #001080;">Serial1</span>.<span style="color: #795e26;">available</span>() > <span style="color: #098658;">0</span>)</div><div>    {</div><div>      <span style="color: #af00db;">if</span> (<span style="color: #001080;">Serial1</span>.<span style="color: #795e26;">peek</span>() != <span style="color: #a31515;">'</span><span style="color: #ee0000;">\n</span><span style="color: #a31515;">'</span>)</div><div>      {</div><div>        <span style="color: #001080;">xiao</span> <span style="color: #795e26;">+=</span> (<span style="color: #0000ff;">char</span>)<span style="color: #001080;">Serial1</span>.<span style="color: #795e26;">read</span>();</div><div>      }</div><div>      <span style="color: #af00db;">else</span></div><div>      {</div><div>        <span style="color: #001080;">xiao</span> <span style="color: #795e26;">+=</span> (<span style="color: #0000ff;">char</span>)<span style="color: #001080;">Serial1</span>.<span style="color: #795e26;">read</span>();</div><div>        <span style="color: #001080;">pTxCharacteristic</span>-><span style="color: #795e26;">setValue</span>(<span style="color: #001080;">xiao</span>);</div><div>        <span style="color: #001080;">pTxCharacteristic</span>-><span style="color: #795e26;">notify</span>();</div><div>        <span style="color: #001080;">xiao</span> <span style="color: #795e26;">=</span> <span style="color: #a31515;">""</span>;</div><div>        <span style="color: #af00db;">break</span>;</div><div>      }</div><div>      <span style="color: #795e26;">delay</span>(<span style="color: #098658;">10</span>);</div><div>    }</div><div>  }</div><div><span style="color: #008000;">  // disconnecting</span></div><div>  <span style="color: #af00db;">if</span> (!<span style="color: #001080;">deviceConnected</span> && <span style="color: #001080;">oldDeviceConnected</span>)</div><div>  {</div><div>    <span style="color: #795e26;">delay</span>(<span style="color: #098658;">500</span>);<span style="color: #008000;">                  // 让蓝牙堆栈有机会做好准备</span></div><div>    <span style="color: #001080;">pServer</span>-><span style="color: #795e26;">startAdvertising</span>();<span style="color: #008000;"> // 重启广播</span></div><div>    <span style="color: #001080;">Serial2</span>.<span style="color: #795e26;">println</span>(<span style="color: #a31515;">"start advertising"</span>);</div><div>    <span style="color: #001080;">oldDeviceConnected</span> = <span style="color: #001080;">deviceConnected</span>;</div><div>  }</div><div><span style="color: #008000;">  // connecting</span></div><div>  <span style="color: #af00db;">if</span> (<span style="color: #001080;">deviceConnected</span> && !<span style="color: #001080;">oldDeviceConnected</span>)</div><div>  {</div><div><span style="color: #008000;">    // do stuff here on connecting在连接上做点事情</span></div><div>    <span style="color: #001080;">oldDeviceConnected</span> = <span style="color: #001080;">deviceConnected</span>;</div><div>    <span style="color: #001080;">Serial2</span>.<span style="color: #795e26;">println</span>(<span style="color: #a31515;">"start advertising"</span>);</div><div>  }</div><div>}</div>
复制代码






回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-3-29 17:26 , Processed in 0.265200 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表