2011-11-21 146 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時,服務器會引發內部錯誤。 –

相關問題