Comunicacion RS485 para varios modulos

hola, tengo 2 módulos uno maestro y otro esclavo,
la idea base es la siguiente
el maestro manda
inicio I
dirección en binario 101
la función E para activar o desactivar un led,
O la función A, para que el esclavo envié una cadena de información

la cadena de información consta de los siguientes valores



boolean p = 1;
boolean v = 1;
boolean m = 1;
int th = 16;
int hh = 23;
int c = 9;
boolean pp = 1;
int mm = 5;
int tt = 16;
int vv = 3;

la cadena de datos entonces Seria algo así "11110000100001000110010000100" ya convertido los datos anteriores a binario y juntan dolos en el orden descrito anterior
"p v m th hh c pp mm tt vv"     "1 1 1 10000 10000 1000 1 100 10000 100"

todo esos valores se requiere enviarlo en binario
(Muy importante no enviarlo Serial.print(var,BIN); )
por que alli solo lo enviamos como binario por el monitor serial. mas no estamos convirtiéndolo a binario como tal el dato de la variable. tengo un dip en los pines analogicos para obtener la dirección por cada modulo
por lo pronto tengo el siguiente codigo

 esclavo

int       DipSwitch [3];
const int TxRxPin =  4;
char      Inicio = ' ';
int       DireccionModulo;
char      Fin = ' ';

void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 3; i++) {
    if  (analogRead(i + 3) > 500) {
      DipSwitch[i] = 1;
    }
    if (analogRead(i + 3) < 500) {
      DipSwitch[i] = 0;
    }
  }
  String Code = String(DipSwitch[3]) + String(DipSwitch[2]) + String(DipSwitch[1]) + String(DipSwitch[0]);
  DireccionModulo = Code.toInt();
  Serial.println(DireccionModulo);
  pinMode(TxRxPin, OUTPUT);
  digitalWrite(TxRxPin, LOW);
}
              
void loop() {
  if (Serial.available() != 0) {
    Inicio = Serial.read();
    if (Inicio == 'I') {
      int DireccionServidor = Serial.parseInt();
      if (DireccionServidor == DireccionModulo) {
        char Funcion = Serial.read();
        if (Funcion == 'E') {
          Fin = Serial.read();
          if (Fin == 'F') {
// entra para realizar algun cambio 
          }
        }
        if (Funcion == 'A') {
          Fin = Serial.read();
          if (Fin == 'F') {
            digitalWrite(TxRxPin, HIGH);
            Serial.print("I");
            Serial.print(DireccionModulo);
            Serial.print("F");
            Serial.print(            //Enviar 34 bits                  );
            Serial.flush();
            digitalWrite(TxRxPin, LOW);
          }
        }
      }
    }
  }
  delay(100);
}

maestro

int TxRxPin = 4;
int Boton_Envio = 10;
boolean Memoria_Boton = false;
char Inicio = ' ';
char Fin = ' ';
int Direccion_Servidor = 0;

void setup() {
  Serial.begin(9600);
  pinMode(TxRxPin, OUTPUT);
  pinMode(Boton_Envio, INPUT);
}

void loop() {
  if (Memoria_Boton == false) {
    Memoria_Boton = true;
    Direccion_Servidor = Direccion_Servidor + 1;
    if (Direccion_Servidor > 4) {
      Direccion_Servidor = 1;
    }
    digitalWrite(TxRxPin, HIGH);
    Serial.print("I");
    Serial.print(Direccion_Servidor, BIN);
    Serial.print("A");
    Serial.print("F");
    Serial.flush();
    digitalWrite(TxRxPin, LOW);
    delay(10);
  }
  uint8_t Convertir = sizeof(Direccion_Servidor) * 8;
  char str [Convertir + 1];
  itoa(Direccion_Servidor, str, 2);
  int IP  = String(str).toInt();
  if (Serial.available() != 0  &&  Memoria_Boton == true) {
    Inicio = Serial.read();
    if (Inicio == 'I') {
      int DireccionModulo = Serial.parseInt();
      if (DireccionModulo == IP) {
        Fin = Serial.read();
        if (Fin == 'F') {
          String Funcion = Serial.readString();
          Serial.print("\n");
          Serial.print("I");
          Serial.print(DireccionModulo);
          Serial.print(Funcion);
          Serial.println("#");
          Memoria_Boton = false;
        }
      }
    }
  }
  if (Direccion_Servidor > 4) {
    Direccion_Servidor = 0;
  }
}

con este código puedo enviar los datos pero es muy lento me imagino porque lo estoy enviar como string los datos, requiero que la velocidad sea mayor mínimo poder hacer el recorrido de 4 módulos en 1 segundo, les agradecería mucho su ayuda aunque sea para aumentar la velocidad de transmisión

Hola. This is the English speaking forum......

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


Mas cuidado para la próxima vez, en el foro en inglés solo usa ese idioma. Ahora que movieron tu hilo al foro en Español, no uses mas que español.

Creo que tu explicacion con bits esta o supongo esta correcta pero considera que si envias con un String esto

String DatosRaw = "11110000100001000110010000100";

no envias bits sino bytes asi que ya que ambos sabemos quen un byte tiene 8 bits, considera el desperdicio de memoria y tiempo que estas haciendo.
Si eso es lo que debes enviar conviertelo a hexadecimal primero
012345678901234567890123456789
1 1110 0001 0000 1000 1100 1000 0100
1 E 1 0 8 C 8 4
En eso se transforma en 4 bytes 0x1E 0x10 0x8C 0x84
y es lo que debes enviar.

Cuando usas módulos 485 existe un protocolo que se llama Modbus que te resuelve muchos problemas tantos que hacer lo que has hecho esta bien si estas obligado por una tarea universitaria de lo contrario mejor usar una librería Modbus.
Lo hará muy rápido y con corrección de errores, agregando un CRC al final.
Se usa en ambientes ruidosos industriales (electricamente ruidosos se entiende) de modo que imagina lo robusto que es.

tu de nuevo.....
claro esta que un string no envía los bits que requiero, claro esta por eso se tarda mucho.
solo lo escribí de esta forma para que comprendieran mas o menos el concepto de lo que se requiere, la cuestión es que no puedo utilizar librerías ni hex, todo es a través de código normales.....

Si te molestan mis respuestas no hay problema, paso de hacerlo.

una ves me hablastes sin respeto, yo digo si uno no ayuda mejor que no estorbe....

y algun problema??? todos somos libres...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.