Question

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?

Was it helpful?

Solution

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top