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