- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
更新:我找到了使用 jSerialComm 库的解决方案。 (见底部代码)
我有一个程序,我们已经在 Windows 7 机器上运行了很长一段时间,但现在开始引入装有 Windows 10 的机器,程序崩溃了。所以我需要找到解决方案。
错误是 EXCEPTION_ACCESS_VIOLATION 错误。 (见下文)
下面的第一段代码是我自己的代码,它使用了 rxtxSerial.dll 库。它会打开并设置端口参数,但一旦从端口接收到数据就会崩溃。
我也尝试过 jssc.jar 库,但出现相同的 EXCEPTION_ACCESS_VIOLATION 错误。
第二个代码块直接来自 JSSC 示例 WIKI。它在尝试打开端口时立即崩溃。
我正在使用 IntelliJ IDE。
rxtxSerial.dll 错误:
#
# 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
在这一点上,我认为这不是我的代码的问题,而是库甚至 Java SDK 10.0.1 的问题。
更新:我在 Java SDK 11.0.1 和 Javafx SDK 11.0.1 中也有同样的问题
下面是我使用的导致错误的代码。 (仅在 Windows 10 上运行时)rxtxSerial.dll和RXTXcomm.jar需要链接库。
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 命令除外。
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 命令上生成以下错误。
#
# 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.
#
我希望有人在我之前遇到过这个错误,并找到了解决方案。
我只需要通过 Windows 10 上的监听器读取串行数据。
非常感谢任何帮助!
下面的代码适用于带有 jSerialComm-2.4.0.jar 库的 Windows 10。
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 分钟,然后崩溃并显示相同的错误消息。
我的实现的问题是我向 serialPort
添加了两次相同的 serialEventListener
。
serialPort.addEventListener(eventListener);
关于windows - 如何修复 Windows 10 中的 Java rxtxSerial.dll 或 jSSC-2.7_x86_64.dll 串口错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54165395/
我正在通过 Java Applet 和 rxtx 库进行一些串行通信。小程序工作正常,但是当加载次数超过一次时,我遇到了问题 UnsatisfiedLinkError: rxtxSerial.dll
当我尝试运行 Java 应用程序时,出现以下错误: java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown
好的,我使用 rxtx 库连接到 rs232,它在 eclipse 中运行良好。但是当我将我的项目导出到 .jar 文件时,我遇到了一个错误 UnsatisfiedLinkError: no rxtx
我正在尝试将 64 位 rxtx 串行通信库(从 cloudhopper 下载)与 64 位 Windows 7 和 eclipse 一起使用。我收到消息:java.lang.UnsatisfiedL
我已经很长时间没有使用 Java 了,但我正在尝试拼凑一个 JApplet,它可以从串行端口读取数据以进行 Arduino 集成。到目前为止,它在 NetBeans 和 Eclipse 中运行良好,但
我正在尝试将 64 位 rxtx 串行通信库(从 cloudhopper 下载)与 64 位 Windows 7 和 eclipse 一起使用。我收到消息:java.lang.UnsatisfiedL
我尝试在 debian 上使用 rxtx 串行通信库,并且我已将 librxtx.so 添加到 native 库路径中,但仍然出现此异常。 java.lang.UnsatisfiedLinkE
这个问题在这里已经有了答案: java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path (12 个答案) 关闭 6 年前。
目前我正在尝试读取串口。在 Linux 中工作正常。但在 Windows 机器中面临错误。 我关注了这个 link从 here 读取串口和下载的 RXTX 库对于 Windows 机器(JAR + D
我目前正在从事一个 ZigBee 项目,我正在使用 Mountain Lion (10.8) 和 Eclipse IDE 在 Mac 上进行编程。要通过 USB 使用我的 Zigbee 模块进行串行通
package NClang.tinycompile; import org.sintef.jarduino.DigitalPin; import org.sintef.jarduino.Digita
我正在尝试使用 Jamod 串行主代码与 COM1 端口中连接的设备建立连接。以下是我的代码: SerialConnection connection = null; public void conn
Fedora 现在正在使用(包已安装 包 rxtx-2.2-0.5.20100211.fc15.i686 已安装且最新版本 )。 我已经使用/尝试过: # locate librxtxSerial /
更新:我找到了使用 jSerialComm 库的解决方案。 (见底部代码) 我有一个程序,我们已经在 Windows 7 机器上运行了很长一段时间,但现在开始引入装有 Windows 10 的机器,程
我正在使用 Eclipse IDE 开发 Java 应用程序。我的操作系统是 Mac OS 10.12.2 。我的应用程序使用 RXTX 库 (gnu.io.*) 进行串行通信,添加到我的 pom.x
java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXC
我是一名优秀的程序员,十分优秀!