0

I compiled this code with Sun Java ME Platform SDK 3.0, the code will listen to serial port:

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
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.lcdui.TextField;
import javax.microedition.midlet.*;

public class SerialPortMidlet extends MIDlet implements CommandListener, SerialPortEventListener
{
    private Command download = new Command("download", Command.ITEM, 0);
    private Command exit = new Command("exit", Command.ITEM, 1);
    private Form f = new Form("test serial port");
    private TextField ports = new TextField("data : ","",1000,TextField.ANY);
    private static final String PORT_NAMES = "COM4";
    private SerialPort serialPort;
    private InputStream input;
    private OutputStream output;
    private static final int TIME_OUT = 2000;
    private static final int DATA_RATE = 9600;

    public SerialPortMidlet()
    {
        f.append(ports);
        f.addCommand(download);
        f.addCommand(exit);
        f.setCommandListener(this);
    }
    public void startApp() {
        Display.getDisplay(this).setCurrent(f);
        initialize();
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }
    public void commandAction(Command c, Displayable d) {
        if (c == exit)
            destroyApp(true);
    }
    public void initialize() {
        CommPortIdentifier portId = null;
        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
        while (portEnum.hasMoreElements()) {
            CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
            if (currPortId.getName().equals(PORT_NAMES)) {
                portId = currPortId;
            }
        }
        if (portId == null) {
                System.out.println("Could not find COM port.");
                return;
        }
        try
        {
            // open serial port, and use class name for the appName.
            serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT);

            // set port parameters
            serialPort.setSerialPortParams( DATA_RATE,
                                            SerialPort.DATABITS_8,
                                            SerialPort.STOPBITS_1,
                                            SerialPort.PARITY_NONE );

            // open the streams
            input = serialPort.getInputStream();
            output = serialPort.getOutputStream();

            // add event listeners
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
        }
        catch (Exception e) {
                System.err.println(e.toString());
        }
    }
    public synchronized void close() {
        if (serialPort != null) {
            serialPort.removeEventListener();
            serialPort.close();
        }
    }
    public void serialEvent(SerialPortEvent oEvent) {
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE)
        {
            try {
                    int available = input.available();
                    byte chunk[] = new byte[available];
                    input.read(chunk, 0, available);

                    // Displayed results are codepage dependent
                    ports.setString(new String(chunk));
                    System.out.print(new String(chunk));
            } catch (Exception e) {
                    System.err.println(e.toString());
            }
        }
    }
}

And the output shows :

pre-init:
pre-load-properties:
exists.config.active:
exists.netbeans.user:
exists.user.properties.file:
load-properties:
exists.platform.active:
exists.platform.configuration:
exists.platform.profile:
basic-init:
cldc-pre-init:
cldc-init:
cdc-init:
bdj-init:
post-init:
init:
conditional-clean-init:
conditional-clean:
pre-clean:
clean-timestamp:
clean-preprocessed:
clean-classes:
Deleting directory C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
clean-obfuscated:
clean-preverified:
clean-manifest:
clean-jar:
clean-jad:
clean-javadoc:
clean-j9:
Deleting: C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\convert883343865
post-clean:
do-clean:
clean:
deps-jar:
pre-preprocess:
do-preprocess:
post-preprocess:
preprocess:
pre-compile:
extract-libs:
Created dir: C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
Expanding: D:\rxtx-2.1-7-bins-r2\RXTXcomm.jar into C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
do-compile:
Compiling 1 source file to C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\build\compiled
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:16: cannot access java.util.EventListener
class file for java.util.EventListener not found
public class SerialPortMidlet extends MIDlet implements CommandListener, SerialPortEventListener
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:34: cannot find symbol
symbol  : variable this
location: class SerialPortMidlet
        f.setCommandListener(this);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:37: cannot find symbol
symbol  : variable this
location: class SerialPortMidlet
        Display.getDisplay(this).setCurrent(f);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:65: cannot find symbol
symbol  : variable this
location: class SerialPortMidlet
            serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:78: cannot find symbol
symbol  : variable this
location: class SerialPortMidlet
            serialPort.addEventListener(this);
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\src\SerialPortMidlet.java:92: cannot access java.util.EventObject
class file for java.util.EventObject not found
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE)
6 errors
C:\Documents and Settings\Ambre-28\Mes documents\JavaMESDKProjects\testPortSerie\nbproject\build-impl.xml:246: Compile failed; see the compiler error output for details.
BUILD FAILED (total time: 7 seconds)

The system is Windows XP and I already added the RXTXcomm.jar to the Libraries & Resources of the project property. So why is there these errors?

Cœur
  • 37,241
  • 25
  • 195
  • 267
pheromix
  • 18,213
  • 29
  • 88
  • 158

1 Answers1

2

You cannot use external dlls or JNI to extend the feature set of J2ME VM, unlike J2SE. VM is supplied by the vendor or OEM and publish the level of support it has (such as JTWI compliance etc). So, in short, serial port access cannot be obtained by using Rxtx library.

However, serial port can be accessed by Generic I/O framework:

CommConnection sc = (CommConnection)Connector.open("comm:0;baudrate=9600");

However, support for comm is optional and vendor might not implement it. You will need to cross check with device's documentation.

Kiran Kuppa
  • 1,457
  • 10
  • 18
  • @pheromix oh yeah, you are right. Thanks for noticing it; a slip of hand. I will modify the answer. – Kiran Kuppa Nov 21 '11 at 08:37
  • Well, this is the procedure to be able to listen on comm port. As I have said, weather support for this is available or not on the phone is implementation dependent. If you can share the code with me, I shall check it out; but the bigger problem is finding the J2ME device that has working comm support. J2ME has fallen through, these days. Anyways, if possible, do share the code with me I shall look into it. – Kiran Kuppa Nov 21 '11 at 08:52
  • If there is an internal error then try this url `http://rxtx.qbang.org/wiki/index.php/Using_RXTX` , then click the `Documented_interface_to_communicate_with_serial_ports_for_beginners,_including_example_project` link , then click the link `download the zip file`. For me the windows COM port is COM4 when I insert the phone's cable. – pheromix Nov 21 '11 at 12:06
  • It would help us if you can click "help" link to the right of the comment text area and use the markup to provide with a correct download link. But what I was expecting is a code/project that you have written as a part of the application which I can quickly import into any of the IDE and diagnose the problem. You will need to help us to help you. – Kiran Kuppa Nov 21 '11 at 13:23
  • I don't have a web site of project. The only thing I can do is to provide the url for downloading the example code from the rxtx site ( as I gave you ) ; I use their example code to write to the serial port and my j2me app will read the port. You need to download just the zip file , extract it , compile the java files in it , and run the `net.Example` class : `java net.Example` from the command line. – pheromix Nov 21 '11 at 13:55