標(biāo)題: 菜鳥(niǎo)問(wèn)題:ESP32S藍(lán)牙為什么發(fā)送同一個(gè)值?TX傳的是不同值啊 [打印本頁(yè)]

作者: allrobot    時(shí)間: 2022-3-19 09:50
標(biāo)題: 菜鳥(niǎo)問(wèn)題:ESP32S藍(lán)牙為什么發(fā)送同一個(gè)值?TX傳的是不同值啊
問(wèn)題是這樣的,先上圖:
手機(jī)端接收的,發(fā)現(xiàn)接收的notify都是同一個(gè)值:00 01 01 00 C0 C8 FD 3F 54 C0 FD.....3F 00 00 00 00

切回utf-8,就變成亂碼了,變成這樣:


由于我是菜鳥(niǎo),只懂a(chǎn)rduino軟編程,C語(yǔ)言也只是略懂

藍(lán)牙代碼是用ESP32 example文件改來(lái)的,分析了很久沒(méi)分析出什么,只好向高手求助了

以下是代碼:
  1. #include <BLEDevice.h>
  2. #include <BLEServer.h>
  3. #include <BLEUtils.h>
  4. #include <BLE2902.h>
  5. BLEServer *pServer = NULL;
  6. BLECharacteristic *pTxCharacteristic;
  7. bool deviceConnected = false;
  8. bool oldDeviceConnected = false;
  9. uint8_t txValue = 0;

  10. // See the following for generating UUIDs:

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

  14. class MyServerCallbacks : public BLEServerCallbacks
  15. {
  16.   void onConnect(BLEServer *pServer)
  17.   {
  18.     deviceConnected = true;
  19.   };

  20.   void onDisconnect(BLEServer *pServer)
  21.   {
  22.     deviceConnected = false;
  23.   }
  24. };

  25. class MyCallbacks : public BLECharacteristicCallbacks
  26. {
  27.   void onWrite(BLECharacteristic *pCharacteristic)
  28.   {
  29.     std::string rxValue = pCharacteristic->getValue();

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

  36.       Serial2.println();
  37.       Serial2.println("*********");
  38.     }
  39.   }
  40. };
  41. void setup()
  42. {
  43.   Serial1.begin(250000, SERIAL_8N1, 3, 1);
  44.   Serial2.begin(250000, SERIAL_8N1, 16, 17);

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

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

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

  52.   // Create a BLE Characteristic
  53.   pTxCharacteristic = pService->createCharacteristic(
  54.       CHARACTERISTIC_UUID_TX,
  55.       BLECharacteristic::PROPERTY_NOTIFY);

  56.   pTxCharacteristic->addDescriptor(new BLE2902());

  57.   BLECharacteristic *pRxCharacteristic = pService->createCharacteristic(
  58.       CHARACTERISTIC_UUID_RX,
  59.       BLECharacteristic::PROPERTY_WRITE);

  60.   pRxCharacteristic->setCallbacks(new MyCallbacks());

  61.   // Start the service
  62.   pService->start();

  63.   // Start advertising
  64.   pServer->getAdvertising()->start();

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

  68. void loop()
  69. {
  70.   if (deviceConnected)
  71.   {
  72.     // long time=millis();
  73.     // for(int i=0;i<1000;){
  74.     if (Serial1.available() > 0)
  75.     {
  76.       // int x=0;
  77.       // if(char(Serial1.peek())=='s'){i++;}
  78.       //   if(Serial1.peek()!='\n'){x++;}else{x=0;}


  79.       //tx傳值,通過(guò)藍(lán)牙notify不間斷發(fā)送通知
  80.       Serial2.print(char(Serial1.peek()));
  81.       pTxCharacteristic->setValue(&txValue, Serial1.read());
  82.       pTxCharacteristic->notify();
  83.       // if(x>10){
  84.       //   Serial2.println();
  85.       //   Serial2.println("Error!!!");
  86.       //   delay(10000000000);
  87.       // }
  88.       delay(10);
  89.     }
  90.     // // }
  91.     //   float a=1000/((millis()-time)/1000);
  92.     //   Serial2.printf("Frequency domain:%f /n",a);
  93.     //   delay(1000000);
  94.   }
  95.   // disconnecting
  96.   if (!deviceConnected && oldDeviceConnected)
  97.   {
  98.     delay(500);                  // 讓藍(lán)牙堆棧有機(jī)會(huì)做好準(zhǔn)備
  99.     pServer->startAdvertising(); // 重啟廣播
  100.     Serial2.println("start advertising");
  101.     oldDeviceConnected = deviceConnected;
  102.   }
  103.   // connecting
  104.   if (deviceConnected && !oldDeviceConnected)
  105.   {
  106.     // do stuff here on connecting在連接上做點(diǎn)事情
  107.     oldDeviceConnected = deviceConnected;
  108.     Serial2.println("start advertising");
  109.   }
  110. }
復(fù)制代碼



理想的藍(lán)牙情況是這樣的,把其它微控制器傳上來(lái)的值(sEMG和6個(gè)數(shù)值)通過(guò)UART發(fā)送到ESP32,ESP32再把UART緩沖區(qū)的單個(gè)字符一個(gè)個(gè)的當(dāng)通知信息發(fā)出去:


請(qǐng)問(wèn)咋解決啊,為啥藍(lán)牙接收同一個(gè)值,還是亂碼(;′д`)ゞ


作者: 人工置頂員    時(shí)間: 2022-3-19 16:51
頂一下
作者: munuc_w    時(shí)間: 2022-3-21 08:52
注意字符與HEX的轉(zhuǎn)換。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1