API's y COMM [Duda]

Este es un lugar dedicado a los genios del teclado y los lenguajes de programación. Si tu virtud está dedicada a programar, a sumar líneas de código para alcanzar realizaciones asombrosas, éste es tu espacio. ¡Por supuesto! ¡También será el lugar para aprender de los que más saben del tema!

Moderador: HJ

API's y COMM [Duda]

Notapor HJ » Vie Nov 01, 2013 11:42 pm

Estoy encarando un nuevo desarrollo y me gustaría manejar los puertos COMM de la PC a través las API's de Windows.
Hasta ahora he averiguado que la API a utilizar es la WIn32, de la cual se puede usar varias funciones, entre ellas:
CreateFile
SetupComm
GetCommState
SetCommState
y varias mas...

La pregunta es ¿alguien ha trabajado con esta API y puede darme algún TIP para ello.
En particular, me interesa poder manejar las señales de control del puerto directamente con esta API.

La verdad es que todavía no he probado nada (no me reten), solo estoy recopilando información al respecto.

Gracias desde ya.

Saludos
HJ

P.D: El trabajo con API's lo tengo bien claro ya que he hecho bastante con ellas, pero no para este uso en particular, puede que sea una soncera, pero me gusta informarme antes de ponerme de cabeza sobre algo en particular.
"Cuando llegue la inspiración, que me encuentre trabajando"
Picasso, Pablo
Avatar de Usuario
HJ
 
Mensajes: 477
Registrado: Jue Mar 21, 2013 3:16 pm
Ubicación: Tanti - Córdoba - Argentina

Re: API's y COMM [Duda]

Notapor Droybot » Dom Nov 03, 2013 8:45 am

Hola Héctor, hace unos años tuve el atrevimiento de entrometerme en este tema, solo por curiosidad. Recuerdo que anoté algunas ideas y experiencias así como las metidas de pata, por supuesto. Tengo la costumbre de hacer esto para no caer en lo mismo en el futuro.

Aunque nos hayas dicho que ya tienes experiencia en desarrollos con Win32, no creo que esté demás que te alcance un dato (posiblemente ya lo tengas pero puede servirle a alguien). Se trata del Tutorial de Forger.( http://winprog.org/tutorial/es/ )

Algo que si te pediría es que, en la medida de lo posible, nos muestres tus avances en el tema.

Saludos
Avatar de Usuario
Droybot
 
Mensajes: 42
Registrado: Jue Mar 21, 2013 9:11 pm

Re: API's y COMM [Duda]

Notapor HJ » Dom Nov 03, 2013 11:54 am

Gracias amigo. Le voy a dar una leída, siempre es bueno refrescar conocimientos y ver ideas nuevas sobre temas ya conocidos.

Saludos
HJ
"Cuando llegue la inspiración, que me encuentre trabajando"
Picasso, Pablo
Avatar de Usuario
HJ
 
Mensajes: 477
Registrado: Jue Mar 21, 2013 3:16 pm
Ubicación: Tanti - Córdoba - Argentina

Re: API's y COMM [Duda]

Notapor elgarbe » Dom Nov 03, 2013 12:14 pm

Hola hector y en que lenguaje programarias?

saludos!
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

Re: API's y COMM [Duda]

Notapor HJ » Dom Nov 03, 2013 12:52 pm

elgarbe escribió: en que lenguaje programarias?

El único que domino realmente es el VB6, pero está muy anticuado...(al igual que yo...jeje).... creo que voy ha tener que hacerlo en VB.net o C# (en ambos he realizado solo pequeñeces), incluso hace unos días comencé a estudiar Java (todavía no he hecho nada, solo estoy estudiando la teoría).
en fin, contestando tu pegunta: No sé todavía.

Saludos
HJ
"Cuando llegue la inspiración, que me encuentre trabajando"
Picasso, Pablo
Avatar de Usuario
HJ
 
Mensajes: 477
Registrado: Jue Mar 21, 2013 3:16 pm
Ubicación: Tanti - Córdoba - Argentina

Re: API's y COMM [Duda]

Notapor Droybot » Dom Nov 03, 2013 4:26 pm

Pienso que lo más recomendable sería en C o C++, de hecho la mayoría de las librerías dinámicas están en C, pero definitivamente depende de cada uno. De los lenguajes que mencionaste, creo que el más cercano es el Java.

Saludos
Avatar de Usuario
Droybot
 
Mensajes: 42
Registrado: Jue Mar 21, 2013 9:11 pm

Re: API's y COMM [Duda]

Notapor HJ » Dom Nov 03, 2013 8:25 pm

El último programa que hice en C++ fue hace 20 años o quizás un poco mas... ahora que estoy viendo java, he comenzado a recordar algunas cosas que tenía totalmente olvidadas... (como pasa el tiempo)


Saludos
HJ
"Cuando llegue la inspiración, que me encuentre trabajando"
Picasso, Pablo
Avatar de Usuario
HJ
 
Mensajes: 477
Registrado: Jue Mar 21, 2013 3:16 pm
Ubicación: Tanti - Córdoba - Argentina

Re: API's y COMM [Duda]

Notapor elgarbe » Lun Nov 04, 2013 7:38 am

Mi humilde opinion es que si es una aplicacion pequña sin mucha interfaz con el usuario, seguí con vb 6. a mi me costó un monton de tiempo pasar a vb.net. es algo totalmente distinto. En mi caso en aplicaciones para acceder a bases de datos...
Despues entre C y C++ o C#, si no vas a usar clases (que representen objetos) y todo eso, es lo mismo cualquiera de los 3. Yo he trabajado con modelo de aplicaciones en 3 capas, hize librerias dll con objetos, componentes activex etc, etc. en ningun caso pude justificar el esfuerzo adicional de re apredenr C para hacer esas cosas y las termine resolviendo con lo que sabía.... VB 6!!! incluso hice 3 intentos de pasar a vb.net en 3 aplicaciones disintas y recien en la tercera puede terminar con vb.net, en las otras dos me volvi a VB 6!!!! jeje
Java no conozco, pero parece ser el lebguaje universal ultimamente
Ojo, es solo mi opinion, la cual puede estar mas que errada..

Saludos!
A palabras producidas por mentes inoperantes órganos auditivos en posicion de relax

You can be anything you want to be just turn yourself into anything you think that you could ever be - Freddie Mercury
Avatar de Usuario
elgarbe
 
Mensajes: 261
Registrado: Jue Mar 21, 2013 8:27 pm
Ubicación: Villa Ramallo - Buenos Aires - Argentina

Re: API's y COMM [Duda]

Notapor HJ » Mié Nov 06, 2013 8:45 am

Bueno, les comento que me estoy inclinando por Java...



(pero si falla, volveré a VB6, y el que necesite utilizar el programa que consiga una máquina que pueda corrorlo sin problemas...jeje)

Saludos
HJ
"Cuando llegue la inspiración, que me encuentre trabajando"
Picasso, Pablo
Avatar de Usuario
HJ
 
Mensajes: 477
Registrado: Jue Mar 21, 2013 3:16 pm
Ubicación: Tanti - Córdoba - Argentina

Re: API's y COMM [Duda]

Notapor jakala » Dom Dic 15, 2013 8:39 am

Buenas de nuevo!!!

Aunque es un poco antiguo, acabo de ver este mensaje y me he acordado de un proyecto que antaño hice en java... Se trataba de controlar un robot que compre hace tiempo en superrobotica, una variante de este: http://www.superrobotica.com/S300123.htm.

Concretamente el proyecto lo hice en java, y necesite trabajar con la libreria javacomm20... Te lo dejo aqui compartido por si te sirve, ok?
En este caso, es la clase Circuito.java, que simula el circuito de control serie que viene con el robot( el SCC32, http://www.superrobotica.com/S310185.htm). veras que se crea el objeto SerialPort en el metodo ReadWrite. Se configura el puerto con setSerialPortParams() y luego solo tienes que obtener el objeto outputstream para escribir como harias con cualquier otro objeto output.
Código: Seleccionar todo
package Circuito;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;

import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.UnsupportedCommOperationException;


public class Circuito implements Serializable{
   /**
    * cadena que identifica el puerto serie al que vamos a conectar el robot.
    */
   public static String puertoSerie = "COM1";
   public static int dataBits = 8;
   public static int stopBits = 1;
   public static int parity=0;
   /**
    * Variables que representa el ancho de pulso en microsegundos. Se definen
    * MIN: minimo valor
    * MID: representa la posicion media
    * MAX: el maximo valor
    * @author acid
    */
    public static int  PW_MIN = 500,
                   PW_AVG=1500,
                   PW_MAX=2500;
   /**
    * constantes que representa los canales que puede controlar el circuito. Aunque solo usemos
    * seis, se definen todos para multiples usos del circuito.
    *
    * @author acid
    *
    */
   public static int
      CHANNEL_0=0,      CHANNEL_1=1,      CHANNEL_2=2,      CHANNEL_3=3,      
      CHANNEL_4=4,      CHANNEL_5=5,      CHANNEL_6=6,      CHANNEL_7=7,
      CHANNEL_8=8,      CHANNEL_9=9,      CHANNEL_10=10,      CHANNEL_11=11,
      CHANNEL_12=12,      CHANNEL_13=13,      CHANNEL_14=14,      CHANNEL_15=15,
      CHANNEL_16=16,      CHANNEL_17=17,      CHANNEL_18=18,      CHANNEL_19=19,
      CHANNEL_20=20,      CHANNEL_21=21,      CHANNEL_22=22,      CHANNEL_23=23,
      CHANNEL_24=24,      CHANNEL_25=25,      CHANNEL_26=26,      CHANNEL_27=27,
      CHANNEL_28=28,      CHANNEL_29=29,      CHANNEL_30=30,      CHANNEL_31=31;
   /**
    * SPD representa la velocidad de movimiento, en microSegundos, del servo que se mueve.
    */
   public static int SPD=10000; // 10 segundos
   
   /**
    * TIME es el tiempo TOTAL que va a durar la ejecucion de todo el movimiento (esto incluye
    * el movimiento de todos los servos)
    */
   public static int TIME=10000;  // 10 segundos
   
   /**
    * CR es el caracter de retorno de carro. Se necesita para empezar la instruccion.
    */
   public static char CR= '\r';
   
   /**
    * ESC es el caracter de escape, que se necesita para parar la la instruccion que se este
    * ejecutando en ese momento
    */
   public static char ESC = 27;

   /**
    * danger es un metodo que ejecuta una instruccion de emergencia, parando la ejecucion del
    * movimiento actual.
    */
   public static void danger() throws CircuitExecuteException{
      String cadena = ESC+" "+CR;
      readWrite(cadena);
   }
   /**
    * procedimiento para EJECUTAR la instruccion indicada por el puerto serie. Puede devolvernos
    * un valor (Dependiendo de la orden introducida)
    * @param orden es una cadena que presenta una orden al circuito.
    * @return un caracter, que es el resultado que nos da la orden.
    */
   public static int readWrite(String orden) throws CircuitExecuteException{
     SerialPort serialPort;
     CommPortIdentifier portId;
     OutputStream outputStream;
     InputStream inputStream;
     int resultado=0;
    
     orden =orden + CR;

     try {
      portId = CommPortIdentifier.getPortIdentifier(puertoSerie);
       serialPort = (SerialPort)   portId.open("SimpleRobotReadWrite", 2000);

       outputStream = serialPort.getOutputStream();
       inputStream = serialPort.getInputStream();
          
      
       serialPort.setSerialPortParams(9600,
             SerialPort.DATABITS_8,
             SerialPort.STOPBITS_1,
             SerialPort.PARITY_NONE);
 
       outputStream.write(orden.getBytes());
       serialPort.close();
      outputStream.close();
      inputStream.close();
          
      } catch (NoSuchPortException e) {
         e.printStackTrace();
         throw new CircuitExecuteException("Puerto no disponible:"+ puertoSerie);
      } catch (PortInUseException e) {
         e.printStackTrace();
         throw new CircuitExecuteException("Puerto "+ puertoSerie+ "en uso.");
      } catch (IOException e) {
         e.printStackTrace();
         throw new CircuitExecuteException("Fallo en comunicacion");
      } catch (UnsupportedCommOperationException e) {
         e.printStackTrace();
         throw new CircuitExecuteException("Fallo en comunicacion");
      }
      System.out.println("fin de readWrite en circuito. Resultado ='"+resultado+"'");
      return resultado;
   }
   

   
   public static int read(String orden) throws CircuitExecuteException{
        SerialPort serialPort;
        CommPortIdentifier portId;
        OutputStream outputStream;
        InputStream inputStream;
        int resultado=0;
       
        orden =orden + CR;

        try {
         portId = CommPortIdentifier.getPortIdentifier(puertoSerie);
          serialPort = (SerialPort)   portId.open("SimpleRobotReadWrite", 2000);

          outputStream = serialPort.getOutputStream();
          inputStream = serialPort.getInputStream();
             
         
          serialPort.setSerialPortParams(9600,
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
   
          outputStream.write(orden.getBytes());
          outputStream.flush();
          resultado = inputStream.read();
          serialPort.close();
         outputStream.close();
         inputStream.close();
             
         } catch (NoSuchPortException e) {
            e.printStackTrace();
            throw new CircuitExecuteException("Puerto no disponible:"+ puertoSerie);
         } catch (PortInUseException e) {
            e.printStackTrace();
            throw new CircuitExecuteException("Puerto "+ puertoSerie+ "en uso.");
         } catch (IOException e) {
            e.printStackTrace();
            throw new CircuitExecuteException("Fallo en comunicacion");
         } catch (UnsupportedCommOperationException e) {
            e.printStackTrace();
            throw new CircuitExecuteException("Fallo en comunicacion");
         }
         System.out.println("fin de readWrite en circuito. Resultado ='"+resultado+"'");
         return resultado;
      }

   
   /**
 *
 * Los siguientes metodos generan cadenas de instrucciones que puede interpretar el circuito. Su forma
 * de utilizar deberia ser algo como readWrite(instruccion(parametros));
 *
 */
   
/**
 * bloque de instrucciones de escritura
 */
   /**
    * servoMove construye una cadena, que es la instruccion que maneja el circuito para mover
    * los servos.(para un conjunto utilizar groupMove)
    * @param canal indica el servo a mover
    * @param pulso posicion final donde movernos
    * @param vel tiempo que se va a tardar en realizar el movimiento
    * @param tiempo es un tiempo global, de toda la instruccion.
    * @return
    */
   private static String servoMove(int canal, int pulso, int vel){
      String cadena =" #"+canal+" P"+pulso+" S"+vel ;
      return cadena;
   }

   public static String servoMove(Movimiento move){
      return servoMove(move.getCanal(), move.getPulso(), move.getVelocidad());
   }
   /**
    * groupMove es un metodo para meter varios movimientos y ejecutarlos como una unica
    * instruccion.
    *
    * @return una cadena que contiene el movimiento de todos los servos.
    */
   public static String groupMove(Movimiento[] listado){
      String cadena = "";
      for (Movimiento m : listado){
         cadena +=servoMove(m);
      }
      return cadena;
   }
   
   /**
    * pulseOffset construye una cadena que es la instruccion que maneja el circuito para poner
    * los servos con el pulse indicado.
    * @param canal
    * @param pulso
    * @return la cadena con la orden
    */
   private static String pulseOffset(int canal, int pulso){
      return " #"+canal+ " PO"+pulso+ " ";
   }
   
   public static String pulseOffset(Movimiento offset){
      return pulseOffset(offset.getCanal(), offset.getPulso());
   }
   
   /**
    * esta version de pulseOffset permite indicar varios movimientos y obtener la instruccion
    * offset de estos.
    * @param offset el movimiento a configurar como offset
    * @return la cadena con la orden de varios pulseOffset
    */
   public static String pulseOffset(Movimiento[] offset){
      String cadena = "";
      for (Movimiento m : offset){
         cadena +=servoMove(m);
      }
      return cadena;
   }
   
   /**
    * discreteOutput construye la cadena instruccion para establecer el nivel H o L en el canal
    * indicado.
    * @param channel canal a establecer.
    * @param level nivel (solo puede ser H o L) H para +5v, L para 0v
    * @return la cadena con la instruccion
    */
   private static String discreteOutput(int channel, char level){
      return "#"+channel +level+ " ";
   }
   public static String discreteOutput(Discrete mov){
      return discreteOutput(mov.getCanal(), mov.getNivel());
   }

   public static String discreteOutput(Discrete[] mov){
      String cadena = "";
      for(Discrete D : mov){
         cadena +=discreteOutput(D);
      }
      
      return cadena;
   }
/**
 * Bloque de instrucciones de lectura del circuito
 *
 * Este tipo de instrucciones necesitan escribir en el circuito, y en funcion de esa orden, se obtiene
 * un valor (normalmente tipo char).
 */   
   
   /**
    * queryMovement es una orden que determina si hay algun movimiento en curso.
    *
    * @return '.' si el movimiento previo se ha finalizado
    * @return '+' si el movimiento anterior esta en proceso
    *
    * @throws CircuitExecuteException si no se ha podido ejecutar readWrite
    */
   public static char queryMovement() throws CircuitExecuteException{
      return (char) read("Q "+ CR);
   }
   
   /**
    * queryPulse nos devuelve el ancho del pulso del servo indicado por parametro
    *
    * @param Channel el servo que queremos analizar
    * @return un entero que representa el ancho del pulso (la posicion)
    * @throws CircuitExecuteException
    */
   public static int queryPulse(int hannel) throws CircuitExecuteException {
      return read("QP "+hannel);
   }
   
   /**
    * readDigitalInput nos informa del estado de las entradas del circuito.
    *
    * @param entrada representa un caracter, que solo puede ser A, B, C, D;
    * @return '0' si la entrada esta a 0v
    * @return '1' si la entrada esta a 5v
    * @throws CircuitExecuteException
    */
   public static char readDigitalInput(char entrada) throws CircuitExecuteException{
      return (char) readWrite(entrada+ " "+ CR);
   }

   /**
    * readDigitalInput nos informa del estado de las entradas del circuito.
    *
    * @param entrada representa un caracter, que solo puede ser AL, BL, CL, DL;
    * @return '0' si la entrada esta a 0v
    * @return '1' si la entrada esta a 5v
    * @throws CircuitExecuteException
    */
   public static char readDigitalInput(String entrada) throws CircuitExecuteException{
      return (char) readWrite(entrada + " "+ CR);
   }

   /**
    * readAnalogicInput nos devuelve el voltaje que esta pasando por la entrada indicada como
    * parametro.
    * @param entrada La entrada del circuito que queremos analizar
    * @return un double que representa el voltaje que esta pasando por la entrada. El rango aceptado
    * es entre 0 y 5v.
    * @throws CircuitExecuteExeption
    */
   public static double readAnalogicInput(char entrada) throws CircuitExecuteException{
      double resultado = 0;
      resultado = readWrite("V"+entrada + " "+ CR);
      resultado = resultado * 5 / 256;
      
      return resultado;
   }
   
   public static void delay() throws CircuitExecuteException{
      char espera;
      do{
         espera = queryMovement();
         System.out.print(espera);
      }while(espera=='+');


   }
}

Avatar de Usuario
jakala
 
Mensajes: 10
Registrado: Jue Mar 21, 2013 7:59 pm

Siguiente

Volver a Software

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron