# ayuda en el manejo de puerto serial en java



## JuanDavidAlvarado (Oct 25, 2010)

En si el programa transmite y recibe, el problema es que el pic manda a travez del puerto serial a mi pc datos de este tipo: \2\4\4 ("creo que es un tipo de seguridad") y lo unico que recibo son 3 espacios en blanco en la consola de java, en hyperterminal recibo unas caras como puedo hacer para recibirlo como 244 en java, trabaje con la rxtxcomm.jar y la GyovinetDriver.jar, en la Gyovinet.jar al convertir los datos que entraban en String recibia los datos pero acompañado de muchos ceros, trate de separarlos y no se dejaron separar, la programacion del pic no debo cambiarla por politicas de empresa donde trabajo, y aqui el programa hecho con rxtx.


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

//import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 *
 * @author Juan
 */
public class TwoWaySerialComm {



 public TwoWaySerialComm()
    {
        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(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,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;
            String valor=" ";
       

            try {
              
                while ((len = this.in.read(buffer)) > -1) {
                    valor = (new String(buffer, 0, len));
                        String nuv = valor.toString();
                        
                    //String nuv = valor.toString();
                   // int numEntero = Integer.parseInt(nuv);




                    //System.out.print("receive" + numEntero);
                    System.out.print("receive"+valor);
                }
                 }
                  catch ( IOException e )
                {
                //e.printStackTrace();
                //}
                // }
              
            } 
        }
    }

    /** */
   // public static class SerialWriter implements Runnable
    //{
      //  OutputStream out;

        //public SerialWriter ( OutputStream out )
        //{
          //  this.out = out;
       // }

      //  public void run ()
      //  {
           // try
          //  {
             //   System.out.println("Listo");
             //   this.out.write("Listo pa escribir".getBytes());
              //  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 TwoWaySerialComm()).connect("COM1");
        }
        catch ( Exception e )
        {
            // TODO Auto-generated catch block
            //e.printStackTrace();
        }
    }

}
```


----------



## El nombre (Oct 26, 2010)

tienes que enviar con el pic: printf(%U,dato);
como string, vamos- Es decir: el 0x00 lo envia como 0x30 0x30. Te envia dos. 
Es el lio que se está formando para el envio de datos a un movil en PDF. Piensas que lo tienes que enviar como hexadecimal y claro esta, se interpreta en ascii. Al igual que cuando quieres saber la longitud de una cadena para transmitirla. Al estar en hexadecimal, al primer cero te detiene la cuenta. 
Espero no haber liado mas.
date una vuelta por http://bactering.blogspot.com/2010/10/enviar-sms-en-formato-pdu.html
el el cual ves el lio que se tiene que montar transformando numeros a cadenas y viceversa para poder codificar el texto y anteriormente el numero. que este hay que enviarlo como número y montado en hexadecimal. Si vas despacio en las tramas del programa verás que no es tan dificil ya que tu eres el que juega en un lado e interpretas en el otro.
saludos


----------



## JuanDavidAlvarado (Oct 28, 2010)

Gracias "El nombre", la informacion ha sido de gran ayuda, lo que transmite el circuito es como tu lo dices, es hexadecimal, y a modo de informacion les digo que he conseguido convertir los datos en String con un ciclo for, observando los datos que necesito, para quien le interese la solucion es:

byte[] buffer = new byte[1024];
String result;

for (int i = 0; i<buffer.length; i++) {
    result = Integer.toString( ( buffer_ & 0xff) +0x300, 6).substring( 3 );
     System.out.println(result);
}_


----------

