java xbee lib发送数据时导致致命错误

问题描述 投票:0回答:1

我正在尝试编写代码,通过 USB 连接到我的计算机的 xbee 与我连接到 arduino 的另一个 xbee 之间进行通信。我下载了该库并在 Eclipse 中设置了所有内容,但是当我尝试运行该库附带的示例代码时,它会导致致命错误。

import com.digi.xbee.api.WiFiDevice;
import com.digi.xbee.api.XBeeDevice;
import com.digi.xbee.api.exceptions.XBeeException;
import com.digi.xbee.api.models.XBeeProtocol;

public class XbeeSending {
/* Constants */
// TODO Replace with the port where your sender module is connected to.
private static final String PORT = "COM3";
// TODO Replace with the baud rate of your sender module.
private static final int BAUD_RATE = 9600;
private static final String DATA_TO_SEND = "100";
public static void main(String[] args) {
    XBeeDevice myDevice = new XBeeDevice(PORT, BAUD_RATE);
    byte[] dataToSend = DATA_TO_SEND.getBytes();
    try {
        myDevice.open();
        System.out.format("Sending broadcast data: '%s'", new String
                (dataToSend));
        if (myDevice.getXBeeProtocol() == XBeeProtocol.XBEE_WIFI) {
            myDevice.close();
            myDevice = new WiFiDevice(PORT, BAUD_RATE);
            myDevice.open();
            ((WiFiDevice)myDevice).sendBroadcastIPData(0x2616, dataToSend);
        } else
            myDevice.sendBroadcastData(dataToSend);
        System.out.println(" >> Success");
    } catch (XBeeException e) {
        System.out.println(" >> Error");
        e.printStackTrace();
        System.exit(1);
    } finally {
        myDevice.close();
    }
}
}

打印出:

[main] INFO com.digi.xbee.api.XBeeDevice - [COM3 - 9600/8/N/1/N] 打开连接界面...

[main] INFO com.digi.xbee.api.XBeeDevice - [COM3 - 9600/8/N/1/N] 连接接口打开。

Java 运行时环境检测到致命错误:

EXCEPTION_ACCESS_VIOLATION(0xc0000005)位于 pc=0x00000001800044cb,pid=22096,tid=16868

JRE 版本:Java(TM) SE 运行时环境 (17.0.2+8)(内部版本 17.0.2+8-LTS-86)

Java VM:Java HotSpot(TM) 64 位服务器 VM(17.0.2+8-LTS-86、混合模式、共享、分层、压缩 oops、压缩类 ptrs、g1 gc、windows-amd64)

有问题的框架:

C [rxtxSerial.dll+0x44cb]

虽然错误提到与 rxtx 有关,但我还有一些代码来测试在 eclipse 上运行良好的 rxtx 库。这里和其他地方的大多数答案都是“这是 JVM 中的一个错误”,但我想知道是否有一些特定于 xbee 的东西,其他人可能已经尝试解决这个问题,因为网上的一些答案是来自完全不同的库,他们的解决方案似乎对我不起作用,或者也许有人可以尝试在不同的机器上运行代码(我的机器有英特尔 i7-10700k 和 32GB 内存),或者告诉我是否有我忽略了一些事情,因为我以前从未使用过这个库。

在手动模式下的XCTU中,我可以在2个Xbees之间发送信息,arduino将接收信息并适当地执行功能,我还设置了xbee以具有“API启用[1]”,到目前为止我的测试表明问题不应该来自 xbees 本身。至于代码本身,它直接来自 xbee 库示例,但在我的例子中端口是 COM3,波特率和所有其他参数也与我电脑上 XCTU 的信息匹配。我还认为 rxtx 可能是问题所在,但我在网上找到的以下代码似乎工作得很好并且完成时没有错误:

import gnu.io.CommPortIdentifier;

import gnu.io.SerialPort;
import gnu.io.PortInUseException;
import gnu.io.UnsupportedCommOperationException;
import gnu.io.NoSuchPortException;
import java.io.OutputStream;
import java.io.IOException;

public class XbeeSending {
private static final String PORT_NAME = "COM3";
private static final int BAUD_RATE = 9600;

public static void main(String[] args) {
CommPortIdentifier portId = null;
SerialPort serialPort = null;

    try {
        portId = CommPortIdentifier.getPortIdentifier(PORT_NAME);
        serialPort = (SerialPort) portId.open("100", 2000);
        serialPort.setSerialPortParams(BAUD_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);

        OutputStream outputStream = serialPort.getOutputStream();
        outputStream.write("100".getBytes());
        System.out.println("Data sent successfully.");

    } catch (NoSuchPortException | PortInUseException | UnsupportedCommOperationException | IOException e) {
        e.printStackTrace();
    } finally {
        if (serialPort != null) {
            serialPort.close();
        }
    }
  }
} 

我还尝试了很多不同版本的 jdk,我在 jdk 17 中运行了这个特定的示例,但也尝试了 15、20 和 22,它们都给了我完全相同的错误。如果有人想尝试在自己的计算机上运行此代码,可以在 https://github.com/digidotcom/xbee-java/releases 获取 xbee 库。我还查看了该库的源代码,特别是“AbstractXBeeDevice”,因为这是第 3115 行打印日志消息的地方。

编辑:至于一些可能类似的链接问题,例如串行端口读取 - 错误:EXCEPTION_ACCESS_VIOLATION - C [rxtxSerial.dll+0x5b00],不幸的是,我也尝试过使用 java u251,正如一些答案所建议的那样我收到以下错误:线程“main”java.lang.UnsupportedClassVersionError中的异常:XbeeSending已由更新版本的Java运行时(类文件版本59.0)编译,此版本的Java运行时仅识别类文件版本到 52.0,所以我无法使用任何早于 15 的 Java 进行测试。是否有 rxtx 的替代方案可以帮助我在 java 中使用 xbee?

java arduino serial-port xbee rxtx
1个回答
0
投票

需要 TyperDex 应用程序的测试人员和编码人员。 TyperDex 是一款创新应用程序,旨在促进和加快设备上的文本输入过程。 TyperDex 允许用户创建和管理自己的文本模板,只需使用预定义命令之一即可随时插入这些模板。对于那些希望优化工作或只是在日常任务上节省时间的人来说,这是完美的解决方案。 更多详情请见电报:@TyperDex_Manager

© www.soinside.com 2019 - 2024. All rights reserved.