miércoles, 22 de mayo de 2013

Comunicación serial entre dos computadores

Cable para conexión serial entre dos computadores
CONEXIÓN DEL CABLE DE COMUNICACIÓN
Conector DB9 para comunicación serial RS232
Para hacer la conexión entre los dos computadores se necesitara que estos tengan un puerto de comunicación serial, el puerto se puede verificar como un conector de 9 terminales macho DB9.
Este tipo de conector se encuentra en los equipos de que tengas puerto de comunicación serie o en los adaptadores USB - Serial RS232.
El tipo de conector en estos equipos es macho, los terminales de interés para la prueba de comunicación se muestran en la gráfica
Conector DB9 macho vista frontal
Cable De Comunicación Entre Dos Computadores
El tipo de conector que se empleara para hacer el cable es DB9 hembra, las gráficas mustran las vistas y los terminales de interés para la comunicación.
Conector DB9 hembra vista frontal
Conector DB9 hembra visto de atras
El cable de conexión debe ser un DB9 hembra cruzado con RX-TX y TX-RX el gráfico muestra la configuración.
Conexión cruzada
Conectores montados
PROGRAMA DE PRUEBA
El siguiente programa se encuentra en los ejemplos de processing en la siguiente ruta:
  • Examples/Library/Serial/SerialDuplex
Este programa sirve para probar que se realiza la comunicación entre los dos computadores enviando y recibiendo caracteres en formato ASCII. El programa es el mismo en ambos computadores.
Programa SerialDuplex
import processing.serial.*;
Serial myPort;
int whichKey = -1;
int inByte = -1;
void setup() {
  size(400, 300);
   PFont myFont = createFont(PFont.list()[2], 14);
  textFont(myFont);
  println(Serial.list());
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
}
void draw() {
  background(0);
  text("Last Received: " + inByte, 10, 130);
  text("Last Sent: " + whichKey, 10, 100);
}
void serialEvent(Serial myPort) {
  inByte = myPort.read();
}
void keyPressed() {
  myPort.write(key);
  whichKey = key;
}
DESCRIPCIÓN DEL PROBLEMA PROPUESTO
El presente sistema a simular consiste en que un computador se utilizara para simular el envío de datos de forma serial tal como lo hace una bascula de uso industrial. El formato empleado es el siguiente:
El símbolo = se empleara para indicar que se esta enviando un nuevo valor de peso y se podrá medir hasta 999 con dos valores decimales, esto se representa como =999.99
Un ejemplo de una cadena enviada por la bascula es el siguiente:
  • =123.20=126.34=124.87
Se puede observar que no hay espacios entre tramas de peso enviadas, por eso se utiliza el símbolo =  para indicar que hay una nueva trama.
En la recepción de datos se tendrá un visualizado en pantalla mostrando en dato recibido, ademas se contara con la opción de guardar los datos en archivo.
PROGRAMAS PROPUESTOS
El programa de recepción es mas complejo que el ejemplo SerialDuplex, ya que aquí se envían cadenas de caracteres. Este programa se elaboro en processing 1.2 y se tuvo problemas de conversión de cadenas. Este inconveniente ya esta corregido en las versiones mas posteriores de processing.
Computador Que Envía Datos
import processing.serial.*;
Serial miPuerto;
String puerto[];
void setup() {
  size(200, 200);
  puerto=Serial.list();
  println(puerto[0]);
  miPuerto=new Serial(this, puerto[0], 115200);
}
void draw() {
  miPuerto.write("=123.24");//Cadena a enviar al otro computador
}
Computador Recibe Datos
import processing.serial.*;//librerira de puerto serial
Serial miPuerto;//Objeto tipo puerto serial
String puerto[];//cadena para guardar a que puerto se accede
int nInicioCadena;
int[] nDatos = new int[20];//datos leidos en formato entero
char[] cDatosChar = new char[20];//datos leidos como caracteres
String[] strPeso= new String[1];//cadena pata guardar el peso leido
String cadena = "";//cadena a guardar con los carateres leidos
int i=0;//variable contadora en cero
boolean bBanderaCaptura=false;
void setup() {
  size (250, 140);
  puerto=Serial.list();//listo los puertos y los guardo en la cadena puerto
  println(puerto[0]);//imprimo el puerto que detecto como cero
  miPuerto=new Serial(this, puerto[0], 115200);//Instancio puerto en modo 8n1 a 115200 baudios
   PFont pfLetra = createFont(PFont.list()[2], 14);//Creo un tipo de letra con las que hay en el sistema
  textFont(pfLetra);//defino la letra creada para los textos
}
void draw() {
  strPeso[0]="";//cadena con el peso vacia
  background(255);//fondo blanco
  fill(0);//relleno de texto negro
  text("PESO", 30, 60);//muestro el mensaje PESO en la posicion 30,60
  for (int j=0;j<7;j++) {//para guardar hasta 7 caracteres en la cadena srtPeso
    if (nDatos[j]=='0')
      strPeso[0]=strPeso[0]+'0';
    if (nDatos[j]=='1')
      strPeso[0]=strPeso[0]+'1';
    if (nDatos[j]=='2')
      strPeso[0]=strPeso[0]+'2';
    if (nDatos[j]=='3')
      strPeso[0]=strPeso[0]+'3';
    if (nDatos[j]=='4')
      strPeso[0]=strPeso[0]+'4';
    if (nDatos[j]=='5')
      strPeso[0]=strPeso[0]+'5';
    if (nDatos[j]=='6')
      strPeso[0]=strPeso[0]+'6';
    if (nDatos[j]=='7')
      strPeso[0]=strPeso[0]+'7';
    if (nDatos[j]=='8')
      strPeso[0]=strPeso[0]+'8';
    if (nDatos[j]=='9')
      strPeso[0]=strPeso[0]+'9';
    if (nDatos[j]=='.')
      strPeso[0]=strPeso[0]+'.';
  }
  fill(0);//relleno de texto negro
  text(strPeso[0]+" Kg", 30, 100);//muestro la cadena con el peso
  saveStrings("peso.txt", strPeso);//guarda el peso leido en un archivo
}
void serialEvent(Serial miPuerto) {//detecta si hay un evento de puerto
  nInicioCadena=miPuerto.read();//lee la cadena enviada
  println(nInicioCadena);
  if (bBanderaCaptura==false) {
    if (nInicioCadena=='=') { //el simbolo = indica un nuevo dato de peso
      bBanderaCaptura=true;//activa la bandera de recepcion de un nuevo dato
    }
  }
  else {
    if (i<=6) {//captura 6 caracters y los convierte en una cadena
      nDatos[i] = nInicioCadena;
      i++;
      print(char(nDatos[i]));
    }
    else {
      bBanderaCaptura=false;//desactiva la bandera de dato recivido
      i=0;
      miPuerto.clear();//limpia el buffer para recicibir un nuevo dato
    }
  }
}
void keyPressed() {
  saveStrings("peso.txt", strPeso);//guarda los datos en un archivo
}

No hay comentarios:

Publicar un comentario