2012-03-09 112 views
6

我正在將一個帶有librxtx-java的設備連接到Ubuntu。該代碼以前工作在10.04,但在12.04,它無法發現連接到計算機的USB串行。Ubuntu RXTX不識別usb串行設備

java.util.Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers(); 
while (portEnum.hasMoreElements()) 
{ 
    CommPortIdentifier portIdentifier = portEnum.nextElement(); 
    System.out.println(portIdentifier.getName() + " - " + getPortTypeName(portIdentifier.getPortType())); 
} 

的這部分代碼從不進入while循環中,儘管被安裝適當librxtx-Java庫,並且被識別的設備(dmesg的|尾示出了在一行USB「檢測到串行設備轉換器」)。

更新:

看來Ubuntu的12.04的64位不與任何USB串行設備的工作(儘管它們會顯示在dmesg和顯示爲一個的/ dev/ttyUSB,這似乎是不僅僅是Java的一個問題

回答

13

我有Ubuntu 11.10內核3.0.0-12-generic-pae和librxtx-java version 2.2pre2-8已經安裝了,下面的代碼正確的列出了我的串口,現在你已經正確安裝了串口轉換器?您需要檢查轉換器使用的端口。使用下面的示例應用程序,您可以嘗試類似java -cp /usr/share/java/RXTXcomm.jar:. GetCommPorts 2

請確保您在/ dev /中的ttySXX或ttyUSBXX文件中擁有正確的權限。

crw-rw---- 1 root dialout 4, 65 2012-02-29 01:08 /dev/ttyS1 
crw-rw---- 1 root dialout 4, 66 2012-02-29 01:08 /dev/ttyS2 

這些串口顯示在我的系統中,希望運行該應用程序的用戶應該在組撥出。要添加自己,請使用:

sudo usermod -a -G dialout username 

您現在應該處於「撥出」組。從該應用程序

import gnu.io.CommPortIdentifier; 
import gnu.io.NoSuchPortException; 
import gnu.io.PortInUseException; 
import gnu.io.SerialPort; 
import gnu.io.SerialPortEvent; 
import gnu.io.SerialPortEventListener; 
import gnu.io.UnsupportedCommOperationException; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Enumeration; 
import java.util.TooManyListenersException; 

public class GetCommPorts 
{ 
    static Enumeration<CommPortIdentifier>   portList; 
    static CommPortIdentifier portId; 
    static SerialPort     serialPort; 
    static OutputStream   outputStream; 
    static boolean     outputBufferEmptyFlag = false;  


    public static class SerialReader implements SerialPortEventListener 
    { 
     private InputStream in; 
     private byte[] buffer = new byte[1024]; 

     public SerialReader(InputStream in) 
     {   
      this.in = in;   
     } 

     @Override 
     /** 
     * treat \n as end of block. 
     */ 
     public void serialEvent(SerialPortEvent ev) 
     { 
      int data; 

      try 
      { 
       int len = 0; 
       while ((data = in.read()) > -1) 
       { 
        if (data == '\n') 
        { 
         break; 
        } 
        buffer[len++] = (byte) data; 
       } 
       System.out.println(new String(buffer, 0, len)); 
      } 
      catch (IOException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       System.exit(-1); 
      }   
     }  
    } 

    public static class SerialWriter implements Runnable 
    { 
     OutputStream out; 

     public SerialWriter(OutputStream out) 
     { 
      this.out = out; 
     } 

     @Override 
     public void run() 
     {   
      try 
      { 
       int c = 0; 
       while ((c = System.in.read()) > -1) 
       { 
        this.out.write(c); 
       } 
      } 
      catch (IOException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       System.exit(-1); 
      } 

     } 

    } 

    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"; 
     } 
    } 

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

      if (portIdentifier.getPortType() == 1) 
      { 
       try 
       { 
        serialPort = (SerialPort) portIdentifier.open(portIdentifier.getName(), 3000); 
       } 
       catch (PortInUseException e) 
       { 
        System.err.print("port in use"); 
        continue; 
       } 

       System.out.println("Baud is " + serialPort.getBaudRate());  
       System.out.println("Bits is " + serialPort.getDataBits());  
       System.out.println("Stop is " + serialPort.getStopBits());  
       System.out.println("Par is " + serialPort.getParity()); 
       serialPort.close(); 
      } 
     } 
    } 

    private static int doReadWrite(String portName) 
    { 
     CommPortIdentifier portIdentifier; 

     try 
     { 
      portIdentifier = CommPortIdentifier.getPortIdentifier(portName); 

      if (portIdentifier.isCurrentlyOwned()) 
      { 
       System.err.println("error: port is currently in use"); 
       return -1; 
      } 

      SerialPort sport = (SerialPort) portIdentifier.open(portName, 3000); 
      sport.setSerialPortParams(57600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 

      InputStream in = sport.getInputStream(); 
      OutputStream out = sport.getOutputStream();   

      (new Thread(new SerialWriter(out))).start(); 

      sport.addEventListener(new SerialReader(in)); 
      sport.notifyOnDataAvailable(true); 
     } 
     catch (NoSuchPortException e) 
     { 
      e.printStackTrace(); 
      return -1; 
     } 
     catch (PortInUseException e) 
     { 
      e.printStackTrace(); 
      return -1; 
     } 
     catch (UnsupportedCommOperationException e) 
     { 
      e.printStackTrace(); 
      return -1; 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
      return -1; 
     } 
     catch (TooManyListenersException e) 
     { 
      e.printStackTrace(); 
      return -1; 
     } 

     return 0;  
    } 

    static void showHelp() 
    { 
     System.out.println("Usage " + GetCommPorts.class.getName() + "N"); 
     System.out.println("1 read and write from the serial port"); 
     System.out.println("2 list all serial ports in the system"); 
     System.out.println("default show this help "); 
    } 


    public static void main(String[] args) 
    { 
     int operation = 0; 

     try 
     { 
      if (args.length != 1) 
      { 
       showHelp(); 
       return; 
      } 
      operation = Integer.parseInt(args[0]); 
     } 
     catch (NumberFormatException e) 
     { 

     }  

     switch (operation) 
     { 
     case 1: 
      doReadWrite("/dev/ttyUSB0"); 
      break; 
     case 2: 
      listPorts(); 
      break; 
     default: 
      showHelp(); 
     } 

    } 


} 

輸出:

$ java -cp /usr/share/java/RXTXcomm.jar:. GetCommPorts 2 
/dev/ttyS1 - Serial 
Baud is 9600 
Bits is 8 
Stop is 1 
Par is 0 
/dev/ttyS0 - Serial 
Baud is 9600 
Bits is 8 
Stop is 1 
Par is 0 
+0

什麼。 GetCommPorts「/ dev/usb-serial-converter-port」呢? Eclipse中是否有相同的設置?在升級之前,它沒有任何選項就能正常工作,我不知道這是否是非sun jdk的問題? – NoBugs 2012-03-09 15:54:20

+0

「/ dev/usb-serial-converter-port」是GetCommPorts的參數,用於檢查串行通信端口是否存在。那麼,我沒有編譯過非Sun的JDK,爲什麼不嘗試它,檢查輸出?另外,你的通訊端口是什麼? – Jasonw 2012-03-09 16:10:35

+0

它顯示爲/ dev/ttyUSB0,有沒有辦法測試我是否在系統級從設備接收到任何東西? – NoBugs 2012-03-09 18:49:03