稳定的RXTX替代方案

57

在使用RXTX库进行多个不同项目后,我遇到了许多令人恼火的差异和问题,这些问题只能合理地归因于库中的错误 - 死锁、竞争危害以及深度嵌入RXTX库的监视线程未关闭导致程序无法关闭(即使我使用的所有端口都已关闭!)运行最新的“不稳定”版本有所帮助,但它仍然远远不能称之为可靠,而且目前该项目的活动似乎相当低。

然而,在寻找免费的、跨平台的RXTX替代方案时,似乎没有太多选择。

是否有其他库被任何人尝试过并取得了更好的运气? 我不需要并行端口支持,只需要串行支持,而且它不一定要与RXTX或javax.comm API兼容。


8
jSSC库的新版本2.5.0已经发布,其中包含一些重要修复,强烈建议进行更新。更多信息请参见:https://code.google.com/p/java-simple-serial-connector/。 - scream3r
1
我目前遇到了和你一样的问题...总是在库中出现错误,死锁,而你足够小心地正确关闭所有端口...这真的很烦人。真的要考虑其他选项。 - Mxsky
1
@Mxsky FWIW,jssc(下面链接)自从我使用以来一直表现良好 :) - Michael Berry
2
你试过这个吗?https://github.com/Fazecast/jSerialComm - hurelhuyag
2
我的选择会是jSerialComm。在我们的串口应用中,与RXTX相比,它更加可靠。不需要维护本地组件是一个很大的优点。 - simgineer
7个回答

47

我们已经转移到java-simple-serial-connector,该版本为0.9.0,目前看来非常稳定且易于使用。它可以在Windows和Linux系统上运行,并且我们将其用于模拟器交互。


2
这似乎暂时很好地完成了工作(而且似乎包含所需的本地库,另一个优点)。谢谢! - Michael Berry
2
我们在ARM硬件上运行JamVM时遇到了RxTx的一些问题,特别是关于CPU方面的。一个使用接收超时和阈值设置的阻塞调用的测试程序在15-30%的CPU上运行,当使用多个端口时会乘以倍数。现在,jssc不提供阈值设置,因此我使用事件API实现了它。然而,事件API和带有超时参数的读取方法都使用忙循环(Thread.sleep),在我们的目标上使情况变得更糟:我们在一个串口上运行通信时CPU占用率达到了100%! - jaw
@jaw 在这里也遇到了同样的问题,RXTX 的本地库正在轮询端口以获取事件并消耗大量 CPU。加上我需要监视多个串行端口,这真的很紧张,会增加系统的延迟。 - darkhelmet
尽管这个库已经超过5年没有更新了,但它在完成简单任务方面做得很好。它可以用来与Arduino通信,比RxTx更简单、更方便。 - lepe
1
最新版本(2.8.0,截至撰写本文已有6年历史)每14天会崩溃一次。 - Mark Jeronimus

20

还有jSerialComm

Java中的串行通信很混乱。我在Linux上用虚拟USB串行端口时遇到了jSSC的问题,但使用serial-comm连接成功。

RXTX很混乱。

至少我认为现在这个SO问题已经列出了所有值得一提的Java串行通信库。


+1 for serial-comm。在受够了混乱不堪的RXTX之后,我刚刚开始研究serial-comm。相比之下,serial-comm简洁而且文档完善。我只花了半个小时就将RXTX替换为serial-comm并整合到我的项目中。太棒了。 - davidf2281
对于jSerialComm,它易于集成,无需外部库或任何本地代码。您不需要过多关注操作系统是32位还是64位。 - Ahmed MANSOUR
1
+1 for jSerialComm。我们在工业应用中使用它,它比RXTX更可靠且打包更好。也许应该将库的名称改为jSerialComm以避免混淆,另一个人添加了相同建议的另一个答案。 - simgineer
@simgineer 我已更新库名称,谢谢。 - miguelcobain
JSerialComm在监听器方面存在漏洞。 - Oumalek Mohamed

5
现在有几个选择,因为Arduino相当受欢迎。有SerialioPureJavaComm,但我看到它还处于早期开发阶段。真正取决于您的需求。RXTX已被移植到几乎所有地方,因此它是广泛可用的。

8
SerialIO似乎是一个商业产品,价格很高。唉! - ingyhere
PureJavaComm非常好(而且免费)。我已经使用它进行串行通信几年了,发现它非常稳健。 - Jason S

2

我遇到的RXTX问题之一是关闭端口时存在延迟。当使用setserial检查端口配置时,我发现了一个参数closing_delay=3000。这意味着在执行close()方法后,端口将在3秒后关闭。重置closing_delay的任何值都会被RXTX忽略。RXTX坚持要有3秒的延迟。

JSSC库表现得符合我们的要求。


1
我使用配置为服务串口的socat。 缺点是波特率等信息在socat调用时给定,不是您可以轻易从程序中更改的内容。 好处是我可以通过网络连接,只需更改连接的IP地址即可。

我也使用过Serialio库,它对我来说非常好用。 - user2543191

1
Serialio库是一种价格为49美元/平台/开发者席位的库,可在无限数量的应用程序中进行无限分发,因此价格不算太高。在我们的一个不太苛刻的应用程序中,Mac库一直稳定可靠,并且各种Mac平台和OS/X版本的可用性/兼容性一直很好。请保留HTML标签。

1

Miguelcobain的答案建议使用相同的库,尽管他称呼它为不同的名称。 - simgineer
也许应该将库的名称改为jSerialComm以避免混淆。我不知道他的意思是'jSerialComm' 应该重命名为 'jSerialComm' 吗? - James Wang
原始答案提到了jSerialComm的不同名称,现已进行更正,因此提及错误的名称可能会令人困惑。 - simgineer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接