torres.electronico
Well-known-Alfil
Buenas, estoy trabajando en un proyecto de comunicación y me tope con varios problemas que me dieron dolores de cabeza... Para poder llegar al índice, raíz del conflicto que me esta haciendo ponchear, tuve que hacer varios parches/modificaciones para deducir y llegar a la conclusión que estoy teniendo problema con el desglose e interpretación de la trama de datos...
El circuito es el siguiente... La idea era hacer un ejemplo de adquisición de datos y comunicación entre dispositivos implementando el conversor RS485-RS232, para luego volcar todos esos datos en una plantilla Excel a modo registrador.
Los programas implementados hasta el momento funcionan, pero falta el puntero mas importante, que es el que nos indica el fin de transmisión... Probé de diversas maneras (trabajando los datos en formato bytes, HEX, char, etc.) y siempre me pasa lo mismo... Arranco subiendo los programas del MASTER y los 2 ESCLAVOS
MASTER
ESCLAVO1
ESCLAVO2
Bien, cuando el esclavo recibe la trama de datos y reconoce los caracteres de comandos, automáticamente responde, pero el MASTER no diferencia la direccion del valor del sensor... ahi arranco parte del problema
Bien, implementando los espacios entre datos, logre que el master interprete la trama, pero el puntero mas importante (f) que me indica que finaliza la trama de datos, no me lo interpreta, asi que lo obvie y el programa corre normalmente... Lei que Serial.parseInt(); lee la trama y solo toma los valores numéricos, descartando los caracteres... En efecto, arme un programa corto para ver como se comportaba, y funciona de esta manera... El tema es que me junta todos los valores numéricos y no es desglosado, lo cual lleva a tener el error de que no interprete la dirección y quede estancado en la primer condicional...
Alguien podría citarme un ejemplo practico (probado físicamente o en proteus) que funcione? Mas que nada para entender como puedo generar punteros para diferenciar los datos y hacer el desglose de este.
Gracias a todos...
El circuito es el siguiente... La idea era hacer un ejemplo de adquisición de datos y comunicación entre dispositivos implementando el conversor RS485-RS232, para luego volcar todos esos datos en una plantilla Excel a modo registrador.
Los programas implementados hasta el momento funcionan, pero falta el puntero mas importante, que es el que nos indica el fin de transmisión... Probé de diversas maneras (trabajando los datos en formato bytes, HEX, char, etc.) y siempre me pasa lo mismo... Arranco subiendo los programas del MASTER y los 2 ESCLAVOS
MASTER
CSS:
/////////////////////////////////////////////////////////////////////////
// Ejemplo de comunicacion RS485-RS232 con ARDUINO (Sketch del MASTER) //
/////////////////////////////////////////////////////////////////////////
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
int value1;
int value2;
int slave2;
int slave1;
const int LED = 13;
const int Enable = 2;
void setup()
{
Serial.begin(9600);
Serial.setTimeout(250);
pinMode(LED, OUTPUT);
pinMode(Enable, OUTPUT);
digitalWrite(LED, LOW);
digitalWrite(Enable, HIGH); // inicio de transmision al esclavo 1
lcd.init();
lcd.backlight();
lcd.clear();
}
void loop()
{
lcd.setCursor(0,0);
lcd.print("****RS232 RS485****");
lcd.setCursor(0,3);
lcd.print("**********ETI*********");
Serial.println("-");
delay(10);
digitalWrite(Enable, HIGH); // inicio de transmision al esclavo 1
Serial.print("I");
Serial.print("1");
Serial.print("L");
Serial.print("F");
Serial.flush();
//delay(10);
digitalWrite(Enable, LOW); // fin de transmision al esclavo 1
if(Serial.available())
{
if(Serial.find("i"))
{
int direccion = Serial.parseInt(); //recibimos la direccion
if((direccion)==1) //Si direccion es la nuestra
{
value1 = Serial.parseInt();
lcd.setCursor(0,1);
lcd.print("Esclavo 1:");lcd.print(value1);
}
}
Serial.println("-");
delay(10);
digitalWrite(Enable, HIGH); // inicio de transmision al esclavo 2
Serial.print("I");
Serial.print("2");
Serial.print("L");
Serial.print("F");
Serial.flush();
//delay(10);
digitalWrite(Enable, LOW); // fin de transmision al esclavo 2
if(Serial.available())
{
//lcd.setCursor(0,0);
//lcd.print("******DATO**********");
// con esta parte iba viendo hasta donde reconocía los comandos del esclavo
//lcd.setCursor(0,3);
//lcd.print("**********ETI*********");
if(Serial.find("i"))
{
int direccion=Serial.parseInt(); //recibimos la direccion
if(direccion==2) //Si direccion es la nuestra
{
value2 = Serial.parseInt();
lcd.setCursor(0,2);
lcd.print("Esclavo 2:");lcd.print(value2);
}
}
digitalWrite(Enable, LOW);
}
}
}
ESCLAVO1
CSS:
/////////////////////////////////////////////////////////////////////////
// Ejemplo de comunicacion RS485-RS232 con ARDUINO (Sketch del ESCLAVO1) //
/////////////////////////////////////////////////////////////////////////
const int Enable = 2;
const int SlaveNumber = 1;
void setup()
{
Serial.begin(9600);
Serial.setTimeout(250);
pinMode(Enable, OUTPUT);
digitalWrite(Enable, LOW);
pinMode(13, OUTPUT);
pinMode(A0, INPUT);
}
void loop()
{
if(Serial.available())
{
if(Serial.read()=='I')
{
int Slave = Serial.parseInt();
if(Slave == SlaveNumber)
{
char command = Serial.read();
if(command == 'L')
{
if(Serial.read()=='F')
{
int lectura = analogRead(0);
int AnalogValue = map(lectura, 0, 1023, 0, 255);
digitalWrite(Enable, HIGH);
Serial.print("i");
Serial.print(" ");
Serial.print(SlaveNumber);
Serial.print(" ");
Serial.print(AnalogValue);
Serial.print(" ");
Serial.print("f");
Serial.print(" ");
Serial.flush();
digitalWrite(Enable, LOW);
}
}
}
}
}
delay(10);
}
ESCLAVO2
CSS:
/////////////////////////////////////////////////////////////////////////
// Ejemplo de comunicacion RS485-RS232 con ARDUINO (Sketch del ESCLAVO2) //
/////////////////////////////////////////////////////////////////////////
const int Enable = 2;
const int SlaveNumber = 2;
void setup()
{
Serial.begin(9600);
Serial.setTimeout(250);
pinMode(Enable, OUTPUT);
digitalWrite(Enable, LOW);
pinMode(13, OUTPUT);
pinMode(A0, INPUT);
}
void loop()
{
if(Serial.available())
{
if(Serial.read()=='I')
{
int Slave = Serial.parseInt();
if(Slave == SlaveNumber)
{
char command = Serial.read();
if(command == 'L')
{
if(Serial.read()=='F')
{
int lectura = analogRead(0);
int AnalogValue = map(lectura, 0, 1023, 0, 255);
digitalWrite(Enable, HIGH);
Serial.print("i");
Serial.print(" ");
Serial.print(SlaveNumber);
Serial.print(" ");
Serial.print(AnalogValue);
Serial.print(" ");
Serial.print("f");
Serial.print(" ");
Serial.flush();
digitalWrite(Enable, LOW);
}
}
}
}
}
delay(10);
}
Bien, cuando el esclavo recibe la trama de datos y reconoce los caracteres de comandos, automáticamente responde, pero el MASTER no diferencia la direccion del valor del sensor... ahi arranco parte del problema
CSS:
if(Serial.read()=='F')
{
int lectura = analogRead(0); //Lectura del puerto analogico
int AnalogValue = map(lectura, 0, 1023, 0, 255); // mapeamos la señal para que nos de un numero de 0 a 255
digitalWrite(Enable, HIGH); // Inicio de transmision, queda en modo ENVIO de DATOS
Serial.print("i"); // envio el puntero indicador de que el esclavo responde
Serial.print(" "); // Lo implemento para generar un espacio entre datos
Serial.print(SlaveNumber); // Envio el numero de dispositivo ESCLAVO
Serial.print(" "); // Lo implemento para generar un espacio entre datos
Serial.print(AnalogValue); // Envio el valor de la lectura analogica
Serial.print(" "); // Lo implemento para generar un espacio entre datos
Serial.print("f"); // envio de comando puntero de fin de trama
Serial.print(" "); // Lo implemento para generar un espacio entre datos
Serial.flush(); // Limpia el buffer
digitalWrite(Enable, LOW); // Fin de transmision, queda en modo ESCUCHA
}
Bien, implementando los espacios entre datos, logre que el master interprete la trama, pero el puntero mas importante (f) que me indica que finaliza la trama de datos, no me lo interpreta, asi que lo obvie y el programa corre normalmente... Lei que Serial.parseInt(); lee la trama y solo toma los valores numéricos, descartando los caracteres... En efecto, arme un programa corto para ver como se comportaba, y funciona de esta manera... El tema es que me junta todos los valores numéricos y no es desglosado, lo cual lleva a tener el error de que no interprete la dirección y quede estancado en la primer condicional...
Alguien podría citarme un ejemplo practico (probado físicamente o en proteus) que funcione? Mas que nada para entender como puedo generar punteros para diferenciar los datos y hacer el desglose de este.
Gracias a todos...