dijous, 6 de desembre del 2012

Programació JAVA port serie

Feia temps vaig programar el port sèrie amb java. Després ho vaig abandonar perquè el java hem costa, i pareixia que no tenia molt de futur, que era lent, que perquè utilitzar-lo en compte de programar amb altres llenguatges mes "Potents" com el QT i el C++, però si el JAVA es complicat encara ho es més el C++
Les llibreries QT semblaven que anaven a mes, els symbian, el slinux, el KDE.... despres Nokia es fa amb QT i despres Microsoft amb Nokia.

Però paral·lelament el JAVA el compra Oracle. I sobretot el que ara a canviat el panorama de JAVA es el Android. Principalment es programa amb JAVA escara que no es el JAVA de Oracle(Sun), no funciona tampoc amb la màquina virtual .class però el codi es pràcticament el mateix.

I JAVA torna a l'atac. Mentre que QT(C++) sembla que retrocedeix.


  1. JavaScript
  2. Java
  3. PHP
  4. Python
  5. Ruby
  6. C#
  7. C++
  8. C
  9. Objective-C
  10. Shell
Deixant de banda les estes qüestions que tampoc porten a cap lloc. Amb el curs d'Android que estic fent amb la nova perspectiva veig l'util de programar amb JAVA i se es necessari afegir una biblioteca en C, com es el cas del que acabe de fer amb el port serie.

Per utilitzar el port serie amb l'ubuntu i l'eclipse fan falt dos arxius:

librxtxSerial.so"  del directori "i686-unknown-linux-gnu" del arxiu "rxtx-2.1-7-bins-r2"

Aquesta llibreria està escrita en C i compilada amb el gcc en windows o inclus en android caldrà (a més de ser root) posar-la a la màquina on executem el programa i ja està. O portar-la el programa a la seva distribució com fa el programa del LOGO!.

Una vegada em fet això cal carregar les classes al jre que utilitzarem al programa. 

RXTXcomm.jar

Despres arranquem el eclipse i ja ens surt el RXTXcomm.jar però aquí he tingut algun problemeta, l'eclise no trobava els



import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;


Ho vaig solucionar barrant tota la llibreria JRE i tornat a "add library" el JRE de nou i ja funciona. 

connect("/dev/ttyUSB0");

A part del nom que ha de portar obligatòriament el /dev tambe cal tenir permisos

sudo adduser usuari dialout

Hem de afegir el usuari normal al grup dialout que es que te permis per escriure i llegir del port serie

I aqui està el programa que es una mena de putty de la consola que al testes que tinc hem cumunique i en retorna la temperatura quan li envie el return.

El proxim repte es comunicar-me amb el S7-200......



  



import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

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

public class JTCom
{
   public JTCom()
   {
       super();
   }
   
   void connect ( String portName ) throws Exception
   {
       CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
       if ( portIdentifier.isCurrentlyOwned() )
       {
           System.out.println("Error: Port is currently in use");
       }
       else
       {
           CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
           
           if ( commPort instanceof SerialPort )
           {
               SerialPort serialPort = (SerialPort) commPort;
               serialPort.setSerialPortParams(1200,SerialPort.DATABITS_7,SerialPort.STOPBITS_2,SerialPort.PARITY_NONE);
               
               InputStream in = serialPort.getInputStream();
               OutputStream out = serialPort.getOutputStream();
               
               (new Thread(new SerialReader(in))).start();
               (new Thread(new SerialWriter(out))).start();

           }
           else
           {
               System.out.println("Error: Only serial ports are handled by this example.");
           }
       }     
   }
   
   /** */
   public static class SerialReader implements Runnable 
   {
       InputStream in;
       
       public SerialReader ( InputStream in )
       {
           this.in = in;
       }
       
       public void run ()
       {
           byte[] buffer = new byte[1024];
           int len = -1;
           try
           {
               while ( ( len = this.in.read(buffer)) > -1 )
               {
                   System.out.print(new String(buffer,0,len));
               }
           }
           catch ( IOException e )
           {
               e.printStackTrace();
           }            
       }
   }

   /** */
   public static class SerialWriter implements Runnable 
   {
       OutputStream out;
       
       public SerialWriter ( OutputStream out )
       {
           this.out = out;
       }
       
       public void run ()
       {
           try
           {                
               int c = 0;
               while ( ( c = System.in.read()) > -1 )
               {
                   this.out.write(c);
               }                
           }
           catch ( IOException e )
           {
               e.printStackTrace();
           }            
       }
   }
   
   public static void main ( String[] args )
   {
       try
       {
           (new JTCom()).connect("/dev/ttyUSB0");
       }
       catch ( Exception e )
       {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
   }
}

Cap comentari:

Publica un comentari a l'entrada