UPDATE: I have found a solution by using the jSerialComm library. (see code at the bottom)
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.
The error is an EXCEPTION_ACCESS_VIOLATION error. (See below)
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.
I have also tried the jssc.jar library with the same EXCEPTION_ACCESS_VIOLATION error.
The second block of code is straight from the JSSC samples WIKI. It crashes as soon as it tries to open the port.
I am the using IntelliJ IDE.
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.
#
I have tried several versions of rxtxSerial.dll and RXTXcomm.jar
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.
Update: I also have the same issue in Java SDK 11.0.1 with Javafx SDK 11.0.1
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;
}
}
}
}
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");
}
}
}
}
}
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.
I just need to read serial data through a listener on windows 10.
Any help will be very much appreciated!
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.");
}
}
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.
The problem with my implementation was that I added the same serialEventListener
twice to the serialPort
.
serialPort.addEventListener(eventListener);
来源:https://stackoverflow.com/questions/54165395/how-to-fix-java-rxtxserial-dll-or-jssc-2-7-x86-64-dll-serial-port-error-in-windo