簡體   English   中英

線程“主”java.lang.NoClassDefFoundError 中的異常:gnu/io/SerialPortEventListener

[英]Exception in thread “main” java.lang.NoClassDefFoundError: gnu/io/SerialPortEventListener

我是編碼新手,我想將我的 pi 連接到 Schneider pm 1200 以獲取保持寄存器的值。 當我執行它時,我遇到了許多與異常相關的錯誤。

怎么寫寄存器? 我正在嘗試使用 writeSingleRegister 方法,但我無法得到它的寄存器類型錯誤。

我正在使用j2mod jar 文件

這是代碼

import com.ghgande.j2mod.modbus.facade.ModbusSerialMaster;
import com.ghgande.j2mod.modbus.Modbus;
import com.ghgande.j2mod.modbus.ModbusException;
import com.ghgande.j2mod.modbus.procimg.Register;
import com.ghgande.j2mod.modbus.util.*;

public class ModbusMaster
{

/**
 * @param args
 */
    public static void main(String[] args) 
    {
        /* The important instances of the classes mentioned before */
        ModbusSerialMaster serialMaster = null; // the connection
        
        /* Variables for storying the parameters */
        String portname = "/dev/ttyUSB0"; // the name of the serial port to be used
        int unitID = 1 ; // the unit identifier we will be talking to
        int startingRegister = 100001; // the reference, where to start reading from
        int registerCount = 0; // the count of the input registers to read
        Register[] slaveResponse = new Register[registerCount];
    
        try 
        {
            /* Setup the serial parameters */
            SerialParameters parameters = new SerialParameters();
            parameters.setPortName(portname);
            parameters.setBaudRate(9600);
            parameters.setDatabits(8);
            parameters.setParity("None");
            parameters.setStopbits(1);
            parameters.setEncoding(Modbus.SERIAL_ENCODING_RTU);
            parameters.setEcho(false);
    
            /* Open the connection */
            serialMaster = new ModbusSerialMaster(parameters);
            serialMaster.connect();
    
        } 
        
        catch (Exception exception) 
        {
            exception.printStackTrace();
        }
    
        /* Read the first four holding registers */
        try 
        {
            slaveResponse = serialMaster.readMultipleRegisters(unitID, startingRegister, registerCount);
            for (int i = 0; i < slaveResponse.length; i++) 
            {
                System.out.println("reg" + i + " = " + slaveResponse[i]);
            }
        } 
        
        catch (ModbusException e) 
        {
            e.printStackTrace();
        }
        /* Close the connection */
        serialMaster.disconnect();
    
    }
}

這是 output

Exception in thread "main" java.lang.NoClassDefFoundError: gnu/io/SerialPortEventListener
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at com.ghgande.j2mod.modbus.facade.ModbusSerialMaster.<init>(ModbusSerialMaster.java:78)
    at ModbusMaster.main(ModbusMaster.java:38)
Caused by: java.lang.ClassNotFoundException: gnu.io.SerialPortEventListener
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 14 more

你的回答會對我有所幫助。

在運行時,為 Java 程序執行的代碼從“類文件”開始,由編譯器存儲在擴展名為“.class”的文件中。 這些文件通常分組打包在“jar 文件”中,Java 運行時可以在運行時找到 jar 文件中的類。

您的錯誤表明運行時找不到指示的 class。 The java.io.SerialPortEventListener class appears to be available in the jar file rxtx-2.1.7.jar. 您可以下載它(搜索其可靠來源)並將其復制到目標機器。 然后,您需要閱讀什么是類路徑; 您可以在環境變量中設置類路徑,也可以在運行時將參數傳遞給“java”命令。 無論哪種方式,運行程序時,運行時都可以在 jar 文件中找到 class。

我在這里觸及了一些概念; 很抱歉,這不是一個真正簡單的 1-2-3 類答案,但是當您編寫更多代碼時,您需要了解 jar 文件和類路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM