Duda sobre los puertos series de los arduino [SOLUCIONADO]

Hola, queria saber si se pueden aislar los puertos serie del arduino para que no se mezclen la informacion de unos y otros

txonso:
Hola, queria saber si se pueden aislar los puertos serie del arduino para que no se mezclen la informacion de unos y otros

Hola,
¿A qué te refieres con aislar? ¿Qué es lo que buscas conseguir?

Saludos

Hola, gracias por contestar , el tema es que con el esp32 tenia cada puerto serial uno para uso de modbus y otro conectado una nextion pero debia ser problema de los esp32, por que con un arduino mega funciona el codigo perfectamente, o alguna libreria que con el esp32 no funciona correctamente

Hola, sigo con mis problemas con el ModbusRtu :grin: , no consigo enviar o recibir datos de un segundo esclavo utilizando la librería ModbusMaster, no se implementarlo no se si alguien que controle mas sobre este tema y librería me puede echar un cable.

Libreria ModbusMaster

#include <ModbusMaster.h>               //Library for using ModbusMaster
#include <SoftwareSerial.h>
#define REDE 4
#define pot 0
int brillo;
ModbusMaster node; //Esclavo MQTT,1
SoftwareSerial mySerial(10, 11); //RX y TX
void preTransmission()            //Function for setting stste of Pins DE & RE of RS-485
{
  digitalWrite(REDE, 1);
}

void postTransmission()
{
  digitalWrite(REDE, 0);
}



void control_led() {
  brillo = analogRead(pot);
  if (brillo >= 500) {
    node.writeSingleRegister(0, 1);       //Writes value to 0x40000 holding register
    node.writeSingleRegister(1, 1);
  } else {
    node.writeSingleRegister(1, 0);       //Writes value to 0x40000 holding register
    node.writeSingleRegister(0, 0);
  }
}

void setup()
{
pinMode(REDE, OUTPUT);
pinMode(pot, INPUT);
digitalWrite(REDE, 0);
mySerial.begin(9600);             //Baud Rate as 9600
 mySerial.setTimeout(50);
 node.begin(1, mySerial); //Slave ID as 1

node.preTransmission(preTransmission);         //REDE ID as 1
node.postTransmission(postTransmission);
}
void loop() {

  control_led();

}

No he visto nada de esta libreria con dos slaves por eso espero que sirva par ayudar a mas gente
Muchas gracias de antemano.
Saludos

Ahora que mezcle tus hilos paso a responderte cada consulta:

  1. Los puertos no se pueden mezclar porque cuando consulta la lectura de un puerto el objeto se llama por ejemplo Serial, Serial1, Serial2, Serial3 en el caso del MEGA o DUE o si usas SosftwareSerial tendras un nombre diferentes. No hay modo que se mezcle algo que fisicamente entra por canales y pines diferentes.

  2. En tu problema con el ESP32 yo creo que antes de trabajar con MODBUS debes bajar un cambio y probar una comunicación simple Serial con otro dispositivo Arduino. Asegurate que dominas eso y luego vuelve a la comunicación Modbus.

Si no se domina lo básico no hay que meterse en el terreno mas complicado de la comunicación HALF DUPLEX Modbus.

Entonces, identifica los puertos. El ESP32 es reconfigurable y tiene 2 puertos Serie Hardware. Uno esa en uso para le monitoreo del IDE y otro a tu disposición. Usalo, se llama Serial2.

Dejo link

Hola, gracias por tu respuesta.
En el primer apartado, al final conseguí el uso de un puerto serie para cada función, tengo en el software serial para control de modbus(ya tengo control sobre un esclavo con un potenciometro enciendo y apago los leds, y le envió desde el maestro al esclavo para que publique en un servidor mqtt las temperaturas) y el serial 2 para interactuar con pantalla Nextion para observar de datos y errores, esta implementado con la libreria ModbusMaster y ModbusRtu para esclavo, creo que mi problema es que me deje algun serial print que mostrase informacion cuando no estaba usando software serial por eso también daba problemas, me di cuenta que no bloquea el puerto de monitorizacion cuando usas el puerto serie para modbus por eso del uso de software serial muy util, si necesitas monitorizar datos

2º Lo que ocurreque no se si es posible con la librería ModbusMaster, no he encontrado ningún ejemplo,con dos slaves por lo que no se si no se puede mediante esta libreria(me parece raro), o no estoy realizando de forma idonea estaba generando otro nombre para el la segunda dirección del esclavo.

#include <ModbusMaster.h>               //Library for using ModbusMaster
#include <SoftwareSerial.h>
#define REDE 4
#define pot 0
int brillo;
ModbusMaster node; //Esclavo MQTT,1
ModbusMaster node1;// Segundo Esclavo
SoftwareSerial mySerial(10, 11); //RX y TX
void preTransmission()            //Function for setting stste of Pins DE & RE of RS-485
{
  digitalWrite(REDE, 1);
}

void postTransmission()
{
  digitalWrite(REDE, 0);
}



void control_led() {
  brillo = analogRead(pot);
  if (brillo >= 500) {
    node.writeSingleRegister(0, 1);       //Writes value to 0x0&&0x1 register id 1 y id 2
    node.writeSingleRegister(1, 1);
    node1.writeSingleRegister(0, 1);

  } else {
    node.writeSingleRegister(1, 0);       //Writes value to 0x0&&0x1 register id1 y id 2
    node.writeSingleRegister(0, 0);
    node1.writeSingleRegister(0, 0);
  }
}

void setup()
{
 pinMode(REDE, OUTPUT);
 pinMode(pot, INPUT);
 digitalWrite(REDE, 0);
 mySerial.begin(9600);             //Baud Rate as 9600
 mySerial.setTimeout(50);
 node.begin(1, mySerial); //Slave ID as 1

node.preTransmission(preTransmission);         //REDE ID as 1
node.postTransmission(postTransmission);

node1.preTransmission(preTransmission);         //REDE ID as 2
node1.postTransmission(postTransmission);
}
void loop() {

  control_led();

}

no he encontrado ningún ejemplo,con dos slaves

De acuerdo al driver MAX485 que uses puedes tener hasta 255 esclavos. Asi que lo único que debes hacer es asignar el ID del nodo correspondiente.

En el setup tu asignas

node.begin(1, mySerial); //Slave ID as 1

y solo estas trabajando con 1 nodo.

Si quisieras un segundo nodo bastaría con indicarlo asi

node1.begin(2, mySerial); //Slave ID as 2

Como verás usas el objeto node1 y le dices que Id tendrá y por que medio físico mySerial se comunicará.

Como siempre gracias surbyte!!, también tendría que indicar al nuevo nodo el void de pretransmision y postransmision? , o no seria necesario?

node1.preTransmission(preTransmission);
node1.postTransmission(postTransmission);

También tengo aumento del tiempo de respuesta de los arduinos al ser 2 nodos es normal ? o puede ser por que llamo a los void de tranmision dos veces, pero según mi "lógica" se debería de poder? o no es necesario asignar tanto el node 1 y el node a los void de transmision, intuyo que la librería tendrá tiempos de espera.

Por supuesto, tienes que manejar cada objeto por su lado, para lo que te aconsejo que armes una máquina de estado o saturarás la red de información.

1 Like

Okey, me pondre a mirar como funciona la maquina de estados, muchas gracias surbyte