Не могу заставить работать software serial

Итак, у меня есть два Arduino (Arduino Nano), и я пытаюсь заставить их взаимодействовать через SoftwareSerial. У меня есть «отправляющий» вывод D10 Arduino, подключенный к «получающему» выводу D11 Arduino, и наоборот. При отправке Arduino у меня есть следующий код:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11);

void setup() {
  pinMode(2, OUTPUT);
  mySerial.begin(9600);
}

void loop() {
  if (mySerial.isListening()){
    digitalWrite(2, HIGH);
  }
  mySerial.write(5);
}

и при получении Arduino у меня есть:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(11, 10);

void setup() {
  pinMode(2, OUTPUT);

  Serial.begin(9600);

  mySerial.begin(9600);
}

void loop() {
  mySerial.listen();
  if (mySerial.available()>0) {
    digitalWrite(2, HIGH);
    char inByte = mySerial.read();
    Serial.write(inByte);
  }
  digitalWrite(2, LOW);
}

(при этом D2 подключен к светодиоду для обоих).

Я не могу заставить его что-либо прочитать. Кажется, что для принимающего Arduino ничего не доступно (светодиод не горит). Что я делаю не так?

, 👍0


2 ответа


1

Отправитель:

SoftwareSerial mySerial(10, 11);  // Rx, Tx

Получатель:

SoftwareSerial mySerial(11, 10);  // Rx, Tx

У меня есть «отправляющий» вывод D10 Arduino, подключенный к «принимающему» выводу D11 Arduino, и наоборот.

Итак, у вас есть передающий Rx Arduino, подключенный к принимающему Rx Arduino. Поэтому это не сработает. Вам необходимо соединить Rx с Tx.


  mySerial.listen();

В этом простом примере это не требуется.

,

-1

Я согласен с Ником выше, но хочу добавить следующее, чтобы упростить ваш код:


if (mySerial.available()) {
    digitalWrite(2, HIGH);    
    Serial.write(mySerial.read());
  }

Раньше мне приходилось перехватывать последовательные данные из принтера, и это оказался лучший способ перехватить все данные, если вы сначала поместите их в переменную, и ему придется менять переменную каждый раз, когда вы получаете байт. но таким образом он помещает все в буфер, а затем отправляет его

Кстати, мне пришлось сохранить на устройство F-RAM, и это сработало так же, но вместо отправки я сохранил его в переменную, используя ReadString() вместо read().

,

Что касается «если вы сначала поместите его в переменную, он должен будет менять переменную каждый раз, когда вы получаете байт»: локальная переменная, используемая, как и в исходном сообщении, будет выделена компилятором регистру ЦП. То, что вы предлагаете, _не_ более эффективно., @Edgar Bonet

как я сказал в ответе внизу, я использовал переменную, но ничего больше, и именно это заставило ее работать для упрощения кода, чтобы заставить его работать с первого раза, используйте самую простую версию, которую вы можете получить, а затем основывайтесь на ней., @Tjaart van aswegen

Я не совсем понимаю, что вы пишете, но предложение, начинающееся с «если вы сначала поместите это в переменную», звучит так, как будто вы подразумеваете, что использование временной переменной является причиной неэффективности. Если вы это имеете в виду, то это неправильно. Если вы имеете в виду не то, то вам следует отредактировать ответ, чтобы уточнить предложение., @Edgar Bonet

нет, возможно, мой язык меня действительно подводит Проще говоря, вам следует попытаться свести к минимуму процессы, происходящие при последовательном событии, и вам следует избегать задержек и всего такого, и если вы просто пытаетесь что-то сделать, сделайте это самым простым доступным способом, который я предложил ( я верю, но могу ошибаться), а затем опираюсь на это это просто делает отладку легкой, а не легкой задачей, @Tjaart van aswegen

что касается переменной, я нашел, что это хорошее решение само по себе, не имеющее ничего другого, что удерживало бы микроконтроллер при получении данных, не говоря, что это единственная функция, которую должен иметь ваш микроконтроллер, а скорее в событии получения данных, которое должно быть сведено к минимуму. и что вам не следует даже пытаться использовать что-то вроде задержки и снова сохранять свой код простым и понятным., @Tjaart van aswegen

Много слов, а яснее не становится. Пожалуйста, ответьте на этот простой вопрос: да или нет, вы подразумеваете, что char inByte=mySerial.read();Serial.write(inByte); менее эффективен (т.е. он держит MCU более загруженным), чем Serial. write(mySerial.read());?, @Edgar Bonet

ну, вы за то, чтобы поместить данные в переменную, а затем отправить их, чтобы вы сказали мне Я лишь высказываю свое мнение, и, насколько я знаю, если оно простое, оно работает., @Tjaart van aswegen

Давайте [продолжим обсуждение в чате](https://chat.stackexchange.com/rooms/87857/discussion-between-edgar-bonet-and-tjaart-van-aswegen)., @Edgar Bonet

Да, никогда не соглашайся с кем-то, эй, @Tjaart van aswegen