如何修复 Windows 10 中的 Java rxtxSerial.dll 或 jSSC-2.7_x86_64.dll 串行端口错误? [英] How to fix Java rxtxSerial.dll or jSSC-2.7_x86_64.dll Serial Port Error in Windows 10?

查看:44
本文介绍了如何修复 Windows 10 中的 Java rxtxSerial.dll 或 jSSC-2.7_x86_64.dll 串行端口错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

更新:我找到了使用 jSerialComm 库的解决方案.(见底部代码)

UPDATE: I have found a solution by using the jSerialComm library. (see code at the bottom)

我有一个程序,我们已经在 Windows 7 机器上运行了一段时间,但现在开始引入装有 Windows 10 的机器,程序崩溃了.所以我需要找到一个解决方案.

I have a program that we have been running for quite a while on windows 7 machines, but now are starting to introduce machines with Windows 10, and the program crashes. So i need to find a solution.

错误是 EXCEPTION_ACCESS_VIOLATION 错误.(见下文)

The error is an EXCEPTION_ACCESS_VIOLATION error. (See below)

下面的第一段代码是我自己的代码,它使用了 rxtxSerial.dll 库.它会打开并设置端口参数,但一旦从端口接收到数据就会崩溃.

The first block of code below is my own code which uses the rxtxSerial.dll library. It will open and set the port parameters, but crashes as soon as data is received from the port.

我也尝试了 jssc.jar 库,但出现相同的 EXCEPTION_ACCESS_VIOLATION 错误.

I have also tried the jssc.jar library with the same EXCEPTION_ACCESS_VIOLATION error.

第二个代码块直接来自 JSSC 示例 WIKI.它在尝试打开端口时立即崩溃.

The second block of code is straight from the JSSC samples WIKI. It crashes as soon as it tries to open the port.

我是使用 IntelliJ IDE.

I am the using IntelliJ IDE.

rxtxSerial.dll 错误:

The rxtxSerial.dll error:

#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000180005b00, pid=12340, tid=6016
#
# JRE version: Java(TM) SE Runtime Environment (10.0.1+10) (build 10.0.1+10)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (10.0.1+10, mixed mode, tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# C  [rxtxSerial.dll+0x5b00]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:UsersjochuIdeaProjectsWITSReaderhs_err_pid12340.log
#
# If you would like to submit a bug report, please visit:
#  http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

我试过好几个版本的 rxtxSerial.dll 和 RXTXcomm.jar

I have tried several versions of rxtxSerial.dll and RXTXcomm.jar

在这一点上,我认为这不是我的代码的问题,而是库甚至 java SDK 10.0.1 的问题.

At this point I am thinking it is not an issue with my code as much as in issue with a library or maybe even the java SDK 10.0.1.

更新:我在 Java SDK 11.0.1 和 Javafx SDK 11.0.1 中也有同样的问题

Update: I also have the same issue in Java SDK 11.0.1 with Javafx SDK 11.0.1

以下是我使用的导致错误的代码.(仅在 Windows 10 上运行时)rxtxSerial.dll 和 RXTXcomm.jar 需要链接库.

Below is the code I use which causes the error. (only when run on windows 10) rxtxSerial.dll and RXTXcomm.jar need to be linked libraries.

import gnu.io.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;

public class Main {

    static CommPortIdentifier[] portId = new CommPortIdentifier[10];
    static Enumeration portList;
    static InputStream inputStream;
    static SerialPort serialPort;
    static String stringBuffer = "";

    public static void main(String[] args) {

        //manually change for comport selection to keep code simple
        int selectedPort = 0;

        // Checking for ports
        portList = CommPortIdentifier.getPortIdentifiers();
        System.out.println("portList... " + portList);
        int comPortCounter = 0;
        while (portList.hasMoreElements()) {
            portId[comPortCounter] = (CommPortIdentifier) portList.nextElement();
            System.out.println(portId[comPortCounter].getName());
            System.out.println("port identified is Serial.. " + portId[comPortCounter].getPortType());
            comPortCounter++;
            if (comPortCounter > 9){
                comPortCounter = 9;
            }
        }

        // opening the port
        try{
            serialPort = (SerialPort) portId[selectedPort].open("SerialTest",500);
            System.out.println("Serial port open: " + portId[selectedPort].getName());
        } catch (PortInUseException e){
            System.out.println("Port in use error");
            return;
        }

        // initiate listening on the port
        try {
            inputStream = serialPort.getInputStream();
            System.out.println("Input Stream... " + inputStream);
        } catch (IOException e) {
            System.out.println("IO Exception");
            return;
        }

        // create the listener
        try {
            serialPort.addEventListener(new ListenerTest());
        } catch (TooManyListenersException e) {
            System.out.println("Too many Listener exception");
            return;
        }
        serialPort.notifyOnDataAvailable(true);

        // set COM port parameters (default 9600, 8, 1 , NONE)
        try {
            serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

            // no handshaking or other flow control
            serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

            // timer on any read of the serial port
            serialPort.enableReceiveTimeout(500);

            System.out.println("Serial port parameters have been set");
        } catch (UnsupportedCommOperationException e) {
            System.out.println("UnSupported comm operation");
            return;
        }
    }

    //Listener Class for the serial port.
    static public class ListenerTest implements SerialPortEventListener {

        @Override
        public void serialEvent(SerialPortEvent event) {

            switch (event.getEventType()) {
                case SerialPortEvent.DATA_AVAILABLE:

                    System.out.println("In SerialEvent");

                    // Wets Serial Port Read
                    try {
                        while (inputStream.available() > 0) {
                            byte[] byteBuffer = new byte[1024];
                            int length = -1;
                            length = inputStream.read(byteBuffer);
                            stringBuffer += new String(byteBuffer, 0, length);
                        }

                        System.out.println(stringBuffer);

                    } catch (IOException e) {
                        System.out.println("IO Exception in SerialEvent()");
                    }

                    break;
            }
        }
    }

}

我还使用以下代码尝试了 jSSC.jar 库.此代码直接来自 jssc 示例 WIKI,但用于跟踪代码崩溃位置的额外 System.out.println 命令除外.

I have also tried the jSSC.jar libraray with the following code. This code is straight from the jssc sample WIKI with the exception of the extra System.out.println commands to track where the code was crashing.

import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;

public class Main {

    static SerialPort serialPort;

    public static void main(String[] args) {
        serialPort = new SerialPort("COM14");
        try {
            System.out.println("Before openPort command.");
            serialPort.openPort();//Open port
            System.out.println("Port is open.");
            serialPort.setParams(9600, 8, 1, 0);//Set params
            System.out.println("Port Parameters are set.");
            int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR;//Prepare mask
            serialPort.setEventsMask(mask);//Set mask
            System.out.println("Mask is set.");
            serialPort.addEventListener(new SerialPortReader());//Add SerialPortEventListener
            System.out.println("Listener has started.");
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }

    /*
     * In this class must implement the method serialEvent, through it we learn about
     * events that happened to our port. But we will not report on all events but only
     * those that we put in the mask. In this case the arrival of the data and change the
     * status lines CTS and DSR
     */
    static class SerialPortReader implements SerialPortEventListener {

        public void serialEvent(SerialPortEvent event) {
            System.out.println("In Listener Event.");
            if(event.isRXCHAR()){//If data is available
                if(event.getEventValue() == 10){//Check bytes count in the input buffer
                    //Read data, if 10 bytes available
                    try {
                        byte buffer[] = serialPort.readBytes(10);
                    }
                    catch (SerialPortException ex) {
                        System.out.println(ex);
                    }
                }
            }
            else if(event.isCTS()){//If CTS line has changed state
                if(event.getEventValue() == 1){//If line is ON
                    System.out.println("CTS - ON");
                }
                else {
                    System.out.println("CTS - OFF");
                }
            }
            else if(event.isDSR()){///If DSR line has changed state
                if(event.getEventValue() == 1){//If line is ON
                    System.out.println("DSR - ON");
                }
                else {
                    System.out.println("DSR - OFF");
                }
            }
        }
    }
}

它会在 openPort 命令上生成以下错误.

And it generates the following error on the openPort command.

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000000aeb5bb, pid=12216, tid=16084
#
# JRE version: Java(TM) SE Runtime Environment (10.0.1+10) (build 10.0.1+10)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (10.0.1+10, mixed mode, tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# C  [jSSC-2.7_x86_64.dll+0xb5bb]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:UsersjochuIdeaProjectsjsscTesths_err_pid12216.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

我希望有人可能在我之前遇到了这个错误,并找到了解决方案.

I am hoping someone may have run into this error before me, and found a solution.

我只需要通过 Windows 10 上的侦听器读取串行数据.

I just need to read serial data through a listener on windows 10.

任何帮助将不胜感激!

以下代码可在带有 jSerialComm-2.4.0.jar 库的 Windows 10 上运行.

The code below works on windows 10 with the jSerialComm-2.4.0.jar library.

import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;


public class Main {

    static SerialPort comPort;
    static String stringBuffer;

    private static final class DataListener implements SerialPortDataListener
    {
        @Override
        public int getListeningEvents() { return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; }

        @Override
        public void serialEvent(SerialPortEvent event)
        {
            //System.out.println("In event listener.");
            if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE)
                return;
            //System.out.println("Past event type check.");
            byte[] newData = new byte[comPort.bytesAvailable()];
            int numRead = comPort.readBytes(newData, newData.length);
            stringBuffer = new String(newData,0,numRead);
            //System.out.println("Read " + numRead + " bytes.");
            System.out.println(stringBuffer);


        }
    }

    static public void main(String[] args)
    {
        comPort = SerialPort.getCommPorts()[0];
        comPort.openPort();
        System.out.println("COM port open: " + comPort.getDescriptivePortName());
        DataListener listener = new DataListener();
        comPort.addDataListener(listener);
        System.out.println("Event Listener open.");
    }
}

推荐答案

我已经解决了安装以前的Java版本.正是JDK_7u80.但是,我选择了一个旧版本来确定,因为这是我之前尝试过我的程序的最后一个版本.当您尝试对最新的 Java 版本执行相同操作时,您会收到该错误.但是,在 Java Bug System 中,他们回答说不是 Java 问题(serial驱动程序).

I have solved it installing a previous Java version. Exactly the JDK_7u80. However, I have selected an old version to be sure because this was the last version in which I had tried my programme before. When you try to do the same with the latest Java versions, you receive that error. However, in the Java Bug System, they answered that is not a Java issue (serial and driver).

这发生在 RXTX, jSSC, Fazecast/jSSCPanamaHitek.我已经测试了四个.问题是 Fazecast 和 Panama 是基于 jSSC 的.

This happens with RXTX, jSSC, Fazecast/jSSC, and PanamaHitek. I have tested the four. The problem is that Fazecast and Panama are based on jSSC.

这篇关于如何修复 Windows 10 中的 Java rxtxSerial.dll 或 jSSC-2.7_x86_64.dll 串行端口错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆