2011-11-15 25 views
9

Tôi biết rằng trong J2ME CommConnection là kết nối để sử dụng khi làm việc với serial port. Tôi biết có các phương pháp openInputStreamopenOutputStream, nhưng trên thực tế tôi không biết cách chuyển dữ liệu từ MIDLet sang cổng COM (cổng USB mà cáp của điện thoại được lắp vào, điện thoại là Alcatel OT-806D). Ví dụ tôi muốn gửi văn bản "Hello world". Làm thế nào để đạt được điều đó?Làm cách nào để chuyển dữ liệu sang cổng nối tiếp?

Dưới đây là các mã:

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

tôi chạy chương trình J2SE, tôi chèn cáp điện thoại di động vào máy tính (trong khe cắm USB), tôi đã nhấp vào lệnh upload trong J2M E ứng dụng, nhưng không có gì trong màn hình đầu ra của nhật thực!

Vậy vấn đề là gì?

tôi chạy mã J2SE này để phát hiện các cổng mà cáp của điện thoại là:

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

Và nó cho thấy COM4 vì khi tôi tháo cáp sau đó chỉ COM1 và LPT1 được hiển thị.

Vậy vấn đề là gì?

+0

Trong thiết bị di động, bạn chỉ có thể tìm thấy COM1 hoặc COM2, trong khi các cổng này luôn bận trong hệ thống máy tính cho các mục đích khác. – Lucifer

+0

Nhưng tôi phát hiện ra rằng COM4 là cổng được sử dụng bởi điện thoại! – pheromix

+0

đó là một dấu hiệu tốt. chỉ bạn mới cần tìm kiếm tệp trong hệ thống máy tính. Nó phải có trong một số thư mục. Hoặc bạn có thể đưa ra một con đường vật lý trong Mã J2SE của bạn. – Lucifer

Trả lời

1

Điện thoại của bạn dường như được phát hiện tốt bởi máy tính được kết nối trên cổng COM ảo 4. Tuy nhiên, điều này không rõ ràng với tôi rằng bạn nên sử dụng giao thức cổng COM ở phía điện thoại để liên lạc với máy tính. Nó là hoàn toàn có thể có chỉ đơn giản là một bộ đệm trên điện thoại, một khi đầy sẽ được giao trên cổng usb.

Tôi không biết điện thoại của bạn nhưng tôi đã lập trình một vi điều khiển. Ở đó tôi đã không bao giờ sử dụng giao thức cổng COM và quản lý để giao tiếp với một máy tính với trình điều khiển cổng com ảo.

Để hiểu rõ hơn quan điểm của tôi, bạn có thể tham khảo tài liệu về vi điều khiển có trên điện thoại của bạn.

+0

Điện thoại là Alcatel OT-806D. Là một "vi điều khiển" một cổng com ảo 'trình điều khiển'? – pheromix

+0

[vi điều khiển] (http://en.wikipedia.org/wiki/Microcontroller) là chip chính của điện thoại, tương đương với bộ vi xử lý cho điện thoại. – hpixel

+0

Vấn đề là ứng dụng J2ME mà tôi đang phát triển sẽ được bán như một dự án: Tôi đang làm việc trong một công ty dịch vụ tin học; nó sẽ hoạt động đối với bất kỳ loại thiết bị điện thoại nào. Vậy làm thế nào để chuyển giao luôn được thiết lập? – pheromix

Các vấn đề liên quan