Arduino с HM-10 не всегда получает полное сообщение, которое было отправлено [закрыто]

-1

Я новичок, пытающийся общаться между iPhone и Arduino Uno. У меня есть модуль HM-10 BLE, подключенный к моему Arduino. Я использую его для отправки и получения сообщений с моего iPhone. Мой Arduino запускает пример программы SoftwareSerial:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

Вот так все работает нормально: Arduino отправляет сообщения на мой iPhone, как и ожидалось, и печатает «ping» на последовательном мониторе, когда я посылаю «ping» на Arduino. Однако, если я добавлю эти строки в

void loop(){
 if (mySerial.available()) {
 Serial.write(mySerial.read);
 String message = String(mySerial.readString);
  if (message == "ping") {
  mySerial.write("pong");
  }
 }
} // the other code stays the same

он внезапно говорит только «p» на последовательном мониторе, хотя я отправил «ping». Оператор if также не сработает, поэтому он не отправит pong назад.

Я не могу найти никаких недостатков в своем коде, он даже работал вчера с таким же кодом.

Спасибо за помощь!

vorname nachname
источник

Ответы:

0

Это действительно вопрос программирования, относящийся к Stackoverflow, а не вопрос использования, принадлежащий Superuser.

В любом случае, ваша проблема в том, что вы используете последовательные данные в двух местах, поэтому они не могут оба получить все это, а скорее украсть друг у друга.

Serial.write(mySerial.read);
String message = String(mySerial.readString);

Первый вызов получает один символ - ваш 'p', а следующий вызов получает что-либо, оставшееся до тех пор, пока не будет выполнено условие завершения или тайм-аут.

Вероятно, вы должны вынуть первую строку и просто распечатать строку (если есть), полученную readString()методом.

Остерегайтесь хотя, что есть много, что не идеально с вашим общим подходом:

  • readString()является тайм - аут на основе, и вы действительно не знаете , что данные будут поступать на противоположной стороне blueooth LE радио связи без нечетных промежутками между пакетами, особенно с тем, как последовательный поверх можные пихает данных через характеристику.

  • Последовательный программный продукт является неуклюжей конструкцией, в основном ЦПУ MCU должен сам декодировать состояние последовательной линии, поскольку ATmega328 вашего Arduino имеет только один аппаратный последовательный интерфейс, традиционно зарезервированный для программирования и вывода отладочной информации. Существует много других недорогих встроенных платформ с несколькими аппаратными последовательными портами, некоторые из которых программируются через экосистему Arduino.

  • Обратите внимание, что ваш HM-10 сам по себе является запрограммированным микроконтроллером, однако аспект bluetooth работает только с одним дорогим набором инструментов. Конкурирующие детали Nordic имеют доступные порты Arduino, то есть вы можете запустить свой код Arduino прямо на чипе BLE и избежать этой дополнительной последовательной связи.

Крис Страттон
источник