Проблемы при использовании SoftwareSerial

Я пытаюсь прочитать строку, отправленную с esp8266 esp01 на Arduino mega. Когда я использую обычные порты Rx и Tx, он работает правильно, но когда я инициализирую новый последовательный порт с помощью SoftwareSerial, на последовательном мониторе ничего не отображается.

Пожалуйста, помогите мне, так как я застрял и пытаюсь решить эту проблему уже несколько недель. Ниже приведен код для esp8266 и Arduino mega

Код для ARDUINO MEGA

#include<SoftwareSerial.h>

SoftwareSerial myS(4,5);

String data="true";

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
myS.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(myS.available()){
  data=myS.readString();
  }
  Serial.println(data);
  //Serial.write(data);
  delay(2000);
}

Код для ESP8266

void setup() {
  Serial.begin(9600);     // Инициализируем последовательный интерфейс со скоростью 9600 бод
}

// функция цикла запускается снова и снова навсегда
void loop() {  
  if(Serial.available()>0)    //Проверяем, есть ли данные в буфере
  {
    Serial.print("We got:");
    Serial.print(char(Serial.read()));  //Чтение байта последовательных данных и отправка обратно в последовательный монитор
  }
  else
  {
    Serial.println("Hello World..."); // Печатать слово Hello каждую секунду
    delay(1000);                      // Подождем секунду
  }
}

Более того, я также пробовал читать() вместо readString(), но это тоже не работает. Я также пробовал переключать контакты Rx и TX, что означает подключение Rx-> Tx, Tx-> Rx и наоборот, то есть Rx-> Rx и Tx-> Tx, но это не работает ни в одном случае. Любая помощь или предложение будут оценены. Спасибо

, 👍0

Обсуждение

Почему вы используете SoftwareSerial на Mega?!?!, @Majenko

Rx->Tx правильно, а не наоборот. Кроме того, у atmega2560 больше последовательных интерфейсов, поэтому softwareserial не лучший выбор., @Sim Son


1 ответ


3

SoftwareSerial работает только с несколькими выбранными контактами GPIO на Mega. В частности, те контакты, на которых есть PCINT.

Но это не имеет значения. Нет причин использовать SoftwareSerial на Mega, за исключением исключительных обстоятельств. У вас есть четыре аппаратных UART на Mega, поэтому нет необходимости использовать SoftwareSerial. Используйте настоящие выводы и объекты UART:

Serial -> RX(0) / TX(1)
Serial1 -> RX1(19) / TX1(18)
Serial2 -> RX2(17) / TX2(16)
Serial3 -> RX3(15) / TX3(14)

Просто замените все ссылки в коде на экземпляр SoftwareSerial на Serial1 (удалите #include и конструктор экземпляра объекта) и используйте TX1 и RX1 для подключения вашего модуля:

String data="true";

void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    Serial1.begin(9600);
}

void loop() {
    // put your main code here, to run repeatedly:
    if(Serial1.available()){
        data=Serial1.readString();
    }
    Serial.println(data);
    //Serial.write(data);
    delay(2000);
}
,