ESP32 nodemcu сериализует отправку данных
В настоящее время я пытаюсь отправить данные из esp32 в свое приложение для Android, которое я создал. Показания датчиков отображаются на последовательном мониторе, однако в моем приложении отображаются либо@, либо &. Пожалуйста, помогите и спасибо вам. Я новичок в кодировании Bluetooth.
Вот код:
#include "BluetoothSerial.h"
int sensorPin = 35;
int sensorreading;
BluetoothSerial SerialBT;
void setup ()
{
Serial.begin(115200);
SerialBT.begin("ESP32_ABO");
pinMode (sensorPin, INPUT);
}
void loop ()
{
sensorreading = analogRead(sensorPin);
String toSend = String (sensorreading);
sendData(toSend);}
void sendData(String textToSend){
Serial.print(sensorreading);
SerialBT.write(textToSend[sensorreading]);
}
delay(1000);}
@Dan Young, 👍1
1 ответ
Вы видите очень разные выходные данные через Bluetooth и последовательный монитор, потому что вы отправляете совершенно разные вещи. На последовательном мониторе вы видите показания датчика, так как это именно то, что вы отправляете:
Serial.print(sensorreading);
Функция print() преобразует целочисленную переменную sensorreading в читаемый человеком текст (имеется в виду текст в кодировке ASCII) и отправит его по последовательному каналу.
Но затем вы делаете следующее:
SerialBT.write(textToSend[sensorreading]);
textToSend здесь является строковым объектом. Итак, с помощью скобок [ ] вы берете один символ этой строки. Вы пытаетесь использовать сенсорное считываниесимвола. Поскольку считывание сенсоров происходит от analogRead(), скорее всего, это значение довольно большое, то есть больше, чем длина строки. Таким образом, вы в основном читаете некоторую случайную память, которая, как оказалось, лежит за вашей строковой переменной. Функция write() затем отправит эти случайные данные по вашему последовательному интерфейсу Bluetooth без какого-либо преобразования.
Я предполагаю, что вы хотите передавать данные по Bluetooth также в удобочитаемой форме. Поэтому просто используйте тот же код, что и в последовательном интерфейсе (для последовательного монитора).
И удалите все это ручное преобразование измеренного аналогового значения в строку. В этом нет необходимости. Если вы также хотите отобразить некоторый текст, вы можете просто использовать несколько команд печати (), например:
Serial.print("Value: ")
Serial.print(sensorreading);
Serial.print(" units");
Обратите внимание, что вообще использовать строковый объект довольно плохо. Класс String использует динамическое выделение памяти, что приводит к фрагментации памяти, которая может поглотить вашу доступную память. Это не так важно для микросхем с довольно большой памятью (как ESP32), чем для микросхем с меньшей памятью (например, Atmega328p, который используется в Arduino Uno и Nano), но вы все равно должны иметь это в виду. Вместо класса String вы бы работали с массивами символов, он же C-строки.
- Пример кода для ESP32 в качестве медиа-контроллера для Android/iPhone Media Apps
- Библиотека ардуино или код для ESP32 для сканирования устройств Bluetooth?
- Имена синтаксического анализа обнаружения Bluetooth ESP32
- Веб-страница с использованием Bluetooth?
- ESP32 запускает BLE после глубокого сна
- Можно ли использовать WiFi и Bluetooth/BLE в одном проекте ESP32?
- Максимальная скорость ESP32 Bluetooth SPP
- ESP32 Arduino Bluetooth Serial не подключается повторно после отключения
спасибо, сэр. я попробовал другой подход, используя serialbt.write(sensorreading); вместо SerialBT.write(textToSend[sensorreading]); я получаю значения, которые отображаются в диапазоне от 2300 до 2400 на моем последовательном мониторе. Когда я пытаюсь подключить его к другому приложению, приложение serial terminal bluetooth, которое я скачал в PlayStore. на этот раз в приложении просто отображаются случайные буквы., @Dan Young
это мой текущий код: #включить "BluetoothSerial.h" int sensorPin = 35; int sensorreading = 0; BluetoothSerial SerialBT; void setup () { Serial.begin(115200); SerialBT.begin("ESP32_ABO"); pinMode (sensorPin, ВХОД); } void loop () { sensorreading = analogRead(sensorPin); Serial.print(sensorreading); Serial.println("mV"); SerialBT.write(sensorreading); задержка(1000);} извините, я действительно новичок в arduino, @Dan Young
большое вам спасибо за вашу помощь, сэр! чего не хватало, так это serialBT.print(sensorreading); чтобы отобразить его в приложении устройства, спасибо большое за вашу помощь, @Dan Young
Это здорово. Как уже упоминалось в ответе, "SoftwareSerial.write ()" отправит данные нетронутыми, что означает, что вы отправляете эти данные в двоичном виде (только двоичное представление числа). Вместо этого
SoftwareSerial.print()создает ASCII-кодированное представление числа, которое представляет собой удобочитаемый текст. Приложение на вашем телефоне просто получает данные от serial и интерпретирует их как текст в кодировке ASCII. Таким образом, при отправке двоичных данных вы получаете несколько случайных символов., @chrislЕсли это ответ на ваш вопрос, вы можете принять мой ответ как правильный, @chrisl