Tôi biết rằng trong J2ME CommConnection
là kết nối để sử dụng khi làm việc với serial port
. Tôi biết có các phương pháp openInputStream
và openOutputStream
, nhưng trên thực tế tôi không biết cách chuyển dữ liệu từ MIDLet sang cổng COM (cổng USB mà cáp của điện thoại được lắp vào, điện thoại là Alcatel OT-806D). Ví dụ tôi muốn gửi văn bản "Hello world". Làm thế nào để đạt được điều đó?Làm cách nào để chuyển dữ liệu sang cổng nối tiếp?
Dưới đây là các mã:
J2ME:
import java.io.IOException;
import java.io.OutputStream;
import javax.microedition.io.CommConnection;
import javax.microedition.io.Connector;
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.midlet.*;
public class SerialPortMidlet extends MIDlet implements CommandListener, Runnable {
private Command upload = new Command("upload", Command.SCREEN, 0);
private Command exit = new Command("exit", Command.SCREEN, 1);
private Form f = new Form("test serial port");
private Thread uploadThread;
private CommConnection com;
private OutputStream os;
public SerialPortMidlet()
{
f.addCommand(upload);
f.addCommand(exit);
f.setCommandListener(this);
uploadThread = new Thread(this);
}
public void startApp() {
Display.getDisplay(this).setCurrent(f);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
notifyDestroyed();
}
public void commandAction(Command c, Displayable d) {
if (c == upload)
{
uploadThread.start();
f.removeCommand(upload);
}
else if (c == exit)
{
if (uploadThread.isAlive())
{
uploadThread.interrupt();
try {
uploadThread.join();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
destroyApp(true);
}
}
public void run() {
try
{
String s = new String("andrana mandefa lavaka");
com = (CommConnection) Connector.open("comm:COM4");
os = com.openOutputStream();
os.write(s.getBytes());
os.close();
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
J2SE: (Eclipse)
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class TwoWaySerialComm
{
public TwoWaySerialComm()
{
super();
}
void connect (String portName) throws Exception
{
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if (portIdentifier.isCurrentlyOwned())
{
System.out.println("Error: Port is currently in use");
}
else
{
CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);
if (commPort instanceof SerialPort)
{
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(57600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
InputStream in = serialPort.getInputStream();
OutputStream out = serialPort.getOutputStream();
(new Thread(new SerialWriter(out))).start();
serialPort.addEventListener(new SerialReader(in));
serialPort.notifyOnDataAvailable(true);
}
else
{
System.out.println("Error: Only serial ports are handled by this example.");
}
}
}
public static class SerialReader implements SerialPortEventListener
{
private InputStream in;
private byte[] buffer = new byte[1024];
public SerialReader (InputStream in)
{
this.in = in;
}
public void serialEvent(SerialPortEvent arg0) {
int data;
try
{
int len = 0;
while ((data = in.read()) > -1)
{
if (data == '\n') {
break;
}
buffer[len++] = (byte) data;
}
System.out.print(new String(buffer,0,len));
}
catch (IOException e)
{
e.printStackTrace();
System.exit(-1);
}
}
}
public static class SerialWriter implements Runnable
{
OutputStream out;
public SerialWriter (OutputStream out)
{
this.out = out;
}
public void run()
{
try
{
int c = 0;
while ((c = System.in.read()) > -1)
{
this.out.write(c);
}
}
catch (IOException e)
{
e.printStackTrace();
System.exit(-1);
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try
{
(new TwoWaySerialComm()).connect("COM1");
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
tôi chạy chương trình J2SE, tôi chèn cáp điện thoại di động vào máy tính (trong khe cắm USB), tôi đã nhấp vào lệnh upload
trong J2M E ứng dụng, nhưng không có gì trong màn hình đầu ra của nhật thực!
Vậy vấn đề là gì?
tôi chạy mã J2SE này để phát hiện các cổng mà cáp của điện thoại là:
import gnu.io.*;
public class SerialPortLister {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
listPorts();
}
private static void listPorts()
{
@SuppressWarnings("unchecked")
java.util.Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers();
while (portEnum.hasMoreElements())
{
CommPortIdentifier portIdentifier = portEnum.nextElement();
System.out.println(portIdentifier.getName() + " - " + getPortTypeName(portIdentifier.getPortType()));
}
}
private static String getPortTypeName (int portType)
{
switch (portType)
{
case CommPortIdentifier.PORT_I2C:
return "I2C";
case CommPortIdentifier.PORT_PARALLEL:
return "Parallel";
case CommPortIdentifier.PORT_RAW:
return "Raw";
case CommPortIdentifier.PORT_RS485:
return "RS485";
case CommPortIdentifier.PORT_SERIAL:
return "Serial";
default:
return "unknown type";
}
}
}
Và nó cho thấy COM4 vì khi tôi tháo cáp sau đó chỉ COM1 và LPT1 được hiển thị.
Vậy vấn đề là gì?
Trong thiết bị di động, bạn chỉ có thể tìm thấy COM1 hoặc COM2, trong khi các cổng này luôn bận trong hệ thống máy tính cho các mục đích khác. – Lucifer
Nhưng tôi phát hiện ra rằng COM4 là cổng được sử dụng bởi điện thoại! – pheromix
đó là một dấu hiệu tốt. chỉ bạn mới cần tìm kiếm tệp trong hệ thống máy tính. Nó phải có trong một số thư mục. Hoặc bạn có thể đưa ra một con đường vật lý trong Mã J2SE của bạn. – Lucifer