Java 中的串行通信2024年9月10日 | 阅读10分钟 鉴于 Java 的基础独立性,串行通信很困难。串行通信需要一个标准化的 API 和特定的平台实现,这对于 Java 来说是困难的。 不幸的是,Sun 对 Java 中的串行通信并未给予太多关注。Sun 定义了一个名为 JavaComm 的串行通信 API,但该 API 的实现并未包含在 Java 标准版中。Sun 为其中一些提供了一个参考实现,但并非适用于所有 Java 平台。特别是到 2005 年底,Sun 悄然撤销了对 Windows 的 JavaComm 支持。 可以获得被遗忘的平台的第三方实现。JavaComm 在这方面并未得到太多维护活动。Sun 只进行了最少的维护。另一方面,实际上 Sun 显然对来自其自己的 Sun Beam 精简客户端的消费者做出了回应,并在放弃 Windows 支持的同时对该平台进行了 JavaComm 的调整。 这种情况以及 Sun 最初未为 Linux 提供 JavaComm 实现(自 2006 年起,他们现在提供了)导致了免费软件 RxTx 库的开发。RxTx 可用于多种平台,而不仅仅是 Linux。它可以与 JavaComm 一起使用(RxTx 提供特定于硬件的驱动程序),或者它可以独立使用。当作为 JavaComm 驱动程序使用时,JavaComm API 和 RxTx 之间的连接由 JCL(JavaComm for Linux)完成。JCL 是 RxTx 分发版的一部分。 Sun 对 JavaComm 的疏忽以及 JavaComm 特定的编程模型使得 JavaComm 获得了“不可用”的声誉。RxTx - 如果不作为 JavaComm 驱动程序使用 - 提供了一个更丰富的接口,但该接口并未标准化。RxTx 支持比现有 JavaComm 实现更多的平台。最近,RxTx 已被采用来提供与 JavaComm 相同的接口,只是包名与 Sun 的包名不匹配。 总而言之,在应用程序中应该使用哪个库?如果想要最大的可移植性(在某种“最大”的意义上),JavaComm 是一个不错的选择。如果某个特定平台没有 JavaComm 实现,但有 RxTx 实现,则 RxTx 可以用作该平台的 JavaComm 驱动程序。这样,应用程序就不需要进行修改,并且可以只针对一个接口,即标准化的 JavaComm 接口进行开发。 本模块将讨论 JavaComm 和 RxTx。它主要侧重于演示概念,而不是可运行的代码。那些希望盲目复制代码的人可以参考随包提供的示例代码。那些想了解他们在做什么的人可能会在本模块中找到一些有用的信息。 还应考虑 jSSC(Java Simple Serial Connector)。 安装1. 安装过程中的一般问题 JavaComm 和 RxTX 都显示出一些安装上的怪癖。强烈建议严格按照安装说明进行操作。如果说明说某个 jar 文件或共享库需要放在特定的目录中,那真的是这个意思!如果说明说某个文件或设备需要具有特定的所有权或访问权限,那也确实是这个意思。许多安装麻烦只是因为没有严格遵循说明。 尤其值得注意的是,某些版本的 JavaComm 附带两个安装说明。一个适用于 Java 1.2 及更高版本,一个适用于 Java 1.1。使用错误的说明将导致安装失败。另一方面,某些版本的/制造商/包的 RxTx 附带不完整的说明。在这种情况下,应该获取相关的 RxTx 源代码分发版,其中应包含完整的说明。 许多 Linux 发行版在其存储库中提供了 RxTx 包(ArchLinux - 'java-rxtx',Debian/Ubuntu - 'librxtx-java')。这些包仅包含库中特定于平台的组件。但是,它们通常即可使用。 还应注意到,Windows JDK 安装通常附带多达三个 VM,因此有三个扩展目录。
一个更极端的情况是在 \Windows 目录结构中的某个地方还有第四个 JRE。 JavaComm 应至少作为 JDK 和所有公共 JRE 的扩展安装。 2. Webstart 1. Javacomm: JavaComm 和 RxTx 都存在一个普遍问题,那就是它们都抵制通过 Java WebStart 进行安装。 JavaComm 之所以出名,是因为它需要一个名为 javax.comm.properties 的文件放在 JDK 的 lib 目录中,而这是 Java WebStart 无法做到的。这尤其令人沮丧,因为该文件的要求是 JavaComm 中某个不必要的计划/选择的结果,JavaComm 的设计者本可以轻松避免。Sun 始终拒绝纠正此错误。提及系统很重要。他们正在关于 JavaComm 说谎,特别是自 Java 以来,很长一段时间以来,它就拥有一个专门为此类目的设计的代理服务架构。 属性文件中的条目通常只有一行,即本地驱动程序的 Java 类名,例如 以下是一个允许通过 Web Begin 发送 JavaComm 的技巧,尽管有这个令人费解的属性文件。它有严重的缺点,并且可能会在更新的 JavaComm 版本中失败 - 如果 Sun 最终做出另一个版本。 首先,关闭安全管理器。Sun 的某个愚蠢的开发者认为一遍又一遍地检查可怕的 javax.comm.properties 文件是否存在会很酷,即使在它最初加载之后,其原因只是检查文件。出于未知原因。 然后,在初始化 JavaComm API 时,手动初始化驱动程序 2. RxTx: RxTx 在某些平台上需要更改串行设备的拥有权和访问权限。这也无法通过 WebStart 完成。 在程序启动时,您可以要求用户以超级用户身份执行必要的配置。 此外,RxTx 有一个示例匹配算法,用于识别“有效”串行设备名称。当需要使用非标准设备,如 USB 转串行转换器时,这通常会导致问题。可以通过系统属性覆盖此功能。有关详细信息,请参阅 RxTx 安装说明。 3. jSerialComm: jSerialComm 是一个 Java 库,旨在提供一种无需外部库、本地代码或任何其他工具即可访问标准串行端口的平台无关方法。它旨在作为 RxTx 和(已弃用的)Java Communications API 的替代品,易于使用,增强了对中断的支持,并能够同时打开多个端口。 与 RxTx 和 JavaComm 不同,jSerialComm 可以在许多操作系统和平台上(例如,Windows x86/x86_64、Linux x86/x86_64、ARM 甚至 Android - 完整列表在特定库 jar 中)即开即用,无需任何更改。但是,它仍然需要权限才能访问设备。 jSerialComm 的特点
4. SerialPundit: SerialPundit 是另一个功能丰富的库,用于在 Java 中访问串行端口。它包含一些功能,例如检测何时将 USB-UART 设备(如 FTDI232)连接到系统,自动检测操作系统和 CPU 架构,无需安装,文档齐全,经过充分测试,并且拥有支持/讨论组。 JavaComm APIJava 中串行通信的官方 API 是 JavaComm API。此 API 不是标准 Java 2 版本的一部分。相反,API 的实现必须单独下载。不幸的是,JavaComm 从 Sun 那里获得的关注不多,并且在很长一段时间内没有得到实际维护。Sun 偶尔会进行一些微不足道的错误修复,但不会进行非常迟到的主要更新。 本节解释了 JavaComm API 的基本操作。提供的源代码保持简单以展示要点。在实际应用程序中使用时应进行改进。 本节中的源代码不是唯一可用的示例代码。JavaComm 下载附带了一些示例。这些示例比 API 文档包含的信息量几乎更多。不幸的是,Sun 并没有提供真正的教程或任何入门文本。因此,值得研究示例代码以了解 API 的机制。 然而,API 文档也应该被研究。但是,最好的方法是研究示例并进行实践。由于缺乏易于使用的应用程序以及人们难以理解 API 的编程模型,该 API 经常受到批评。API 比其声誉更好,功能也更强大。然而,仅此而已。 API 使用回调机制来通知开发人员新出现的数据。建议研究此机制,而不是依赖轮询端口。与其他 Java 中的回调接口(例如 GUI 中的回调接口)不同,此接口只允许一个侦听器收听事件。如果需要多个侦听器收听串行事件,则必须实现主要侦听器,使其将信息分派给其他辅助侦听器。 下载Sun 的 JavaComm 网页http://java.sun.com/products/javacomm/ 指向一个下载区域http://www.sun.com/download/products.xml?id=43208d3d。在该区域下,Sun 目前(2007 年)为 Solaris/SPARC、Solaris/x86 和 Linux x86 提供 JavaComm 3.0 实现。 下载需要注册 Sun 在线帐户。下载页面提供注册页面的链接。此注册的目的尚不清楚。可以下载 JDK 和 JRE,无需注册,但 Sun 引用了关于软件分发和出口的法律和政府限制,尽管 JavaComm 几乎没有多少。 JavaComm 的 Windows 版本目前不是官方提供的,Sun - 违背其自身的“产品生命周期结束”政策 - 没有将其提供在 Java 产品存档http://java.sun.com/products/archive/ 中。但是,2.0 Windows 版本(javacom 2.0)仍可从此链接下载http://wind.lcs.mit.edu/download/。 安装请遵循下载包中提供的安装说明。JavaComm 2.0 的某些版本附带两个安装说明。其中较清晰的说明不幸是错误的,是为旧的 Java 1.1 环境准备的。引用旧的 Java 1.2 (jdk1.2.html) 的信息是正确的。 特别是 Windows 用户通常不知道他们安装了多个 VM 副本(通常是三到四个)。一些 IDE 也喜欢附带自己的专有 JRE/JDK 安装,就像某些 Java 应用程序一样。安装必须为每个应该与串行应用程序的开发和执行一起使用的 VM 安装(JDK 和 JRE)重复。 IDE 通常有 IDE 特定方法来告诉 IDE 新库(类和文档)。通常,像 JavaComm 这样的库不仅需要通过这种方式告知 IDE,而且还需要告知每个应该使用该库的项目。请阅读 IDE 的文档。 应该注意的是,旧的 JavaComm 2.0 版本附带的 JavaDoc API 文档是以已弃用的 Java 1.0 JavaDoc 格式组织的。一些现代 IDE 不再支持这种结构,无法将其 JavaComm 2.0 文档集成到其帮助系统中。在这种情况下,需要一个外部程序来读取文档(推荐的做法...)。 安装软件后,建议检查示例和 JavaDoc 目录。构建并运行一个示例应用程序以检查安装是否正确是一个好主意。示例应用程序通常需要少量修改才能在特定平台上运行(例如,更改硬编码的 com 端口标识符)。 在评估示例应用程序时,最好准备一些串行硬件,例如电缆、null modem、分线盒、真正的调制解调器、PABX 等。Serial_Programming: RS-232 Connections 和 Serial_Programming: Modems and AT Commands 提供了有关如何设置串行应用程序开发环境的硬件方面的一些信息。 下一主题# |
在 Java 中,Future 和 Callable 接口是 java.util.concurrent 包的重要组成部分。它们提供了一种机制来管理异步任务的结果并处理异步任务。尽管它们都有类似的功能,但它们之间存在一些显著的差异,这些差异是...
阅读 3 分钟
向后兼容性是指系统、产品或技术与早期版本协同工作的能力,或集成为早期版本创建的旧系统或输入的 alojamento。当对系统的修改破坏了这种兼容性时,就会导致所谓的“重大更改”。在...
阅读 6 分钟
编程通过使用算术函数(包括加、减、乘、除和模运算)来处理现实世界的问题。Java 的面向对象特性允许开发人员将算术运算放入方法中,从而更容易实现代码的可重用性和可理解性。在本节中,我们将创建 Java 程序来...
5 分钟阅读
Java 8 带来了海量的新特性,彻底改变了开发人员编写代码的方式。在这些增强功能中,字符串操作和连接方面的改进尤其值得注意。通过引入 StringJoiner、String.join() 和 Collectors.joining(),Java 8 使开发人员能够创建高效且优雅的解决方案...
阅读 4 分钟
在本节中,我们将学习如何使用 Java Throwable 类的不同方法在 Java 中打印异常消息。Throwable 类提供了以下三种打印异常消息的方法:使用 printStackTrace 方法使用 getMessage() 方法使用 toString() 方法让我们一一讨论...
阅读 3 分钟
在 Java 编程中,我们在开发应用程序时经常需要生成随机数。许多应用程序都具有生成随机数的功能,例如验证用户,许多应用程序使用 OTP。随机数的最佳示例是骰子。因为当我们掷...
阅读 6 分钟
Java 8 引入了用于处理对象集合的功能。流只不过是对象序列,它支持可以通过管道连接以产生所需结果的各种方法。在进一步讨论此主题之前,建议...
阅读 8 分钟
在本节中,我们将讨论 Java 中的方法隐藏是什么、方法隐藏因素 (MHF) 以及方法隐藏和方法重写的区别。此外,还将实现 Java 程序中的方法隐藏概念。要理解 Java 中的方法隐藏概念,首先我们将理解...
阅读 3 分钟
Java 中的适配器设计模式是一种使两个具有不同接口的对象协同工作的方式。有时,我们希望使用某些对象,但它们的接口不兼容。在这种情况下,我们可以使用适配器模式。适配器模式充当...
阅读 4 分钟
给定一个包含 n 个数字(正数或负数)的数组 arr。任务是返回重新排列整数元素的数组,使得没有两个相邻元素相等。如果有多个有效排列,则返回任何一个...
阅读 15 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India