2011-11-15 14 views
9

मुझे पता है कि जे 2 एमई CommConnection में serial port के साथ काम करते समय उपयोग करने के लिए कनेक्शन है। मुझे पता है कि openInputStream और openOutputStream विधियां हैं, लेकिन असल में मुझे नहीं पता कि मेरे MIDLet से COM पोर्ट में डेटा कैसे स्थानांतरित किया जाए (यूएसबी पोर्ट जिसमें फ़ोन का केबल डाला गया है, फोन अल्काटेल ओटी -806 डी है)। उदाहरण के लिए मैं "हैलो वर्ल्ड" टेक्स्ट भेजना चाहता हूं। इसे कैसे प्राप्त करें?डेटा को सीरियल पोर्ट में कैसे स्थानांतरित करें?

यहाँ कोड हैं:

जे 2 एमई:

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

मैं J2SE कार्यक्रम चलाने के लिए, मैं में मोबाइल फोन केबल डाला कंप्यूटर (यूएसबी स्लॉट में), मैंने जे 2 एम में upload कमांड पर क्लिक किया ई ऐप, लेकिन ग्रहण की आउटपुट स्क्रीन में कुछ भी नहीं है!

तो समस्या क्या है?

मैं पोर्ट जिस पर फोन की केबल है पता लगाने के लिए इस 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

यह एक अच्छा संकेत है। केवल आपको कंप्यूटर सिस्टम में फ़ाइल को खोजने की जरूरत है। यह कुछ निर्देशिका में होना चाहिए। या आप अपने जे 2 एसई कोड में एक भौतिक पथ दे सकते हैं। – Lucifer

उत्तर

1

वर्चुअल COM पोर्ट 4 पर कनेक्ट होने पर आपके फोन को कंप्यूटर द्वारा अच्छी तरह से पता चला है। हालांकि, यह मुझे स्पष्ट नहीं है कि आपको कंप्यूटर के साथ संवाद करने के लिए फोन पक्ष पर COM पोर्ट प्रोटोकॉल का उपयोग करना चाहिए। यह पूरी तरह से संभव है कि फोन पर बस एक बफर है, जिसे एक बार भर दिया जाएगा यूएसबी पोर्ट पर वितरित किया जाएगा।

मुझे आपके फोन को नहीं पता है, लेकिन मैंने पहले से ही एक माइक्रोक्रोनरोलर प्रोग्राम किया है। वहां मैं कभी भी COM पोर्ट प्रोटोकॉल का उपयोग नहीं कर रहा था और वर्चुअल कॉम पोर्ट ड्राइवर के साथ कंप्यूटर के साथ संवाद करने में कामयाब रहा।

मेरे बिंदु को बेहतर समझने के लिए, आप शायद अपने फोन पर मौजूद माइक्रोकंट्रोलर के दस्तावेज़ीकरण का उल्लेख कर सकते हैं।

+0

फोन अल्काटेल ओटी -806 डी है। एक 'माइक्रोकंट्रोलर' वर्चुअल कॉम पोर्ट 'ड्राइवर' है? – pheromix

+0

[माइक्रोकंट्रोलर] (http://en.wikipedia.org/wiki/Microcontroller) आपके फोन का मुख्य चिप है, जो एक फोन के लिए माइक्रोप्रोसेसर के बराबर है। – hpixel

+0

समस्या यह है कि जे 2 एमई एप्लीकेशन जो मैं विकसित कर रहा हूं उसे एक परियोजना के रूप में बेचा जाना है: मैं एक सूचनात्मक सेवा कंपनी में काम कर रहा हूं; यह किसी भी प्रकार के फोन डिवाइस के लिए काम करना चाहिए। तो स्थानांतरण हमेशा कैसे स्थापित किया जाए? – pheromix

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^