Не могу заставить работать 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 ничего не доступно (светодиод не горит). Что я делаю не так?
@Nate, 👍0
2 ответа
Отправитель:
SoftwareSerial mySerial(10, 11); // Rx, Tx
Получатель:
SoftwareSerial mySerial(11, 10); // Rx, Tx
У меня есть «отправляющий» вывод D10 Arduino, подключенный к «принимающему» выводу D11 Arduino, и наоборот.
Итак, у вас есть передающий Rx Arduino, подключенный к принимающему Rx Arduino. Поэтому это не сработает. Вам необходимо соединить Rx с Tx.
mySerial.listen();
В этом простом примере это не требуется.
Я согласен с Ником выше, но хочу добавить следующее, чтобы упростить ваш код:
if (mySerial.available()) {
digitalWrite(2, HIGH);
Serial.write(mySerial.read());
}
Раньше мне приходилось перехватывать последовательные данные из принтера, и это оказался лучший способ перехватить все данные, если вы сначала поместите их в переменную, и ему придется менять переменную каждый раз, когда вы получаете байт. но таким образом он помещает все в буфер, а затем отправляет его
Кстати, мне пришлось сохранить на устройство F-RAM, и это сработало так же, но вместо отправки я сохранил его в переменную, используя ReadString() вместо read().
- Как работает последовательная связь на Arduino?
- Как Arduino будет общаться по беспроводной сети через XBee?
- AT-команда не отвечает на последовательный монитор
- Arduino Преобразование std:string в String
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
Что касается «если вы сначала поместите его в переменную, он должен будет менять переменную каждый раз, когда вы получаете байт»: локальная переменная, используемая, как и в исходном сообщении, будет выделена компилятором регистру ЦП. То, что вы предлагаете, _не_ более эффективно., @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