`

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

 
阅读更多
关于java使用javacomm20-win32实践总结 由于这几天要通过java调用通过串口或并口连接的硬件资源,所以我就要用到和底层的硬件进行通讯。通过RS-232的通讯协议,了解电脑和外设是怎样进行通讯的。在应用中我们也可以通过JNI来实现(详情请见http://hgq0011.javaeye.com/blog/31508),这样的话,就必须知道更多的知识。由于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) 2)

java 代码
  1. System.loadLibrary("win32com");
  2. javax.comm.CommDriverdriver=null;
  3. StringdriverName="com.sun.comm.Win32Driver";
  4. SerialPortsPort=(SerialPort)driver.getCommPort("COM4",ommPortIdentifier.PORT_SERIAL);

java 代码
  1. CommPortIdentifierportId=CommPortIdentifier.getPortIdentifier("COM4");
  2. SerialPortsPort=(SerialPort)portId.open("shipment",1000);

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

java 代码
  1. sPort.setSerialPortParams(2400,SerialPort.DATABITS_8,SerialPort.STOPBITS_2,SerialPort.PARITY_NONE);

c. 获取输入(出)流。

java 代码
  1. InputStreamis=sPort.getInputStream();//从外设获取数据
  2. OutputStreamos=sPort.getOutputStream();//发送命令到外设

d.通过监听器就可以得到数据了。

java 代码
  1. //SetnotifyOnDataAvailabletotruetoalloweventdriveninput.
  2. sPort.notifyOnDataAvailable(true);
  3. //SetnotifyOnBreakInterruptoalloweventdrivenbreakhandling.
  4. sPort.notifyOnBreakInterrupt(true);
  5. //Setreceivetimeouttoallowbreakingoutofpollingloopduringinputhandling.
  6. sPort.enableReceiveTimeout(30);
  7. StringBufferlinkWgt=newStringBuffer();//存放获取的数据
  8. sPort.addEventListener(
  9. newSerialPortEventListener(){
  10. publicvoidserialEvent(SerialPortEvente){
  11. intnewData=0;
  12. //Determinetypeofevent.
  13. switch(e.getEventType()){
  14. //Readdatauntil-1isreturned.If/risreceivedsubstitute
  15. ///nforcorrectnewlinehandling.
  16. caseSerialPortEvent.DATA_AVAILABLE:
  17. while(newData!=-1){
  18. try{
  19. newData=is.read();
  20. if(newData==-1){
  21. break;
  22. }
  23. if('/r'==(char)newData){
  24. }else{
  25. linkWgt.append((char)newData);
  26. }
  27. }catch(IOExceptionex){
  28. System.err.println(ex);
  29. return;
  30. }
  31. }
  32. //AppendreceiveddatatomessageAreaIn.
  33. try{
  34. System.out.println("linkWgt---------|||||"+Double.valueOf(linkWgt.toString()));
  35. }catch(Exceptionew){
  36. ew.printStackTrace();
  37. }finally{
  38. try{
  39. //用完了,记得关闭端口。
  40. is.close();
  41. sPort.close();
  42. }catch(Exceptionc){
  43. c.printStackTrace();
  44. }
  45. }
  46. break;
  47. //IfbreakeventappendBREAKRECEIVEDmessage.
  48. caseSerialPortEvent.BI:
  49. System.out.println("/n---BREAKRECEIVED---/n");
  50. }
  51. }
  52. }
  53. );

7)常见的异常

a. javax.comm.NoSuchPortException这个说明你的javax.comm.properties没有放到正确的位置。

如果有什么不正确的地方,欢迎批评指正,谢谢!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics