我有以下代码,我不知道如何不断地收听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");
}
}
答案 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