rxtx致命的EXCEPTION_ACCESS_VIOLATION

时间:2014-06-20 01:30:27

标签: java windows rxtx

我遇到了RXTX库的问题。我试图在我的项目中添加对一次读/写多个串口的支持,并开始在运行时收到以下消息。

# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000001800071cd, pid=9032, tid=5016
#
# JRE version: Java(TM) SE Runtime Environment (7.0_51-b13) (build 1.7.0_51-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [rxtxSerial.dll+0x71cd]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\Jack\workspace\TestProject\hs_err_pid9032.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

我已经能够隔离产生此崩溃的代码,并且希望有人可以提供关于它为什么会发生的解释,和/或可能验证这确实是rxtx的预期行为(而不是结果)我的设置有些错误配置.RXTX确实抱怨我的native-lib和jar之间每次都不匹配.subine-lib 2.2pre2和jar版本2.1-7,但我忽略了到目前为止没有明显的不良影响)

产生错误的最简单代码:

public static void main(String[] args) throws Exception {
    CommPortIdentifier com13PI = CommPortIdentifier
            .getPortIdentifier("COM13");
    CommPortIdentifier com1PI = CommPortIdentifier
            .getPortIdentifier("COM1");
    SerialPort com13 = (SerialPort) com13PI.open(main.class.getName(), 400);
    SerialPort com1 = (SerialPort) com1PI.open(main.class.getName(), 400);
    com13.close();
    //com1.close();
    com13PI = CommPortIdentifier.getPortIdentifier("COM13");
    com13 = (SerialPort) com13PI.open(main.class.getName(), 400);
 }

关键的一行是'com1.close()',目前已被注释掉。取消注释时,此代码可以正常工作。在它的当前形式中,它产生上述异常。

RXTX的文档非常缺乏,我无法判断这是否是预期的行为。但是,打开和关闭一个串口的能力,而另一个仍然打开的能力似乎是在使用RXTX库时会经常出现的,所以如果这是rxtx中一个未修复的错误,这似乎有点令人震惊。如果安装了rxtx的人可以测试此代码并报告结果或提供解释,我会很感激。

1 个答案:

答案 0 :(得分:0)

我没有配备我的串口调制解调器,但我记得有类似的问题。

首先,检查com1.close()周围是否存在异常。如果你得到一个IOException,那是因为流仍然有内容而且它被卡住了。如果该流上有消费者但未处理任何内容,则会发生这种情况。在Linux find . | yourscript中考虑管道,其中yourscript不会消耗find .生成的内容。

应该能够打开和关闭端口,但IMHO RxTx真的变幻无常,当事情不会发生太大变化时,它可以正常工作。