关于java使用javacomm20-win32实践总结
由于这几天要通过java调用通过串口或并口连接的硬件资源,所以我就要用到和底层的硬件进行通讯。通过RS-232的通讯协议,了解电脑和外设是怎样进行通讯的。在应用中我们也可以通过JNI来实现(详情请见http://www.blogjava.net/hgq0011/archive/2005/09/21/13637.html),这样的话,就必须知道更多的知识。由于
java已经提供我们一个javacomm20-win32通用的API我们还是实行 “拿来主义”
吧。我就把整个应用的过程详细的说一下,希望给需要的人一点帮助。
我们经过串口和外设通讯,下面我就以
串口为例进行解说
。
1)我们要准备相应的设备。
电脑,外设,通过数据线把他们连接起来。
2)检验外设到底是用的那个COM口和电脑通讯的。
也就是说,他们有没有真确的连接上。我们可以通过下载串口通讯口测试软件,我用的是
"SuperCommTool.exe"的绿色软件,进行测试的
。这软件很适应,如果选中的某个COM已经被使用了,它会给你一个相应的提示(端口以被占用)。如果你不知道到底是使用的那个端口,那么你可以通过superCommTool软件一个一个的试,如果正常的话,那么你可以看到有数据显示在数据接收窗口。也许,有些主板的串口坏了,那么你就要买一个转接卡,通过PCI插口转接。
3)察看外设使用说明书知道外设的相关参数。
比如,波特率,数据位,停止位,校验位,等等。只有正确参数,才能显示正确的数据。当然,你可以在通讯测试软件上调试这些参数的。比如:波特率 = 2400,数据位 = 8,停止位 = 2 ,校验位 = 1。
4)准备开发环境。
最基本的JDK了,你可以使用自己钟爱的IDE,帮助你开发。IDE可能自带了JDK,那么 你要把相应的javaComm20-win32放到运行时使用的JDK中。 下载JAVAcomm20-win32。
5)了解javaComm20-win32。
你必须把win32com.dll复制到java.home/bin下;把javax.comm.properties 复制到java.home/lib下;把comm.jar添加到你classPath下。
前面两个都是非常重要的
。
下面说明用到的几个类:
javax.comm.CommPortIdentifier
通讯端口管理器,CommPortIdentifier是控制访问到通讯端口的中 心类。
它包括的方法有:
a. 通过驱动决定通讯端口是可用的。
b. 打开通讯端口为了I/O操作。
c. 决定端口的拥有者。
d. 解析端口拥有者的争夺。
e. 管理事件显示在端口拥有者的中的状态改变。
一个应用程序首先使用CommPortIdentifier中的方法,通过相关的驱动去获取那些通讯端口是可用的 并且选择一个端口便于开始。然后它使用方法在其它类中想CommPort,ParallelPort和SerialPort通过 这个端口进行通讯。
javax.comm.SerialPort
一个RS-232串口通讯端口。SerialPort 描述底层的接口到一个串口通讯端口 变得有效的通过底层的系统。SerialPort定义最小的必需的功能便于串口通讯端口。
javax.comm.SerialPortEventListener
串行端口事件传播。
javax.comm.CommDriver
6)代码的编写。
a. 获取SerialPort sPort对象的两种方法。
1)
javax.comm.CommDriver driver = null ;
String driverName = " com.sun.comm.Win32Driver " ;
SerialPort sPort = (SerialPort) driver.getCommPort( " COM4 " , CommPortIdentifier.PORT_SERIAL);
2)
SerialPort sPort = (SerialPort)portId.open( " shipment " , 1000 );
以上两种方法都可以。不过一般都会采用第二种。方法说明我们获取了对串行端口(COM4),可以和它进行通讯了。
b. 设置串行端口通讯参数。
c. 获取输入(出)流。
OutputStream os = sPort.getOutputStream() ; // 发送命令到外设
d.通过监听器就可以得到数据了。
2 sPort.notifyOnDataAvailable( true );
3
4 // Set notifyOnBreakInterrup to allow event driven break handling.
5 sPort.notifyOnBreakInterrupt( true );
6
7 // Set receive timeout to allow breaking out of polling loop during input handling.
8 sPort.enableReceiveTimeout( 30 );
9 StringBuffer linkWgt = new StringBuffer(); // 存放获取的数据
10 sPort.addEventListener(
11 new SerialPortEventListener() {
12 public void serialEvent(SerialPortEvent e) {
13 int newData = 0 ;
14 // Determine type of event.
15 switch (e.getEventType()) {
16 // Read data until -1 is returned. If \r is received substitute
17 // \n for correct newline handling.
18 case SerialPortEvent.DATA_AVAILABLE:
19 while (newData != - 1 ) {
20 try {
21 newData = is.read();
22 if (newData == - 1 ) {
23 break ;
24 }
25 if ( ' \r ' == ( char )newData) {
26 } else {
27 linkWgt.append(( char )newData);
28 }
29 } catch (IOException ex) {
30 System.err.println(ex);
31 return ;
32 }
33 }
34
35 // Append received data to messageAreaIn.
36
37 try {
38 System.out.println( " linkWgt ---------||||| " + Double.valueOf(linkWgt.toString()));
39
40 } catch (Exception ew) {
41 ew.printStackTrace();
42 } finally {
43 try {
44 // 用完了,记得关闭端口。
45 is.close();
46 sPort.close();
47 } catch (Exception c) {
48 c.printStackTrace();
49 }
50 }
51 break ;
52 // If break event append BREAK RECEIVED message.
53 case SerialPortEvent.BI:
54 System.out.println( " \n--- BREAK RECEIVED ---\n " );
55 }
56 }
57
58 }
59 );
7)常见的异常
a. javax.comm.NoSuchPortException 这个说明你的javax.comm.properties没有放到正确的位置。
如果有什么不正确的地方,欢迎批评指正,谢谢!