Dúvidas acerca da Softwareserial.h

Olá,
Estou montando um projeto onde recebo os dados externos através de um atmega328, envio para um atmega328 responsável por enviar os dados lidos para um banco de dados na web via ESP01.
O problema está no fato de que, para configurar o ESP01, preciso utilizar uma "porta serial" criada pelo softwareserial.h e preciso dela também para essa outra conexão. Se eu startar a Serial1 e depois startar a Serial2, a Serial1 não funciona(nesse caso, não lê os dados recebidos do outro atmega) e se startar a Serial2 e depois startar a Serial1, a comunicação com o ESP01 dá timeout.

A pergunta é: dá para utilizar mais de uma porta advinda da softwareserial.h ou essa é uma limitação do uno que não dá para contornar? Se sim, é possível criar uma Serial3 também? Precisava dessas portas para fazer meu projeto rodar.

Atenciosamente,

O código que estou inicializando é esse:

#include "SoftwareSerial.h"
#include "WiFiEsp.h"
IPAddress server(192,168,1,77);
SoftwareSerial Serial2(8,9); // RX, TX
SoftwareSerial Serial1(3,2); // RX, TX

char ssid[] = "conexao";
char pass[] = "******";
int status = WL_IDLE_STATUS;
const char http_site[] = "http://192.168.1.77/";
const int http_port = 12990;
WiFiEspClient client;

void setup() { 
 Serial.begin(9600);
 Serial1.begin(9600);
 Serial2.begin(9600);
 WiFi.init(&Serial2);
   if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("Não há nenhum ESP8266 nas portas RX: 9 TX: 8");
    while (true);
  }
  while ( status != WL_CONNECTED) {
    Serial.print("Conectando à rede: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);
  }
  Serial.println("Conectado com sucesso!!");
  statusconexao();
}
  
String leitordedados(){
  String informacao = "";
  char dado;
  
  // Enquanto receber algo pela serial
  while(Serial1.available() > 0) {
    // Lê o dado disponível na serial
    dado = Serial1.read();
    // Ignora caracter de quebra de linha
    if (dado != '\n'){
      // Concatena valores
      informacao.concat(dado);
    }
    delay(15);
  }
  Serial.print("Informação recebida: ");
  Serial.println(informacao);
  return informacao;
}
  
void loop() {
  // Se receber algo pela serial1
  if (Serial1.available() > 0){
    String param = leitordedados();
    Serial.println(param);
   if ( !client.connect(server, http_port) ) {
      Serial.println("Falha na conexão ");
    }
   else{
    Serial.println(param);
    client.println("GET /injetora_um/injet.php" + param + " HTTP/1.1");
    client.println("Host: ");
    client.println(http_site);
    client.println("Connection: close");
    client.println();
    client.println();
    while (client.available() && status == WL_CONNECTED) {
      char c = client.read();
      Serial.write(c);
    } 
   Serial2.flush();
  }
 }
}

// ------------------------------------------------------------

void statusconexao()
{
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
  long rssi = WiFi.RSSI();
  Serial.print("Força do Sinal (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Consegui resolver o problema dando uma lida na documentação da biblioteca. Para quem enfrentar o mesmo problema e se ver na necessidade de utilizar mais de uma conexão serial, segue a resposta:

O Arduino UNO não consegue ouvir mais de uma conexão serial ao mesmo tempo, portanto, você deve especificar qual porta você quer ouvir. Antes de utilizar uma conexão serial, você deve especificar qual serial você quer ouvir através do comando listen().

Um exemplo:

(...)
Serial1.listen();
if (Serial1.available() > 0){
String param = leitordedados();
Serial.println(param);
Serial2.listen();
if ( !client.connect(server, http_port) ) {
Serial.println("Falha na conexão ");
}
(...)

Atenciosamente,
Wallace

1 Like