在移动设备中不断收听CommConnection

时间:2012-01-30 19:45:43

标签: java mobile java-me midp midlet

我有以下代码,我不知道如何不断地收听com端口。因此,只要有数据,我就可以阅读。那么我应该创建一个线程并永久打开它上面的输入流吗?在打开输出流之前应该如何关闭它?

基本上我的移动端应用程序应该知道并在数据可用时处理com4端口数据并且还能够发送数据。应用程序开始在移动设备上运行后,所有这些任务都应自动完成。

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

1 个答案:

答案 0 :(得分:0)

你可以打开一个单独的Thread并从那里开始收听。请参阅下面的结构:

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