2012-08-29 20 views
7

Buenos días,RXTX no puede enumerar o encontrar puertos en Windows 7 64 bits de

Tengo problemas utilizando/o la instalación de rxtx en Windows 7 64 bits. Trabajé previamente con un sistema x86 win XP y no tuve problemas. Desde la reinstalación de este nuevo sistema por alguna razón, rxtx no puede localizar ningún puerto. Probé la instalación rxtx, la biblioteca nativa de 64 bits de Cloud Hopper y eliminé todos los archivos rxtx y comencé desde cero. RXTXcomm.jar se encuentra y puedo navegar por los paquetes en NetBeans pero la implementación parece estar rota o no encontrada.

Esta línea de falla cuando se ejecuta, cada vez que:

comPort = "COM1"; 
portId = CommPortIdentifier.getPortIdentifier(comPort); 

y lanza un NoSuchPortException.

Enumerar los puertos serie usando esto no produce nada.

Enumeration ports = CommPortIdentifier.getPortIdentifiers(); 
String portArray[] = null; 
while (ports.hasMoreElements()) { 
    CommPortIdentifier port = (CommPortIdentifier) ports.nextElement(); 
    System.out.println(port.getName()); 
} 

He comprobado los puertos serie están disponibles por lo que en este punto me pregunto si las bibliotecas nativas simplemente se rompen para Windows 7 64 bits.

Alguien ha utilizado con éxito RXTX 2.2pre2 bajo Windows 7 64 bits?

sección de código erróneo en el constructor:

public SerialControl(String name, String comPort, int baudrate, int databits, String  parity, double stopbits) throws Exception { 
    int stop = 0; 
    int data = 0; 
    int par = 0; 

    this.name=name; 

    // Sanity checks and interpretation 
    if (baudrate > 115200 || baudrate < 300) { 
     System.err.println(name+": constructor(): Invalid baudrate "+baudrate); 
     throw new Exception("Invalid baudrate, " + baudrate); 
    } 

    if (databits >= 5 && databits <= 8) { 
     switch (databits) { 
      case 5: 
       data = SerialPort.DATABITS_5; 
       break; 
      case 6: 
       data = SerialPort.DATABITS_6; 
       break; 
      case 7: 
       data = SerialPort.DATABITS_7; 
       break; 
      case 8: 
       data = SerialPort.DATABITS_8; 
       break; 
      default: 
       System.err.println(name+": constructor(): Invalid data bits, switched " + databits); 
       throw new Exception("Invalid data bits, switched " + databits); 
     } 
    } else { 
     throw new Exception("Invalid data bits=" + databits); 
    } 

    if (stopbits >= 1.0 && stopbits <= 2.0) { 

     if (stopbits == 1.0) { 
      stop = SerialPort.STOPBITS_1; 
     } else if (stopbits == 1.5) { 
      stop = SerialPort.STOPBITS_1_5; 
     } else if (stopbits == 2.0) { 
      stop = SerialPort.STOPBITS_2; 
     } else { 
      System.err.println(name+": constructor(): Invalid stop bits, switched " + stopbits); 
      throw new Exception("Invalid stop bits, switched " + stopbits); 
     } 
    } else { 
     System.err.println(name+": constructor(): Invalid stop bits, switched " + stopbits); 
     throw new Exception("Invalid stop bits " + stopbits); 
    } 

    switch (parity) { 
     case "S": 
      par = SerialPort.PARITY_SPACE; 
      break; 
     case "E": 
      par = SerialPort.PARITY_EVEN; 
      break; 
     case "M": 
      par = SerialPort.PARITY_MARK; 
      break; 
     case "O": 
      par = SerialPort.PARITY_ODD; 
      break; 
     case "N": 
      par = SerialPort.PARITY_NONE; 
      break; 
     default: 
      System.err.println(name+": constructor(): Invalid parity, switched " + parity); 
      throw new Exception("Invalid parity, switched " + parity); 
    } 

    // Inits 
    // Try to find the port specified 
    try { 
     portId = CommPortIdentifier.getPortIdentifier(comPort); 
    } catch (Exception e) { 
     System.err.println(name+": constructor(): No such port \"" + comPort+"\""); 
     e.printStackTrace(); 
     throw e; 
    } 

    // Open the port 
    try { 
     serialPort = (SerialPort) portId.open("User Port", 2000); 
    } catch (PortInUseException e) { 
     System.err.println(name+": constructor(): Could not open port " + comPort); 
     throw e; 
    } 

    // Grab the input stream 
    try { 
     inputStream = serialPort.getInputStream(); 
    } catch (IOException e) { 
     System.err.println(name+": constructor(): Could not get input stream for " + comPort); 
     throw e; 
    } 

    // Set the serial port parameters, no flow control 
    try { 
     serialPort.setSerialPortParams(baudrate, data, stop, par); 
     serialPort.setDTR(false); 
     serialPort.setRTS(false); 
    } catch (UnsupportedCommOperationException e) { 
     System.err.println(name+": constructor(): Error initializing " + comPort); 
     throw e; 
    } 
} 
+0

tanto 'SerialControl' como CommPortIdentifier # getPortIdentifiers() 'funcionan desde Eclipse y la línea de comando – GrahamA

+0

Un poco de seguimiento para las personas que pueden encontrar esto, mis proyectos fueron importados de un entorno Windows XP, reconstruyéndolos en Windows 7 parecen tener corregido sea cual sea el problema. – darkhelmet

Respuesta

2

Se appers a trabajar para mí el uso de Windows 7 y versiones de 64 bits de Java y RXTX (cloudhopper versión)

enter image description here

¿Estás ¿Seguro que tienes un COM1?

+0

Sí, lo uso todo el tiempo con masilla.Su código enumera mis puertos correctamente cuando lo ejecuto en una aplicación por separado, pero cuando se ejecutan desde mi clase serial los puertos no se encuentran ... el misterio se complica pero parece ser un problema de biblioteca. – darkhelmet

+0

@darkhelmet si quieres publicar tu clase de serie intentaré ejecutarlo – GrahamA

+0

la clase tiene un par de dependencias con otras clases, no puedo publicarlo todo, pero aquí está la parte relevante en el constructor donde sucede; es lo primero que estoy inicializando el puerto serie – darkhelmet

9

Tengo el mismo problema. Yo uso Eclipse como IDE para la programación y me encontré con esta configuración alternativa en el wiki oficial:

  1. Copia RXTXcomm.jar al directorio lib del proyecto
  2. navegar por su paquete de explorador a la carpeta lib, haga clic derecho en RXTXcomm.jar | Build Path | Agregar a la ruta construida
  3. Copie los archivos rxtxSerial.dll y rxtxParallel.dll en el directorio raíz de su proyecto
  4. Under Run | Ejecutar configuraciones | Pestaña Classpath | Entradas de usuario | Avanzado | Agregar carpeta, elija la carpeta raíz de su proyecto
  5. Esto debería ser suficiente solo para ejecutarlo en Eclipse, cuando despliegue un jar ejecutable, solo asegúrese de que los dlls estén en la misma carpeta que el jar (JVM lo asume para classpath)

(es mi primera respuesta, no sé si se me permite publicar un enlace externo, pero el paso de cinco venido de entre http://rxtx.qbang.org/wiki/index.php/Using_RXTX_In_Eclipse)

Espero que ayude!

+0

¡Se fomentan los enlaces externos a las referencias! Solo tenga cuidado con la autopromoción (vea [FAQ] (http://stackoverflow.com/faq#promotion)) ... pero eso no parece ser un problema en este caso. :) – hopper

+0

Gracias! Llego un poco tarde para responder pero pude usar esto mientras reconstruía mis proyectos de NetBeans. – darkhelmet

Cuestiones relacionadas