[转]关于java使用javacomm20-win32实践总结

系统 1399 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没有放到正确的位置。
 如果有什么不正确的地方,欢迎批评指正,谢谢!

[转]关于java使用javacomm20-win32实践总结


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论