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);}

, 👍1


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-строки.

,

спасибо, сэр. я попробовал другой подход, используя 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