当前位置:文档之家 > 基于Java的串口通信_李良

基于Java的串口通信_李良

第30卷 第2期

2007年4月

电子器件

Ch in es e Jo u rnal Of Electro n Devi ces

Vol.30 No.2Apr.2007

Java -Based Implementation on Serial Communication

L I L iang ,ZH U Shan -an

(C olle ge of E le ctr ical En gineering ,Zhej ian g Univ e rsity ,H ang zh ou 310027,China)

Abstract:To implement free communication betw een computer and peripheral data source equipment,the energy consumption monitoring system uses serial communication as the communication method,w hile Java has its special advantage in developing this system.The system receives and sends data in Java through RS -232COM port w ith comm.jar package and implements serial communication with the equipments based on RS -485Bus.The applica -tion of the theory of multithread on serial communication enables the implementation of different tasks at the same time and improves utilization of resource and performance of overall system.

Key words:serial communicatio n;java;RS -485bus;comm.Jar package;multithread

EEACC :6210L

基于Java 的串口通信

李 良,朱善安

(浙江大学电气工程学院,杭州310027)

基于Java的串口通信_李良

收稿日期:2006-04-26

作者简介:李 良(1982-),女,硕士研究生,研究方向为远程设备以及网络实验室的状态监控,my_narcissus@y http://www.doczj.com/doc/f2bbf2f2998fcc22bcd10db4.html.

摘 要:为实现计算机与外围数据源设备的自由通信,能耗监控系统采用了串口通信的方式,而Java 对开发该系统具有其独

特的优势.系统在Java 程序中使用comm.jar 开发包通过RS -232串口收发数据,并与基于RS -485总线的设备进行数据通信.多线程技术在串口通讯中的运用,使得应用程序能同时执行不同的任务,提高了资源的利用率和系统的整体性能.

关键词:串口通信;Jav a;R S -485总线;co mm.Jar 开发包;多线程中图分类号:TP311

文献标识码:A 文章编号:1005-9490(2007)02-0714-03

本文介绍的是为设备能耗等进行实时监控的系统.该控制系统通过串行通信口与电能表的数据交换与处理,实现对用电设备的监控.杭州西子仪表公司的三相四线电能表,可选配RS -485通信接口方便地实现与服务器的通信.Java 程序语言具有面向对象、平台无关、多线程、安全等特性,是一种跨平台、适合于分布式计算环境的面向对象的编程语言.因此,用Jav a 程序语言实现串口通信具有很强的实用意义.

1 系统的结构

该监控系统的物理拓扑结构为B/S/C 模式,如图1所示,即客户端(或者浏览器)+服务器+控制端模式.用户可在任何时间地点联入Internet,通过Web 浏览器访问系统,连接服务器对各设备进行远

程地监控维护.

图1 系统的物理拓扑结构

1.1 客户端

客户端通过Web 浏览器下载一种能嵌在网页

中运行的Jav a 小应用程序[1]Applet 与服务器通讯.客户端的基本功能包括:显示图形用户界面

(GU I)、连接服务器端、发送设置参数或者指令及显示数据和结果等.

1.2 服务器端

服务器端采用SQL server 2000数据库,连接客户端和控制端,记录各项数据.

1.3 控制端

控制端采用简单、成熟且稳定的485总线,对传感器)))三相四线制电能表的数据进行采集,并上传到服务器的数据库上.

2 串行通信接口

系统控制端的电能表支持RS -485总线协议,而工控机上的COM 口为RS -232串行通信端口[2]

.为使数据侦听能够进行,工控机需要通过232转485模块将232信号转换成485信号发出.服务器和仪表之间的硬件连接如图2所示

基于Java的串口通信_李良

.

图2 R S -485总线连接

2.1 RS -232

RS -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 开发包

基于Java的串口通信_李良

Sun 的J2SE 中没有直接提供串行通讯协议的

开发包,而是以独立的jar 包形式发布在http://www.doczj.com/doc/f2bbf2f2998fcc22bcd10db4.html 网站上)))即co mm.jar,称之为Java (tm )Com munications API,它是J2SE 的标准扩展.

Com m.jar 提供了对RS -232串行端口通讯的支持,Jav a 通过该类库能够极大地简化对串口的操作过程.与co mm.jar 开发包一起的还有两个重要的文件,w in32com.dll 和http://www.doczj.com/doc/f2bbf2f2998fcc22bcd10db4.htmlm.jar 提供了通讯用的java A PI,w in32co m.dll 提供了供comm.jar 调用的本地驱动接口,http://www.doczj.com/doc/f2bbf2f2998fcc22bcd10db4.htmlm.pr operties 是这个驱动的类配置文件[3]

.

Jav a 读写串口过程主要是调用http://www.doczj.com/doc/f2bbf2f2998fcc22bcd10db4.htmlm 包中的co mm API 函数.在Jav ax.co mm 包中串口的输人输出操作是数据流形式,在初始化串口波特率和数据位的同时,将输入输出流和该串口建立一个映射,串口的输入输出操作就直接反映在输入流和输出流上.通过Co mmPort 类的g etInputStream ()和g etOutputStream ()方法即可分别取得端口的输入流和输出流.

3.2 串口通讯的软件实现

串口写数据的流程图如图3所示.打开串口并对其初始化,就可以向定义的串口数据流写数据了.

图3 向串口写数据流程图

串口读写的软件实现如下所示:

/*打开串口并对其初始化的程序*/

public vo id I nit ialize(){

por tId =CommP ortI dentifier.g etPo rtIdent ifier ("COM 2");

serialP ort =(SerialP ort)port Id.open("Ser ial_Communication",2000);serialP ort.setSerialPo rtP arams(

1200,//波特率1200

SerialP or t.DA T A BIT S_8,//数据位8位SerialP or t.ST O PBIT S_1,//数据停止位1位SerialP or t.P AR IT Y_EV EN//校验位1位);

}

/*从端口中读取数据*/

InputStream input =serialPort.getInputStream();Input.read(,);

/*往端口中写数据*/

OutputStream input=serialPort.getOutputStream();O ut put.w rite(,);

4 电表通讯

4.1 电表通讯规约及原理

杭州西子仪表公司的两款电能表,支持RS -485

715

第2期李 良,朱善安:基于Jav a 的串口通信

通信接口,采用了DL/T 645-1997《多功能电能表通信规约》[4]

,通信符合国家电力行业要求

[5-6]

.

基于Java的串口通信_李良

电表通信为主-从结构的半双工通信方式.数据终端为主站,电能表为从站.每个电能表均有各自的地址编码.通信链路的建立与解除均由主站发出的信息帧来控制.每帧由帧起始符、从站地址域、控制码、数据长度、数据域、帧信息纵向校验码及帧结束符等7个域组成.每部分由若干字节组成[4].字节传输序列如图4所示,先传低位,后传高位

.

基于Java的串口通信_李良

图4 字节传输序列

帧是传送信息的基本单元,帧格式如表1所示.发送帧信息之前,先发送1~4个字节FEH ,以唤醒接受方.所有数据项均先传送低位字节,后传送高位字节.每次通信都是由主站按信息帧地址域选择的从站发出请求命令帧开始,被请求的从站根据命令帧中控制码的要求作出响应.

表1 帧格式说 明代码帧起始符

68H 地址域

A 0A 1A 2A 3A 4A 5帧起始符68H 控制码C 数据长度域L 数据域DAT A 校验码CS 结束符

16H

例如:读正相有功电量

主站帧格式:FE 6899999999999968|010243C36F 16,其中43C3是读有功的命令.从站回复形式:6850190000000068810643C3333333339216,该回复形式没有唤醒字符0xFE,下划线部分为返回的为4个字节的数据.

控制流程图如图5所示.主站先发送信息帧,写入串口,检测电表的硬件地址和读电表的命令,正确后读串口会返回有数据的帧,将数据取出连同此时的时间存入相应的数据库中.当发生地址或命令出

错,会出现读表延时返回零值.然后轮询检测下一个

电表,如此往复不断地把电表的数据送入服务器端的数据库中.

图5 控制端流程图

4.2 电表通讯的软件测试及结果

/*主站发送读有功电量的命令*/cmd[0]=0x F E;

cmd[1]=0x 68;

cmd[2]=meter_address[0];,,

cmd[7]=meter_address[5];//电表的硬件地址,,

cmd[11]=0x43;//读电表命令cmd[12]=0x C3;cmd[14]=0x16;

fo r (int k =1;k <=12;k++){check +=cmd[k];

}

cmd[13]=(char )check;//校验码/*写串口*/

o ut.wr ite(cmd[i]);

/*读串口数据*/

SB.GetData(rec_data,rec_len);

/*判断串口读出数据的起始位,终止位及校验位是否正确*/

fo r (int j =0;j

sum +=buffer[j];

}

if ((0x68==buffer[0])&&(0x16==buffer[dat a_len -1])&&(sum ==(byte)buffer[data_len -2])){,,}

如果出错或位数不够,会出现超时的结果,继而控制端界面会出现出错的对话框.

5 多线程在通信中的运用

由于Java 程序需要完成大量占用计算机时间的任务,所以通过创建线程将Java 程序中占用大量处理器时间的函数分离出来,让它们同程序的其它部分分开运行,使程序可以同时处理多项任务[7]

.在

(下转第720页)

3结束语

采用FPGA设计PCI接口的优点是自由灵活,根据需要可以只实现PCI规范的子集,而且用这种方法设计PCI接口占用的逻辑资源很少.在Q uar-tusⅡ 5.1下,用A LT ERA公司的Cyclone EP1C6Q240C8芯片编译本设计时,占用约300个LE.而-8速度的Cyclone完全能满足33MH z的要求.下载到PCI卡(主要由一片型号为EP1C6Q240C8的FPGA,以及SRAM组成)中,能被系统正确识别并分配资源.目前该设计已被用于探地雷达数据采集系统中.参考文献:

[1]李贵山,陈金鹏.PCI局部总线及其应用[M].西安:西安电子

科技大学出版社.2003.

[2]尹勇,李宇.PCI总线设备开发宝典[M].北京:北京航空航天

大学出版社.2005.

[3]PCI Local Bus Specification[S].Revision2.2.1998.

[4]PCI Compiler Us er Gu ide4.1.0[S].Altera Corp.2005.

[5]刘玮.IS A-to-PCI转接技术的研究与实现.[D]兰州:兰州大

学.2004.

[6]宋克柱,杨小军.基于FPGA的PC I接口设计[J].电子技术应

用.2001(9):74-77.

[7]孙华锦,高得远,韩冰.PCI总线目标控制器的IP设计[J].计

算机工程与应用,2002(19):22-24.

[8]曹明,陈文正.PCI总线协议的FPGA实现及驱动设计[J].计

算机应用,2003(7):15-17.

(上接第716页)

串口通信过程中,采用基于Window s多任务环境下的多线程技术,操作系统会将CPU时间划分成许多时间片段,并按一定的优先级将时间片段分配给各个线程,各线程在各自的时间片段内共享CPU.

多线程的设计包含创建线程、线程同步、终止线程3部分,其中关键是要处理好线程之间的同步问题,以解决对共享存储区的访问冲突,避免引起几个线程甚至整个系统的死锁[8].

使用线程的核心代码如下:

SB=new SerialBuffer();//建立串口的缓存

RT=new R eadSerial(SB,in);//打开一个线程,专门用来读取数据

RT.st art();//开始线程

Synchr onized(引用类型的表达式){

,,//语句块

}//同步语句

RT.st op();//停止线程

通常情况下,一个次级线程要为主线程完成某种特定类型的任务,这就隐含着表示在主线程和次级线程之间需要建立一个通信的通道.为实现这种通信任务,设立了串口操作允许标志:volatile static bo olean uart_en=true.由于两个线程使用串口,为防止数据交叉,将串口的发送和接收操作作为一个整体,采用该标志,只有当发送并接受到数据后其它对串口操作的次级线程才允许执行.

6结束语

本文讨论了用Java实现基于485总线的最小系统与工控机的串口通信,并将多线程应用于该系统,可以实现动态模块的自动加载,从而实现了系统对设备的监控和维护,具有一定的实用意义.

参考文献:

[1]Rogers Cad enhead著,淡文刚,于红梅译.循序渐进Java2教

程[M].人民邮电出版社.2003.4.

[2]Jan Axelson著,精英科技译.串行端口大全[M].中国电力出

版社.2001.

[3]http://java.s http://www.doczj.com/doc/f2bbf2f2998fcc22bcd10db4.html/products/javacomm/index.jsp[S][EB/

OL].

[4]DL/T645-1997.中华人民共和国电力行业标准多功能电能

表通信规约[S].1998.

[5]DS S72/DT S72系列电子式三相三线/四线交流有功电能表使

用说明书[S].

[6]DT SD54型电子式三相四线多功能电能表使用说明书[S].

[7]Rogers Cadenhead,Laura Lemay著,陈武,袁国忠译.21天学

通Java2[M].人民邮电出版社.2004.5.

[8]Bruce E ckel著,侯捷译.J ava编程思想[M].机械工业出版社.

2002.9.

下载Word文档免费下载:

基于Java的串口通信_李良下载

(共4页)