2011-11-15 11 views
9

私はJ2MEでCommConnectionが、serial portで作業するときに使用する接続であることを知っています。私はopenInputStreamopenOutputStream方法がある知っているが、実際には、私はCOMポートに私のMIDletからデータを転送する方法がわからない(携帯電話のケーブルが挿入されるUSBポート、電話はアルカテルOT-806Dです)。たとえば、「He​​llo world」というテキストを送信したいとします。それを達成する方法?シリアルポートにデータを転送するには?

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:ここ

は符号である(エクリプス)

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(); 
     } 
    } 
} 

Iは、J2SEプログラムを実行し、私はに携帯電話ケーブルを挿入しましたコンピュータ(USBスロット内)で、私はuploadコマンドをJ2MでクリックしたEアプリがありますが、Eclipseの出力画面には何もありません!

だから何が問題なのですか?

私は携帯電話のケーブルがされているポートを検出するために、このJ2SEのコードを実行します。

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"; 
     } 
    } 
} 

そして、私はケーブルを取り外すときにCOM1とLPT1のみが表示されているので、それがCOM4を示しています。

だから何が問題なのですか?

+0

モバイルでは、COM1またはCOM2のみが検出されますが、このポートは他の目的でコンピュータシステムで常にビジー状態です。 – Lucifer

+0

しかし、私はCOM4が電話で使用されるポートであることを発見しました! – pheromix

+0

これは良い兆候です。ただあなたはコンピュータシステムのファイルを検索する必要があります。それはあるディレクトリになければなりません。または、J2SEコードで物理パスを指定することもできます。 – Lucifer

答えて

1

お使いの携帯電話には、しかし、これはあなたがコンピュータと通信するために携帯電話側のCOMポートプロトコルを使用する必要があることを私には明らかではないが、仮想COMポート4に接続されているとしても、コンピュータによって検出されているように見えます。一度充填したものがUSBポートに配送されるという単純なバッファが携帯電話に存在することは完全に可能です。

あなたの携帯電話はわかりませんが、私はすでにマイクロコントローラをプログラムしています。私はCOMポートプロトコルを決して使用せず、仮想COMポートドライバを使用してコンピュータと通信することができました。

あなたの携帯電話に搭載されているマイクロコントローラのドキュメントを参考にしてください。

+0

電話はAlcatel OT-806Dです。 'マイクロコントローラ'は仮想COMポート 'ドライバ'ですか? – pheromix

+0

[マイクロコントローラ](http://en.wikipedia.org/wiki/Microcontroller)は携帯電話のメインチップで、携帯電話のマイクロプロセッサと同等のものです。 – hpixel

+0

問題は、私は研究開発をしていますJ2MEアプリケーションは、プロジェクトとして販売することをある:私はインフォマティクスサービス会社で働いています。どんな種類の電話機でも動作するはずです。どのようにして移転を確立するのですか? – pheromix

関連する問題