基于Java的串口通信_李良
- 格式:pdf
- 大小:615.06 KB
- 文档页数:4
第30卷 第2期2007年4月 电子器件ChineseJournalOfElectronDevices Vol.30 No.2Apr.2007
Java-BasedImplementationonSerialCommunication
LILiang,ZHUShan-an(CollegeofElectricalEngineering,ZhejiangUniversity,Hangzhou310027,China)
Abstract:Toimplementfreecommunicationbetweencomputerandperipheraldatasourceequipment,theenergyconsumptionmonitoringsystemusesserialcommunicationasthecommunicationmethod,whileJavahasitsspecialadvantageindevelopingthissystem.ThesystemreceivesandsendsdatainJavathroughRS-232COMportwithcomm.jarpackageandimplementsserialcommunicationwiththeequipmentsbasedonRS-485Bus.Theapplica-tionofthetheoryofmultithreadonserialcommunicationenablestheimplementationofdifferenttasksatthesametimeandimprovesutilizationofresourceandperformanceofoverallsystem.Keywords:serialcommunication;java;RS-485bus;comm.Jarpackage;multithreadEEACC:6210L
基于Java的串口通信
李 良,朱善安(浙江大学电气工程学院,杭州310027)
收稿日期:2006-04-26作者简介:李 良(1982-),女,硕士研究生,研究方向为远程设备以及网络实验室的状态监控,my_narcissus@yahoo.com.cn.摘 要:为实现计算机与外围数据源设备的自由通信,能耗监控系统采用了串口通信的方式,而Java对开发该系统具有其独特的优势.系统在Java程序中使用comm.jar开发包通过RS-232串口收发数据,并与基于RS-485总线的设备进行数据通信.多线程技术在串口通讯中的运用,使得应用程序能同时执行不同的任务,提高了资源的利用率和系统的整体性能.关键词:串口通信;Java;RS-485总线;comm.Jar开发包;多线程中图分类号:TP311 文献标识码:A 文章编号:1005-9490(2007)02-0714-03
本文介绍的是为设备能耗等进行实时监控的系统.该控制系统通过串行通信口与电能表的数据交换与处理,实现对用电设备的监控.杭州西子仪表公司的三相四线电能表,可选配RS-485通信接口方便地实现与服务器的通信.Java程序语言具有面向对象、平台无关、多线程、安全等特性,是一种跨平台、适合于分布式计算环境的面向对象的编程语言.因此,用Java程序语言实现串口通信具有很强的实用意义.1 系统的结构该监控系统的物理拓扑结构为B/S/C模式,如图1所示,即客户端(或者浏览器)+服务器+控制端模式.用户可在任何时间地点联入Internet,通过Web浏览器访问系统,连接服务器对各设备进行远程地监控维护.
图1 系统的物理拓扑结构1.1 客户端客户端通过Web浏览器下载一种能嵌在网页中运行的Java小应用程序[1]Applet与服务器通讯.客户端的基本功能包括:显示图形用户界面(GUI)、连接服务器端、发送设置参数或者指令及显示数据和结果等.1.2 服务器端服务器端采用SQLserver2000数据库,连接客户端和控制端,记录各项数据.1.3 控制端控制端采用简单、成熟且稳定的485总线,对传感器)))三相四线制电能表的数据进行采集,并上传到服务器的数据库上.2 串行通信接口系统控制端的电能表支持RS-485总线协议,而工控机上的COM口为RS-232串行通信端口[2].为使数据侦听能够进行,工控机需要通过232转485模块将232信号转换成485信号发出.服务器和仪表之间的硬件连接如图2所示.
图2 RS-485总线连接2.1 RS-232RS-232是目前最常用的一种串行通讯接口,被定义为一种在低速率串行通讯中增加通讯距离的单端标准.RS-232串行通信端口是每台计算机上的常规配备,通常有COM1和COM2两个端口,最大传输距离在50m左右,在总线上只允许连接1个收发器.2.2 RS-485针对RS-232的不足,出现了一些如RS-485的新的接口标准.RS-485接口总线速度快(最大10Mbyte/s),传送距离远(90Kbyte/s下可传1200m),以差分平衡方式传输信号,具有很强的抗共模干扰能力,在总线上允许连接多达128个收发器,这样用户可以利用单一的RS-485接口方便地建立起设备网络,上述优点使其成为首选的串行接口.因为RS-485接口组成的半双工网络,一般只需二根连线,所以RS-485接口均采用屏蔽双绞线传输.3 Java与COM口的串口通讯3.1 Java与comm.jar开发包Sun的J2SE中没有直接提供串行通讯协议的开发包,而是以独立的jar包形式发布在java.sun.com网站上)))即comm.jar,称之为Java(tm)CommunicationsAPI,它是J2SE的标准扩展.Comm.jar提供了对RS-232串行端口通讯的支持,Java通过该类库能够极大地简化对串口的操作过程.与comm.jar开发包一起的还有两个重要的文件,win32com.dll和javax.comm.properties.comm.jar提供了通讯用的javaAPI,win32com.dll提供了供comm.jar调用的本地驱动接口,javax.comm.properties是这个驱动的类配置文件[3].Java读写串口过程主要是调用Javax.comm包中的commAPI函数.在Javax.comm包中串口的输人输出操作是数据流形式,在初始化串口波特率和数据位的同时,将输入输出流和该串口建立一个映射,串口的输入输出操作就直接反映在输入流和输出流上.通过CommPort类的getInputStream()和getOutputStream()方法即可分别取得端口的输入流和输出流.3.2 串口通讯的软件实现串口写数据的流程图如图3所示.打开串口并对其初始化,就可以向定义的串口数据流写数据了.
图3 向串口写数据流程图串口读写的软件实现如下所示:/*打开串口并对其初始化的程序*/publicvoidInitialize(){portId=CommPortIdentifier.getPortIdentifier("COM2");serialPort=(SerialPort)portId.open("Serial_Communication",2000);serialPort.setSerialPortParams(1200,//波特率1200SerialPort.DATABITS_8,//数据位8位SerialPort.STOPBITS_1,//数据停止位1位SerialPort.PARITY_EVEN//校验位1位);}/*从端口中读取数据*/InputStreaminput=serialPort.getInputStream();Input.read(,);/*往端口中写数据*/OutputStreaminput=serialPort.getOutputStream();Output.write(,);4 电表通讯4.1 电表通讯规约及原理杭州西子仪表公司的两款电能表,支持RS-485715第2期李 良,朱善安:基于Java的串口通信通信接口,采用了DL/T645-1997《多功能电能表通信规约》[4],通信符合国家电力行业要求[5-6].电表通信为主-从结构的半双工通信方式.数据终端为主站,电能表为从站.每个电能表均有各自的地址编码.通信链路的建立与解除均由主站发出的信息帧来控制.每帧由帧起始符、从站地址域、控制码、数据长度、数据域、帧信息纵向校验码及帧结束符等7个域组成.每部分由若干字节组成[4].字节传输序列如图4所示,先传低位,后传高位.
图4 字节传输序列帧是传送信息的基本单元,帧格式如表1所示.发送帧信息之前,先发送1~4个字节FEH,以唤醒接受方.所有数据项均先传送低位字节,后传送高位字节.每次通信都是由主站按信息帧地址域选择的从站发出请求命令帧开始,被请求的从站根据命令帧中控制码的要求作出响应.表1 帧格式说 明代码帧起始符68H
地址域A0A1A2A3A4A
5帧起始符68H控制码C数据长度域L数据域DATA校验码CS结束符16H 例如:读正相有功电量主站帧格式:FE6899999999999968|010243C36F16,其中43C3是读有功的命令.从站回复形式:6850190000000068810643C3333333339216,该回复形式没有唤醒字符0xFE,下划线部分为返回的为4个字节的数据.控制流程图如图5所示.主站先发送信息帧,写入串口,检测电表的硬件地址和读电表的命令,正确后读串口会返回有数据的帧,将数据取出连同此时的时间存入相应的数据库中.当发生地址或命令出错,会出现读表延时返回零值.然后轮询检测下一个电表,如此往复不断地把电表的数据送入服务器端的数据库中.
图5 控制端流程图4.2 电表通讯的软件测试及结果/*主站发送读有功电量的命令*/cmd[0]=0xFE;cmd[1]=0x68;cmd[2]=meter_address[0];,,cmd[7]=meter_address[5];//电表的硬件地址,,cmd[11]=0x43;//读电表命令cmd[12]=0xC3;cmd[14]=0x16;for(intk=1;k<=12;k++){check+=cmd[k];}cmd[13]=(char)check;//校验码/*写串口*/out.write(cmd[i]);/*读串口数据*/SB.GetData(rec_data,rec_len);/*判断串口读出数据的起始位,终止位及校验位是否正确*/for(intj=0;j (上接第716页)串口通信过程中,采用基于Windows多任务环境下的多线程技术,操作系统会将CPU时间划分成许多时间片段,并按一定的优先级将时间片段分配给各个线程,各线程在各自的时间片段内共享CPU.多线程的设计包含创建线程、线程同步、终止线程3部分,其中关键是要处理好线程之间的同步问题,以解决对共享存储区的访问冲突,避免引起几个线程甚至整个系统的死锁[8].使用线程的核心代码如下:SB=newSerialBuffer();//建立串口的缓存RT=newReadSerial(SB,in);//打开一个线程,专门用来读取数据RT.start();//开始线程Synchronized(引用类型的表达式){,,//语句块}//同步语句RT.stop();//停止线程通常情况下,一个次级线程要为主线程完成某种特定类型的任务,这就隐含着表示在主线程和次级线程之间需要建立一个通信的通道.为实现这种通信任务,设立了串口操作允许标志:volatilestaticbooleanuart_en=true.由于两个线程使用串口,为防止数据交叉,将串口的发送和接收操作作为一个整体,采用该标志,只有当发送并接受到数据后其它对串口操作的次级线程才允许执行.6 结束语本文讨论了用Java实现基于485总线的最小系统与工控机的串口通信,并将多线程应用于该系统,可以实现动态模块的自动加载,从而实现了系统对设备的监控和维护,具有一定的实用意义.参考文献:[1] RogersCadenhead著,淡文刚,于红梅译.循序渐进Java2教程[M].人民邮电出版社.2003.4.[2] JanAxelson著,精英科技译.串行端口大全[M].中国电力出版社.2001.[3] http://java.sun.com/products/javacomm/index.jsp[S][EB/OL].[4] DL/T645-1997.中华人民共和国电力行业标准多功能电能表通信规约[S].1998.[5] DSS72/DTS72系列电子式三相三线/四线交流有功电能表使用说明书[S].[6] DTSD54型电子式三相四线多功能电能表使用说明书[S].[7] RogersCadenhead,LauraLemay著,陈武,袁国忠译.21天学通Java2[M].人民邮电出版社.2004.5.[8] BruceEckel著,侯捷译.Java编程思想[M].机械工业出版社.2002.9.720电 子 器 件第30卷