jim
jim

Reputation: 495

listening to CommConnection constantly in mobile device

I have the following code and I don't know how can I listen to the com port constantly. So whenever data is available I can read it. So should I create a thread and open the input stream on it permanently? How should I close it before opening an output stream?

Basically my app on mobile side should be aware and process the com4 port data whenever the data is available and also be able to send data. All these tasks should be automated once the app start running on mobile device.

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.io.*;

public class MainMidlet extends MIDlet implements CommandListener {
// displaying this midlet
private Display display;
private Form form;
private StringItem stringItem;
private Command exitCommand;
// comm vars
private volatile CommConnection commConnection = null;
private volatile InputStream inputStream = null;
private volatile OutputStream outputStream = null;
// thread on which we run the listening
private Thread thread;
private volatile boolean stopRequested = false;

public MainMidlet() {

}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
    // TODO Auto-generated method stub

}

protected void pauseApp() {
    // TODO Auto-generated method stub

}

public void commandAction(Command command, Displayable displayable) {
    if (displayable == form) {
        if (command == exitCommand) {
            exitMIDlet();
        }
    }
}

public void startApp() {
    stringItem = new StringItem("Hello", "Serial app is running!");
    form = new Form(null, new Item[] { stringItem });
    exitCommand = new Command("Exit", Command.EXIT, 1);
    form.addCommand(exitCommand);
    form.setCommandListener(this);
    display = Display.getDisplay(this);
    display.setCurrent(form);

    String ports = System.getProperty("microedition.commports");
    String port = "";
    int comma = ports.indexOf(',');
    if (comma > 0) {
        // Parse the first port from the available ports list.
        port = ports.substring(0, comma);
        print("multiple ports found. selecting the first one. " + ports);
    } else {
        // Only one serial port available.
        port = ports;
    }
    try {
        commConnection = (CommConnection) Connector.open("comm:" + port
                + ";blocking=off;autocts=off;autorts=off");
        commConnection.setBaudRate(commConnection.getBaudRate());
    } catch (IOException e) {
        print("IOException in startApp: " + e.getMessage());
    }
}

public void exitMIDlet() {
    try {
        commConnection.close();
    } catch (IOException e) {
        print("IOException in exitMIDlet: " + e.getMessage());
    }
    if (thread.isAlive()) {
        thread.interrupt();
        try {
            thread.join();
        } catch (InterruptedException e) {
            print("InterruptedException in exitMIDlet: " + e.getMessage());
        }
    }
    display.setCurrent(null);
    notifyDestroyed();
}

// write data to serial port
public void SendData(byte[] data) {
    try {
        outputStream = commConnection.openOutputStream();
        outputStream.write(data);
        outputStream.close();
    } catch (IOException e) {
        print("IOException: " + e.getMessage());
    }
}

// read data from serial port.
private void GetData() {
    try {
        inputStream = commConnection.openInputStream();
        // maximum size of reading is 500kb.
        byte[] buffer = new byte[500000];
        StringBuffer message = new StringBuffer();
        for (int i = 0; i < buffer.length;) {
            try {
                //print("ListenToPort is inside of for now.");
                Thread.sleep(10);
            } catch (InterruptedException ex) {
                print("intrupted in GetData. " + ex.getMessage());
            }
            int available = inputStream.available();
            if (available == 0) {
                continue;
            }
            String outText = "";
            int count = inputStream.read(buffer, i, available);
            if (count > 0) {
                outText = new String(buffer, i, count);
                i = i + count;
                message.append(outText);
                print(
                                           "GetData: message.append(outText) successful.");
                if (outText.endsWith("\n")) {
                                                                                     String messageString = message.toString();
                         print("Message came in: " + messageString);
                    message.delete(0, message.length());
                }
            }
            print("GetData: inputStream.read().count is zero.");
            String total = new String(buffer, 0, i);
        }
        inputStream.close();
    } catch (IOException e) {
        print("IOException in GetData: " + e.getMessage());
    }
    print("GetData SUCCEEDED.");
}

private void print(String str) {
    int val = form.append(str + "\r\n");
    if (val == -1)
        System.out.print(str + "\r\n");
}
}

Upvotes: 1

Views: 782

Answers (1)

Roshnal
Roshnal

Reputation: 1314

You could open a separate Thread and start listening from there. See below for the structure:

Thread commListener = new Thread(new Runnable() {
    while(true) { // We use a while loop to continually listen to the comm port

        // Your code here (the listening tasks)

    }
});
commListener.start(); // Start the Thread

Upvotes: 0

Related Questions