追随Java
简单的事情重复做,就会产生累积效应!
posts - 260,  comments - 338,  trackbacks - 0
                                 关于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)
                           System.loadLibrary("win32com"); 
                              javax.comm.CommDriver driver 
= null
                              String driverName 
= "com.sun.comm.Win32Driver"
                              SerialPort sPort 
= (SerialPort) driver.getCommPort("COM4", CommPortIdentifier.PORT_SERIAL); 
                  2)
                       CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM4"); 
                           SerialPort sPort 
= (SerialPort)portId.open("shipment",1000);

             以上两种方法都可以。不过一般都会采用第二种。方法说明我们获取了对串行端口(COM4),可以和它进行通讯了。 
              b. 设置串行端口通讯参数。
sPort.setSerialPortParams(2400,SerialPort.DATABITS_8,SerialPort.STOPBITS_2,SerialPort.PARITY_NONE); 

               c. 获取输入(出)流。 
                  
            InputStream is = sPort.getInputStream();//从外设获取数据 
               OutputStream os = sPort.getOutputStream();
//发送命令到外设
               d.通过监听器就可以得到数据了。
                  
 1//Set notifyOnDataAvailable to true to allow event driven input.
 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没有放到正确的位置。
 如果有什么不正确的地方,欢迎批评指正,谢谢!
posted on 2007-03-23 09:48 Harryson 阅读(5692) 评论(4)  编辑  收藏 所属分类: Jni--CommunicationJ2SE

FeedBack:
# re: 关于java使用javacomm20-win32实践总结
2007-03-23 12:18 | turbochen
没什么可补充的,有兴趣可以参考一下我2004年写的文章:
http://blog.csdn.net/turbochen/archive/2004/05/07/8105.aspx
关于win32com.dll可以就放在你的应用程序(.jar)所在的目录。不用拔山涉水的放到java.home/bin下,破坏原目录的内容。  回复  更多评论
  
# re: 关于java使用javacomm20-win32实践总结
2007-03-23 17:15 | Christ Chang
原来那篇文章是你写的,严重顶一下!!  回复  更多评论
  
# re: 关于java使用javacomm20-win32实践总结
2007-09-21 00:16 | dxr
顶一下!!!
不过我没有javax.comm类库,从网上也下载不了,能给我传一个吗?
我的邮箱是dxianr@163.com 先谢了!  回复  更多评论
  
# re: 关于java使用javacomm20-win32实践总结
2013-01-31 12:28 | lsc
javax.comm.CommDriver driver = null; diver没有初始化吧?  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 

<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(10)

随笔分类(319)

AJAX

Coffee House

CSS

Java

JavaScript

Open Source

ProjectManagement

友情Blog

最新随笔

最新评论

阅读排行榜

评论排行榜