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?
- Можно ли использовать WiFi и Bluetooth/BLE в одном проекте ESP32?
- ESP32 запускает BLE после глубокого сна
- Максимальная скорость 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