日期:2014-05-19  浏览次数:20780 次

如何用最简单的java程序获得 3个 可用的端口?
如何用最简单的java程序获得 3个 可用的端口?


------解决方案--------------------
在java程序中,为了实现同本地系统的硬件端口(RS-232标准串口/IEEE1284标准并口)通讯,目前有两个方法,第一个就是以前说过的,使用JNI技术自己写一个与java程序相关的dll/so文件,这个文件可以直接和本地系统通信,从而管理本地机器的端口,不过使用java程序独自实现一个比较完善的端口管理解决方案对个人而言是一个花费巨大且不实际的想法.第二个方法就是使用sun公司提供的comm包,这套API是用于开发平台独立的通讯应用程序的扩展API,但是这个包并未包含在sun的j2se包中,而是以独立jar包形式发布在java.sun.com网站上,下面仅讨论使用comm包管理本地机器端口的方法.
comm包目前有三种系统的版本,分别适用于x86和Sparc结构下的Solaris系统,以及x86下的Linux系统,x86下的windows系统,但是在sun的网站上面,仅提供了Windows和Solaris平台下的两个版本,如果需要linux下的comm包,需要从第三方网站下载,据说这个地址http://www.geeksville.com/~kevinh/linuxcomm.html可以下载(但是我费了很长时间并没有从这里下载下来,而是从CSDN下载中心找到的).
适用于不同系统平台下的comm.jar包含的本地接口文件是不一样的,windows平台的包除API外提供的文件是javax.comm.properties,win32com.dll两个文件,linux平台的包提供的是javax.comm.properties,libLinuxSerialParallel.so,libLinuxSerialParallel_g.so三个文件,其中javax.comm.properties记录了comm API的驱动名,winddow平台的是com.sun.comm.Win32Driver,linux平台的是com.sun.comm.LinuxDriver,而dll和so文件则提供了本地驱动接口.
运行java程序需要JRE来运行,在安装完jdk后会出现两套jre,一套是独立的一套包含于jdk目录内,这个要弄清楚,javax.comm.properties文件必须放到运行当前java程序的jre的lib目录下(一般放在javahome/jre/lib下即可),而so和dll文件所在的目录需要被映射到系统的path中,一般装完jdk后,javahome会被自动映射到系统path中,所以把so或dll文件放到javahome/bin目录下即可,如果so/dll文件的路径搞错,会有异常抛出,如在windows下的话错误信息如下:
1 Error loading win32com: java.lang.UnsatisfiedLinkError: no win32com in java.library.path.
同时这个错误会继而抛出javax.comm.NoSuchPortException异常,所以在发现有NoSuchPortException异常时要仔细检查,不一定是没有某一个端口才会抛出NoSuchPortException的异常.
在使用这个包之前要先检查一下是否缺少某些文件,我原先使用的一个comm.jar包里面只有javax\comm\下的各个类,而没有com\sun\comm\下的各个类,所以总是报java.lang.ClassNotFoundException: com.sun.comm.Win32Driver这个异常,刚开始是以为两个文件放错了位置,后来发现更改了几次路径,还是出这个错误,后来检查包,发现comm.jar包里面没有com\sun\comm目录,真正的Win32Driver.class是放在这个目录下的,linux平台的类是LinuxDriver.class,它负责与本地系统进行通信来管理设备.
comm.jar包的位置很自由,只要保证在java程序的classpath的映射中即可.

在window系统中,dos下有一个查看或配置本机所有端口参数的工具,可以使用mode /?命令查看此命令的帮助信息.
在linux系统中,可以使用命令cat /proc/devices来查看本机所有设备.如果是普通串口设备,设备名前缀为ttyS,第一串口为ttyS0,第二串口为ttyS1,依次类推,并口则是以lp开头,从0开始顺延名称.linux下配置端口参数的命令是minicom -s 端口名


转载自:http://hi.baidu.com/gfang/blog/item/65190d085e41b735e92488d2.html