-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 назад.

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

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

1 ответ1

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 и избежать этой дополнительной последовательной связи.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .