【问题标题】:RXTX cannot list or find ports under windows 7 64 bitsRXTX在windows 7 64位下无法列出或查找端口
【发布时间】:2012-08-24 07:10:30
【问题描述】:

早上好,

我在 Windows 7 64 位上使用/或安装 rxtx 时遇到问题。我以前在 x86 win XP 系统上使用过它,没有任何问题。由于出于某种原因重新安装到这个新系统,rxtx 无法找到任何端口。我已经尝试了 rxtx 安装,Cloud Hopper 的 64 位本机库并删除所有 rxtx 文件并从头开始。找到了 RXTXcomm.jar,我可以浏览 NetBeans 中的包,但实现似乎已损坏或找不到。

每次执行时,此行都会失败:

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

并抛出 NoSuchPortException。

使用它列出串行端口不会产生任何结果。

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

我已经检查了串行端口是否可用,所以此时我想知道本机库是否只是在 Windows 7 64 位上损坏了。

有人在windows 7 64位下成功使用RXTX 2.2pre2吗?

构造函数中的违规代码部分:

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

【问题讨论】:

  • SerialControl 和 CommPortIdentifier#getPortIdentifiers()` 在 Eclipse 和命令行中工作
  • 对于可能遇到这种情况的人来说,我的项目是从 Windows XP 环境中导入的,在 Windows 7 中重建它们似乎已经解决了任何问题。

标签: java windows-7 64-bit 32bit-64bit rxtx


【解决方案1】:

我遇到了同样的问题。我使用 Eclipse 作为 IDE 进行编程,我在官方 wiki 中找到了这个替代配置:

  1. 将 RXTXcomm.jar 复制到项目的 lib 目录中
  2. 将包浏览器导航到 lib 文件夹,右键单击 RXTXcomm.jar |构建路径 |添加到构建路径
  3. 将 rxtxSerial.dll 和 rxtxParallel.dll 文件复制到项目的根目录
  4. 运行不足 |运行配置 |类路径选项卡 |用户条目 |高级 |添加文件夹,选择项目的根文件夹
  5. 这应该足以在 Eclipse 下运行它,在部署可运行 jar 时,只需确保 dll 与 jar 位于同一文件夹中(JVM 假定它用于类路径)

(这是我的第一个答案,我不知道我是否可以发布外部链接,但五个步骤来自http://rxtx.qbang.org/wiki/index.php/Using_RXTX_In_Eclipse

希望对您有所帮助!

【讨论】:

  • 鼓励引用外部链接!请注意自我推销(请参阅FAQ)……但在这种情况下,这似乎不是问题。 :)
  • 谢谢!我的回复有点晚了,但我在重建 NetBeans 项目时能够使用它。
【解决方案2】:

它适用于我使用 Windows 7 和 64 位版本的 Java 和 RXTX(cloudhopper 版本)

你确定你有 COM1 吗?

【讨论】:

  • 是的,我一直在使用 Putty。当我在单独的应用程序中运行时,您的代码正确列出了我的端口,但是当从我的串行类运行时,找不到端口......谜团变得更浓了,但它似乎是一个库问题。
  • @darkhelmet 如果你想发布你的系列课程,我会尝试运行它
  • 该类对其他类有几个依赖项,我不能全部发布,但这是构造函数中发生这种情况的相关部分;这是我初始化串口的第一件事
猜你喜欢
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多