2011-11-15 51 views
9

我知道在J2ME中CommConnection是使用serial port時要使用的連接。我知道有openInputStreamopenOutputStream方法,但事實上我不知道如何將數據從我的MIDLet傳輸到COM端口(手機電纜插入的USB端口,手機是Alcatel OT-806D)。例如,我想發送文本「Hello 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:(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(); 
     } 
    } 
} 

我運行J2SE程序,我插入移動電話線插入電腦(在USB插槽中),我點擊了J2M中的upload命令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"; 
     } 
    } 
} 

這也表明COM4,因爲當我拆下電纜則只有COM1和LPT1顯示。

那麼問題是什麼?

+0

在手機中,您只能找到COM1或COM2,而這些端口在計算機系統中總是處於忙碌狀態以用於其他目的。 – Lucifer

+0

但是我發現COM4是手機使用的端口! – pheromix

+0

這是一個好兆頭。只有您需要在計算機系統中搜索文件。它必須在某個目錄中。或者你可以在你的J2SE代碼中給出一個物理路徑。 – Lucifer

回答

1

您的手機好像已經被虛擬COM端口4上的計算機檢測到。但是,我不清楚您應該使用電話端的COM端口協議與計算機通信。完全可能的是,手機上只有一個緩衝區,一旦充滿就會在USB端口上傳輸。

我不知道你的手機,但我已經編程了一個微控制器。在那裏,我從未使用COM端口協議,並設法與具有虛擬COM端口驅動程序的計算機進行通信。

爲了更好地理解我的觀點,您可以參考手機上存在的微控制器文檔。

+0

這款手機是阿爾卡特OT-806D。 「微控制器」是一個虛擬的COM端口「驅動程序」嗎? – pheromix

+0

[微控制器](http://en.wikipedia.org/wiki/Microcontroller)是手機的主芯片,相當於手機的微處理器。 – hpixel

+0

問題是,我正在開發的J2ME應用程序將作爲項目出售:我在一家信息服務公司工作;它應該適用於任何類型的電話設備。那麼如何使轉移始終建立? – pheromix

相關問題