2011-11-15 30 views
9

Sé que en J2ME CommConnection es la conexión a utilizar cuando se trabaja con serial port. Sé que existen los métodos openInputStream y openOutputStream, pero de hecho no sé cómo transferir datos desde mi MIDLet al puerto COM (el puerto USB en el que está insertado el cable del teléfono, el teléfono es Alcatel OT-806D). Por ejemplo, quiero enviar el texto "Hola mundo". ¿Cómo lograr eso?¿Cómo transferir datos a un puerto en serie?

Éstos son códigos:

J2ME:

import java.io.IOException; 
import java.io.OutputStream; 
import javax.microedition.io.CommConnection; 
import javax.microedition.io.Connector; 
import javax.microedition.lcdui.Command; 
import javax.microedition.lcdui.CommandListener; 
import javax.microedition.lcdui.Display; 
import javax.microedition.lcdui.Displayable; 
import javax.microedition.lcdui.Form; 
import javax.microedition.midlet.*; 

public class SerialPortMidlet extends MIDlet implements CommandListener, Runnable { 
    private Command upload = new Command("upload", Command.SCREEN, 0); 
    private Command exit = new Command("exit", Command.SCREEN, 1); 
    private Form f = new Form("test serial port"); 
    private Thread uploadThread; 
    private CommConnection com; 
    private OutputStream os; 
    public SerialPortMidlet() 
    { 
     f.addCommand(upload); 
     f.addCommand(exit); 
     f.setCommandListener(this); 
     uploadThread = new Thread(this); 
    } 
    public void startApp() { 
     Display.getDisplay(this).setCurrent(f); 
    } 
    public void pauseApp() { 
    } 
    public void destroyApp(boolean unconditional) { 
     notifyDestroyed(); 
    } 
    public void commandAction(Command c, Displayable d) { 
     if (c == upload) 
     { 
      uploadThread.start(); 
      f.removeCommand(upload); 
     } 
     else if (c == exit) 
     { 
      if (uploadThread.isAlive()) 
      { 
       uploadThread.interrupt(); 
       try { 
        uploadThread.join(); 
       } catch (InterruptedException ex) { 
        ex.printStackTrace(); 
       } 
      } 
      destroyApp(true); 
     } 
    } 
    public void run() { 
     try 
     { 
      String s = new String("andrana mandefa lavaka"); 
      com = (CommConnection) Connector.open("comm:COM4"); 
      os = com.openOutputStream(); 
      os.write(s.getBytes()); 
      os.close(); 
     } 
     catch (IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 

J2SE: (Eclipse)

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

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
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(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); 

       InputStream in = serialPort.getInputStream(); 
       OutputStream out = serialPort.getOutputStream(); 

       (new Thread(new SerialWriter(out))).start(); 

       serialPort.addEventListener(new SerialReader(in)); 
       serialPort.notifyOnDataAvailable(true); 

      } 
      else 
      { 
       System.out.println("Error: Only serial ports are handled by this example."); 
      } 
     }  
    } 
    public static class SerialReader implements SerialPortEventListener 
    { 
     private InputStream in; 
     private byte[] buffer = new byte[1024]; 

     public SerialReader (InputStream in) 
     { 
      this.in = in; 
     } 

     public void serialEvent(SerialPortEvent arg0) { 
      int data; 

      try 
      { 
       int len = 0; 
       while ((data = in.read()) > -1) 
       { 
        if (data == '\n') { 
         break; 
        } 
        buffer[len++] = (byte) data; 
       } 
       System.out.print(new String(buffer,0,len)); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
       System.exit(-1); 
      }    
     } 

    } 
    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(); 
       System.exit(-1); 
      }    
     } 
    } 
    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     try 
     { 
      (new TwoWaySerialComm()).connect("COM1"); 
     } 
     catch (Exception e) 
     { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

corro el programa de J2SE, insertar el cable de teléfono móvil en la computadora (en la ranura USB), hice clic en el comando upload en el J2M E aplicación, ¡pero no hay nada en la pantalla de salida del eclipse!

¿Cuál es el problema?

que ejecuta este código J2SE para detectar el puerto en el que el cable del teléfono es:

import gnu.io.*; 
public class SerialPortLister { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     listPorts(); 
    } 
    private static void listPorts() 
    { 
     @SuppressWarnings("unchecked") 
     java.util.Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers(); 
     while (portEnum.hasMoreElements()) 
     { 
      CommPortIdentifier portIdentifier = portEnum.nextElement(); 
      System.out.println(portIdentifier.getName() + " - " + getPortTypeName(portIdentifier.getPortType())); 
     }   
    } 
    private static String getPortTypeName (int portType) 
    { 
     switch (portType) 
     { 
      case CommPortIdentifier.PORT_I2C: 
       return "I2C"; 
      case CommPortIdentifier.PORT_PARALLEL: 
       return "Parallel"; 
      case CommPortIdentifier.PORT_RAW: 
       return "Raw"; 
      case CommPortIdentifier.PORT_RS485: 
       return "RS485"; 
      case CommPortIdentifier.PORT_SERIAL: 
       return "Serial"; 
      default: 
       return "unknown type"; 
     } 
    } 
} 

y se nota COM4 porque cuando desconecte el cable continuación, se muestran sólo COM1 y LPT1.

¿Cuál es el problema?

+0

En Mobile solo puede encontrar COM1 o COM2, mientras que estos puertos siempre están ocupados en el sistema de la computadora para otros fines. – Lucifer

+0

¡Pero descubrí que COM4 es el puerto usado por el teléfono! – pheromix

+0

que es una buena señal. solo necesita buscar el archivo en el sistema de la computadora. Debe estar allí en algún directorio. O puede dar una ruta física en su código J2SE. – Lucifer

Respuesta

1

Su computadora parece estar bien detectada por la computadora como conectada en el puerto COM virtual 4. Sin embargo, no me queda claro que debe usar el protocolo de puerto COM en el lado del teléfono para comunicarse con la computadora. Es perfectamente posible que simplemente haya un buffer en el teléfono, que una vez completado se entregará en el puerto usb.

No conozco su teléfono pero ya he programado un microcontrolador. Nunca utilicé el protocolo de puerto COM y logré comunicarme con una computadora con un controlador de puerto virtual.

Para comprender mejor mi punto, probablemente pueda consultar la documentación del microcontrolador presente en su teléfono.

+0

El teléfono es Alcatel OT-806D. ¿Es un 'microcontrolador' un' controlador de puerto virtual'? – pheromix

+0

El [microcontrolador] (http://en.wikipedia.org/wiki/Microcontroller) es el chip principal de su teléfono, el equivalente de un microprocesador para un teléfono. – hpixel

+0

El problema es que la aplicación J2ME que estoy desarrollando debe venderse como un proyecto: estoy trabajando en una empresa de servicios informáticos; debería funcionar para cualquier tipo de dispositivo telefónico. Entonces, ¿cómo hacer que la transferencia siempre esté establecida? – pheromix

Cuestiones relacionadas