esp蓝牙串口透传
实现功能前没有预测过后期情况导致蹦盘
1.蓝牙透传官方示例
#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; void setup() { Serial.begin(115200); SerialBT.begin("ESP32test"); //Bluetooth device name Serial.println("The device started, now you can pair it with bluetooth!"); } void loop() { if (Serial.available()) { SerialBT.write(Serial.read()); } if (SerialBT.available()) {//将蓝牙收到的数据,再通过串口把信息发回给电脑 Serial.write(SerialBT.read()); delay(20); } }
使用官方示例的时候我发现这可以实现简短蓝牙到串口,串口到蓝牙,在没有经过大数据测试的时候,是可以通信过的,但是在实际测试的过程中,老是会出现分包的情况,很是苦恼。于是仔细研究了一下调用的库函数 BluetoothSerial.h使用c++写的库函数
// Copyright 2018 Evandro Luis Copercini // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef _BLUETOOTH_SERIAL_H_ #define _BLUETOOTH_SERIAL_H_ #include "sdkconfig.h" #if defined(CONFIG_BT_ENABLED) && defined(CONFIG_BLUEDROID_ENABLED) #include "Arduino.h" #include "Stream.h" #include <esp_gap_bt_api.h> #include <esp_spp_api.h> #include <functional> #include <map> #include "BTScan.h" typedef std::function<void(const uint8_t *buffer, size_t size)> BluetoothSerialDataCb; typedef std::function<void(uint32_t num_val)> ConfirmRequestCb; typedef std::function<void(boolean success)> AuthCompleteCb; typedef std::function<void(BTAdvertisedDevice* pAdvertisedDevice)> BTAdvertisedDeviceCb; class BluetoothSerial: public Stream { public: BluetoothSerial(void); ~BluetoothSerial(void); bool begin(String localName=String(), bool isMaster=false); bool begin(unsigned long baud){//compatibility return begin(); } int available(void); int peek(void); bool hasClient(void); int read(void); size_t write(uint8_t c); size_t write(const uint8_t *buffer, size_t size); void flush(); void end(void); void setTimeout(int timeoutMS); void onData(BluetoothSerialDataCb cb); esp_err_t register_callback(esp_spp_cb_t * callback); void onConfirmRequest(ConfirmRequestCb cb); void onAuthComplete(AuthCompleteCb cb); void confirmReply(boolean confirm); void enableSSP(); bool setPin(const char *pin); bool connect(String remoteName); bool connect(uint8_t remoteAddress[], int channel=0, esp_spp_sec_t sec_mask=(ESP_SPP_SEC_ENCRYPT|ESP_SPP_SEC_AUTHENTICATE), esp_spp_role_t role=ESP_SPP_ROLE_MASTER); bool connect(const BTAddress &remoteAddress, int channel=0, esp_spp_sec_t sec_mask=(ESP_SPP_SEC_ENCRYPT|ESP_SPP_SEC_AUTHENTICATE), esp_spp_role_t role=ESP_SPP_ROLE_MASTER) { return connect(*remoteAddress.getNative(), channel, sec_mask); }; bool connect(); bool connected(int timeout=0); bool isClosed(); bool isReady(bool checkMaster=false, int timeout=0); bool disconnect(); bool unpairDevice(uint8_t remoteAddress[]); BTScanResults* discover(int timeout=0x30*1280); bool discoverAsync(BTAdvertisedDeviceCb cb, int timeout=0x30*1280); void discoverAsyncStop(); void discoverClear(); BTScanResults* getScanResults(); std::map<int, std::string> getChannels(const BTAddress &remoteAddress); const int INQ_TIME = 1280; // Inquire Time unit 1280 ms const int MIN_INQ_TIME = (ESP_BT_GAP_MIN_INQ_LEN * INQ_TIME); const int MAX_INQ_TIME = (ESP_BT_GAP_MAX_INQ_LEN * INQ_TIME); operator bool() const; private: String local_name; int timeoutTicks=0; }; #endif #endif
第一次了解到函数的多态性学到了 我去多态C++
class Person { public: virtual void buyBucket(){ std::cout << "全价" << std::endl; } }; class student:public Person { public: virtual void buyBucket() { std::cout << "半价" << std::endl; } }; int main() { Person p; student s; Person &tmp1 = p; Person &tmp2 = s;//tmp2为基类Person对派生类student的引用 Person *tmp3 = &s;//tmp3为基类Person指向派生类student的指针 tmp1.buyBucket(); tmp2.buyBucket(); tmp3.buyBucket(); return 0; }
故作如下修改
#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; char r_buffer[512]; long int i = 0; uint j = 0; uint k = 0; void setup() { Serial.begin(115200); SerialBT.begin("T"); //Bluetooth device name // Serial.println("The device started, now you can pair it with bluetooth!"); } void loop() { if (Serial.available()) { i=0; r_buffer[j]=Serial.read(); j=j+1; if(j>255) j=255; } if(j != 0) i=i+1; if((i == (6553)) & (j != 0)){//自写延时 SerialBT.write((const uint8_t*)r_buffer, j); j=0;i=0; } if (SerialBT.available()) {//将蓝牙收到的数据,再通过串口把信息发回给电脑 Serial.write(SerialBT.read()); } }
问题暂时解决。
本文作者:Yang-blackSun
本文链接:https://www.cnblogs.com/Yang-blackSun/p/18025359
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
本文作者:Yang-blackSun
本文链接:https://www.cnblogs.com/Yang-blackSun/p/18025359
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步