如何修复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?

查看:1211
本文介绍了如何修复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.

我还尝试了具有相同EXCEPTION_ACCESS_VIOLATION错误的jssc.jar库.

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:\Users\jochu\IdeaProjects\WITSReader\hs_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 libraray.该代码直接来自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:\Users\jochu\IdeaProjects\jsscTest\hs_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.

任何帮助将不胜感激!

下面的代码在Windows 10上使用jSerialComm-2.4.0.jar库工作.

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

推荐答案

使用rxtx的jRxTx也有类似的问题.我的程序可以正常运行2分钟,然后崩溃,并显示相同的错误消息.

I had a similar problem with jRxTx which uses rxtx. My program would run fine for 2 minutes and then crash with the same error message.

我的实现的问题是我向serialPort两次添加了相同的serialEventListener.

The problem with my implementation was that I added the same serialEventListener twice to the serialPort.

serialPort.addEventListener(eventListener);

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

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