由于java的平台无关特性使得串口编程很困难。因为串口需要一个与特定平台实现的标准的API,而这对于java来说很困难。
不幸的是,Sun在java的串口通信上没有太多关注。Sun已经定义了一个叫做JavaComm的串口通信API,但它的实现却不是java SE(标准版)的一部分。Sun只为少数java平台提供了一个参考实现。特别是在2005年后Sun悄悄地退出了对Windows平台的JavaComm支持。那些被漏掉的平台可以使用第三方实现。除了Sun实施过的几次小的维护外,JavaComm几乎没有被维护过,但那也只是Sun为了应付购买他们Sun Ray瘦客户端和在此平台采用JavaComm而放弃Windows支持的用户所施加的压力。
在这种情况下,而且在Sun起初没有为Linux提供JavaComm实现的现实下(从2006开始才有的),导致了免费软件RxTx库的开发。RxTx支持许多平台而不仅仅是Linux。它可以与JavaComm结合起来使用(RxTx提供了特定硬件驱动),也可以独立使用。当作为JavaComm的驱动时,通过JCL(JavaComm for Linux)将JavaComm与RxTx桥接起来。JCL是RxTx发布的一部分。
Sun对JavaComm的忽视和JavaComm的特殊的编程模型为JavaComm赢得了不实用的坏名声。而RxTx-如果不作为JavaComm的驱动-提供了丰富的接口,但却不是标准化的。RxTx比已存在的JavaComm实现支持更多的平台。最近,RxTx经过修改已经提供了和JavaComm相同的接口,只是包名与Sun的包名不同。
所以,应用程序到底应该使用哪个库呢?如果需要较大的移植性,JavaComm是较好的选择。如果某一特定平台没有JavaComm实现但有RxTx实现的话,RxTx可以作为JavaComm的驱动使用。所以,通过使用JavaComm,一个应用可以通过Sun提供的参考实现或与JCL结合的Rxtx实现来支持所有平台。这样应用程序可以工作在一个接口上而不需要改动,即标准的JavaComm接口。
本文讨论了JavaComm 和 RxTx。 它主要演示了概念而不是准备运行的代码。那些只想拷贝代码的人可以参考与这些包在一起的示例代码。那些想知道他们在干什么的人在这篇文件章中可能会找到一些有用的信息。
jSSC (Java 简单串口接口)也会被提及。
了解串口通信和编程的基础.
准备好你想与之通信的设备的文档(例如调制解调器)
搭建好所有硬件和测试环境
使用一个终端程序来手动地与设备通信。这用来确保测试环境搭建已正确搭建,并保证你已经理解了与该设备交互的命令和响应。
下载你想使用的与你的操作系统相符的API实现
阅读
JavaComm 和/或 RxTx安装说明(并按照它说的去做)
API文档
示例代码片段
JavaComm 和 RxTX 安装时有一些与众不同的地方。强烈建议按照安装说明一点点的安装。如果安装说明要求一个jar文件或一个共享库必须在某一特定的文件夹下,那这就意味着需要严肃对待。如果说明要求一个特定的文件或设备需要拥有一个特定的所有权或访问权,这也意味着需要严肃处理。很多安装问题都只是因为没有按照安装说明要求的去做而引起的。
特别要注意的是一些版本的JavaComm会带有两个安装说明。一个用于java 1.2及以后的版本,一个用于java 1.1版本。使用错误的安装说明会导致不能工作的安装结果。另一方面,TxTx的一些版本/构件/包会包含不完全的说明。在这种情况下需要获得相关的RxTx发布的源码,它包含了完整的安装说明。
另外要注意Windows的Jdk安装程序会包含三个java虚拟机,因此会有三个扩展文件夹。
一个作为JDK的组成部分。
一个作为与运行JDK工具的JDK一起的私有JRE的一部分。
一个作为与运行应用程序的JDK一起的公共JRE的一部分。
更有甚者甚至会有第4个jre,它存在于Windows的目录结构中。 JavaComm应该作为扩展被安装到JDK和所有公共JRE中。
JavaComm
关于JavaComm和RxTx的一个常见问题是它们不支持通过Java WebStart进行安装:JavaComm的臭名昭著是因为需要将一个称为javax.comm.properties的文件放到JDK lib目录下,而这是不能通过Java WebStart完成的。很令人沮丧的是,对于该文件的需要是JavaComm中一些不必要的设计/决定所导致的恶果,而JavaComm的设计者们可以很容易地避免这种事情。Sun固执地拒绝修正这个错误,他们强调这个机制是必不可少的。他们是在睁着眼说瞎话,特别是当提及JavaComm时,因为Java在很长一段时间内拥有一个专门用于此类意图的服务提供者架构。
这个属性文件中的内容只有一行,即提供本地驱动的java类名称。
driver=com.sun.comm.Win32Driver
以下是一个可以通过Web Start部署JavaComm而无视那个伤脑筋的属性文件的技巧。但它有严重的缺陷,并且在部署较新的JavaComm时可能会失败-如果Sun会做一个新版本的话。
首先,关闭安全管理器(security manager)。Sun的一些蠢货程序员觉得一遍又一遍地检查可怕的javax.comm.properties文件的存在是很酷的事情,特别是当它最初已经被加载完成之后。这只是单纯地检查文件是否存在而不为其他原因。
System.setSecurityManager(null);
然后,当初始化JavaComm API时,手动初始化驱动。
String driverName = "com.sun.comm.Win32Driver"; // or get as a JNLP property CommDriver commDriver = (CommDriver)Class.forName(driverName).newInstance(); commDriver.initialize();
RxTx在某些平台上需要改变串口设备的所有权和访问权。这也是无法通过WebStart完成的事。
在程序启动时你应该要求用户作为超级用户来执行必要的设置。特别的,RxTx有一个模式匹配算法来验证“合法”的串口设备名。当某人想使用不标准的设备,例如USB转串口转换器(USB-to-serial converter)时,这常会把事情弄砸。这个机制可以被系统属性屏蔽掉。详情参照RxTx的安装说明。
Java官方串口通信API是JavaComm API。这个API不是Java 2标准版的组成部分,因而此API的实现需要单独下载。不幸的是,JavaComm没有获得Sun足够的重视,实际的维护时间也不是很长。Sun只是偶尔修复一些不重要的bug,却没有做过一些早已过期的重要检修。
其它翻译版本 (1) 加载中本节阐述JavaComm API的基本操作。所提供的源码保持简化以展示重点,在实际应用中使用需要完善。
这章的源码并不是唯一可用的示例代码。很多例子中都包含JavaComm下载。这些例子几乎包括比其API文档更多的关于如何使用它的信息。不幸的是,Sun公司没有任何真正的教程或一些说明文档。因此,要理解这个API的机制,学习这些示例代码是值得的,也仍需要学习这个API文档。但最好的方法是,学习这些例子并运用它们。由于缺少易用的应用以及理解这些API的编程模型有困难,API通常备受抨击。相比其名气和功能,这个API更好,但仅此而已。
该API采用回调机制通知程序员有新数据到来。这也是学习这一机制的好主意,而不是依赖询问端口。不像Java中的其他回调接口(如:在图形界面),这个接口只允许一个监听器监听事件。如果多个监听器请求监听几个事件,主监听器必须通过分派信息给其他二级监听器的方式来实现。
下载与安装
下载
Sun公司的JavaComm网页指向下载地址。在这个地址下,Sun当前(2007年)提供了支持Solaris/SPARC、Solaris/x86已经Linux x86的JavaComm 3.0版本。下载需要注册一个Sun公司的账户。下载页提供了注册页的链接。注册的目的并不清楚。在为注册时,用户可下载JDK和JREs,但对于这几乎微不足道的JavaComm,Sun公司在软件分销和出口方面却援引法律条文和政府限制。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务