2011-07-20 162 views
1

喜讀書,我有財產以後這樣RXTX如何從COM端口

package compot; 

import java.util.Enumeration; 
import gnu.io.*; 


public class core { 

    private static SerialPort p; 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) 
    { 
     Enumeration ports = CommPortIdentifier.getPortIdentifiers(); 
     System.out.println("start"); 
     while(ports.hasMoreElements()) 
     { 
      CommPortIdentifier port = (CommPortIdentifier) ports.nextElement(); 
      System.out.print(port.getName() + " -> " + port.getCurrentOwner() + " -> "); 
      switch(port.getPortType()) 
      { 
       case CommPortIdentifier.PORT_PARALLEL: 
        System.out.println("parell"); 
       break; 
       case CommPortIdentifier.PORT_SERIAL: 
        //System.out.println("serial"); 
       try { 
        p = (SerialPort) port.open("core", 1000); 
        int baudRate = 57600; // 57600bps 
        p.setSerialPortParams(
          baudRate, 
          SerialPort.DATABITS_8, 
          SerialPort.STOPBITS_1, 
          SerialPort.PARITY_NONE); 
       } catch (PortInUseException e) { 
        System.out.println(e.getMessage()); 
       } catch (UnsupportedCommOperationException e) { 
        System.out.println(e.getMessage()); 
       } 
       break; 
      } 
     } 
     System.out.println("stop"); 
    } 
} 

但我不知道如何從端口讀取?我已閱讀this tutorial,但我不知道他們是什麼「演示應用程序」?

編輯

OutputStream outStream = p.getOutputStream(); 
        InputStream inStream = p.getInputStream(); 

        BufferedReader in = new BufferedReader(new InputStreamReader(inStream)); 
        String inputLine; 

        while ((inputLine = in.readLine()) != null) 
         System.out.println(inputLine); 
        in.close(); 

我添加此代碼,但我recive

穩定圖書館 =================== ====================== Native lib版本= RXTX-2.1-7 Java lib版本= RXTX-2.1-7開始/ dev/ttyUSB3 - > null - >底層輸入流返回零字節停止

+0

任何後續行動?根本沒有反應? :p – chzbrgla

+0

我編輯我的問題 –

+0

這可能是流量控制的問題。你可以用port.setFlowControl()方法在端口上設置它。但是,我不可能知道應該使用哪種流量控制。也許開始閱讀有關串行端口的一般信息:http://tldp.org/HOWTO/Serial-HOWTO-4.html我建議閱讀輸入流字節明智不行。但這取決於您實際嘗試與之通信的設備。 – chzbrgla

回答

0

像這樣的事情在你的try塊:

OutputStream outStream = p.getOutputStream(); 
InputStream inStream = p.getInputStream(); 
+0

那麼什麼是'p =(SerialPort)port.open(「核心」,1000);'這對於這第一部分「核心」需要? –

+0

串行端口連接被命名爲「核心」,並在1000毫秒後超時,當前所有者在該時間內沒有釋放連接..您可能應該沒有進程使用此端口 – chzbrgla

+0

此名稱將標識端口的所有者。只需使用您的應用程序名稱更多信息:[link](http://download.oracle.com/docs/cd/E17802_01/products/products/javacomm/reference/api/javax/comm/CommPortIdentifier.html) – Patrik

6

這是你的代碼?你究竟想在那裏做什麼? :P

爲了從的SerialPort閱讀,你需要聲明此端口:

CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("/dev/tty/USB0"); //on unix based system 

然後打開這個端口上的連接:

SerialPort serialPort = (SerialPort) portIdentifier.open("NameOfConnection-whatever", 0); 

下一步將會設置這個端口的參數(如果需要):

serialPort.setSerialPortParams(38400, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 

這是我的配置 - 你的可能會有所不同:)

現在您已準備好讀取該端口上的一些數據! 獲取數據,你需要從獲得serialPorts InputStream和閱讀:

InputStream inputStream = serialPort.getInputStream(); 
while (active) { 
     try { 
      byte[] buffer = new byte[22]; 
      while ((buffer[0] = (byte) inputStream.read()) != 'R') { 
      } 
      int i = 1; 
      while (i < 22) { 
       if (!active) { 
        break; 
       } 
       buffer[i++] = (byte) inputStream.read(); 
      } 
      //do with the buffer whatever you want! 
     } catch (IOException ex) { 
      logger.error(ex.getMessage(), ex); 
     } 
} 

什麼我其實這裏做的是從InputStream使用它的方法read()閱讀。這將阻塞,直到數據可用或返回-1,如果到達尾流。在這個例子中,我一直等到我得到一個'R'字符,然後將下一個22字節讀入緩衝區。這就是你讀取數據的方式。

  1. 獲取serialPorts的InputStream
  2. 使用.read()方法
  3. 有全部取消當循環和退出循環內(在我的情況下,active可以通過其他方法設置爲false,因此結束讀取過程。

希望這有助於

2

嘗試使用

if (socketReader.ready()) { 
} 

,以便套接字僅在緩衝流 中有某些內容需要讀取時作出響應,以避免發生異常。