2011-11-21 88 views
0

我编译此代码Sun Java ME Platform SDK 3.0,代码会听串口:为什么在用RXTX编译J2ME代码时出现错误?

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

,并且输出显示:

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) 

的系统是Windows XP和我已经添加了RXTXcomm.jar到项目属性的Libraries & Resources。那么为什么会出现这些错误呢?

回答

2

与J2SE不同的是,不能使用外部dll或JNI来扩展J2ME VM的功能集。虚拟机由供应商或OEM提供并发布其支持的级别(例如JTWI合规性等)。因此,简而言之,使用Rxtx库无法获得串行端口访问权限。

然而,串行端口可以通过通用I/O架构进行访问:

CommConnection sc = (CommConnection)Connector.open("comm:0;baudrate=9600"); 

然而,对于通讯的支持是可选的,供应商可能无法实现它。您需要与设备的文档进行交叉检查。

+0

@pheromix噢,你是对的。感谢您注意它;一只手。我会修改答案。 –

+0

那么,这是能够听通讯端口的程序。正如我所说的,天气对此的支持是可用的或者不是在手机上是依赖于实施的。如果你可以与我分享代码,我会检查出来;但更大的问题是找到有工作通信支持的J2ME设备。现在,J2ME已经失败了。无论如何,如果可能的话,与我分享代码,我会研究它。 –

+0

当我尝试访问URL时,服务器会引发内部错误。 –

相关问题