首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 冲浪宝典-> 局域网
Java串行端口技术协议-JSP教程,Java技巧及代码
作者:网友供稿 点击:1241
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
了解串行通讯

  串行通讯协议有很多种,像rs232,rs485,rs422,甚至现今流行的usb等都是串行通讯协议。而串行通讯技术的应用无处不在。可能大家见的最多就是电脑的串口与modem的通讯。记得在pc机刚开始在中国流行起来时(大约是在90年代前五年),那时甚至有人用一条串行线进行两台电脑之间的数据共享。除了这些,手机,pda,usb鼠标、键盘等等都是以串行通讯的方式与电脑连接。而笔者工作性质的关系,所接触到的就更多了,像多串口卡,各种种类的具有串口通讯接口的检测与测量仪器,串口通讯的网络设备等。

  虽然串行通讯有很多种,但笔者所知的在整个电子通讯产品方面,以rs232的通讯方式最为多见。虽然usb接口的电子产品也是层出不穷,但了解一下java在串行通讯方面的技术还有有必要的,说不定有哪位读者还想用此技术写一个pda与电脑之间数据共享的程序呢。

  本文主要以rs232为主来讲解java的串行通讯技术。

  rs232通讯基础

  rs-232-c(又称eia rs-232-c,以下简称rs232)是在1970年由美国电子工业协会(eia)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。rs232是一个全双工的通讯协议,它可以同时进行数据接收和发送的工作。rs232的端口通常有两种:9针(db9)和25针(db25)。

  db9和db25的常用针脚定义



图1

  常见的边线方式

  常见的通讯方式是三线式,这种方式是将两个rs232设备的发送端(txd)和接收端(rxd)及接地端(gnd)互相连接,也是许多读者所知道的连接方式:



图2

  这种方式分别将两端的rs232接口的2--3,3---2,5(7)---5(7)针脚连接起来。其中2是数据接收线(rxd),3是数据发送线(txd),5(7)是接地(rnd)。如果有一台式pc,和一部notebook电脑,就可以用这种方式连线了。用三线式可以将大多数的rs232设备连接起来。但如果你认死了2--3,3--2,5(7)--5(7)对接这个理,会发现在连某些rs232设备时并不奏效。这是因为有些设备在电路内部已将2和3线调换过来了,你只要2,3,5(7)针一一对应就行了。

  小技巧:如何辨别txd和rxd端口?

  搞电子的人手边应该常备一个电表,用来测测电压,电阻什么的会很有用。你只要分别测一下rs232端口的2--5或3--5针脚之间的电压,通常txd针脚与gnd之间会有3~15v左右的负电压,表示它是txd针脚。


  安装java communications api

  sun的j2se中并没有直接提供以上提到的任何一种串行通讯协议的开发包,而是以独立的jar包形式发布在java.sun.com网站上(从这里下载)----即comm.jar,称之为javatm communications api,它是j2se的标准扩展。comm.jar并不是最近才有,早在1998年时,sun就已经发布了这个开发包。comm.jar分别提供了对常用的rs232串行端口和ieee1284并行端口通讯的支持。目前sun发布的comm.jar只有windows和solaris平台两个版本,如果你需要linux平台下的,可以在http://www.geeksville.com/~kevinh/linuxcomm.html找到。

  在使用comm.jar之前,必须知道如何安装它。这也是困扰许多初学java rs232通讯者的一个难题。如果我们电脑上安装了jdk,它将同时为我们安装一份jre(java runtime entironment),通常我们运行程序时都是以jre来运行的。所以以下的安装适用于jre。如果你是用jdk来运行程序的,请将相应的改成。

  下载了comm.jar开发包后,与之一起的还有两个重要的文件,win32com.dll和javax.comm.properties。comm.jar提供了通讯用的java api,而win32com.dll提供了供comm.jar调用的本地驱动接口。而javax.comm.properties是这个驱动的类配置文件。首先将comm.jar复制到\lib\ext目录。再将win21com.dll复制到你的rs232应用程序运行的目录,即user.dir。然后将javax.comm.properties复制到\lib目录。

  通讯前的准备

  如果你手头上没有现成的提供了标准rs232串口的设备,你可以将自己的电脑模拟成两台不同的串口设备。通常电脑主机后面的面板提供了两个9针的串口,请将这两个串口的2,3,5脚按前面介绍的方法连接。电子市场都有现成的连接头卖,请不要买那种封装的严严实实的接头,而要买用螺丝封装可以拆开的连接头,这样可以方便自己根据需要连接各个针脚。

  comm api基础

  我无意于在此详细描述comm api每个类和接口的用法,但我会介绍comm api的类结构和几个重要的api用法。

  所有的comm api位于javax.comm包下面。从comm api的javadoc来看,它介绍给我们的只有区区以下13个类或接口:

  javax.comm.commdriver

  javax.comm.commport

  javax.comm.parallelport

  javax.comm.serialport

  javax.comm.commportidentifier

  javax.comm.commportownershiplistener

  javax.comm.parallelportevent

  javax.comm.serialportevent

  javax.comm.parallelporteventlistener (extends java.util.eventlistener)

  javax.comm.serialporteventlistener (extends java.util.eventlistener)

  javax.comm.nosuchportexception

  javax.comm.portinuseexception

  javax.comm.unsupportedcommoperationexception


  下面讲解一下几个主要类或接口。

  1.枚举出系统所有的rs232端口

  在开始使用rs232端口通讯之前,我们想知道系统有哪些端口是可用的,以下代码列出系统中所有可用的rs232端口:

  enumeration en = commportidentifier.getportidentifiers();

  commportidentifier portid;

  while (en.hasmoreelements())

  {

  portid = (commportidentifier) en.nextelement();

  /*如果端口类型是串口,则打印出其端口信息*/

  if (portid.getporttype() == commportidentifier.port_serial)

  {

  system.out.println(portid.getname());

  }

  }

  在我的电脑上以上程序输出以下结果:

  com1

  com2

  commportidentifier类的getportidentifiers方法可以找到系统所有的串口,每个串口对应一个commportidentifier类的实例。

  2.打开端口

  如果你使用端口,必须先打开它。

  try{

  commport serialport = portid.open("my app", 60);

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

  inputstream input = serialport.getinputstream();

  input.read(...);

  /*往端口中写数据*/

  outputstream output = serialport.getoutputstream();

  output.write(...)

  ...

  }catch(portinuseexception ex)

  { ... }

  通过commportidentifier的open方法可以返回一个commport对象。open方法有两个参数,第一个是string,通常设置为你的应用程序的名字。第二个参数是时间,即开启端口超时的毫秒数。当端口被另外的应用程序占用时,将抛出portinuseexception异常。

  在这里commportidentifier类和commport类有什么区别呢?其实它们两者是一一对应的关系。commportidentifier主要负责端口的初始化和开启,以及管理它们的占有权。而commport则是跟实际的输入和输出功能有关的。通过commport的getinputstream()可以取得端口的输入流,它是java.io.inputstream接口的一个实例。我们可以用标准的inputstream的操作接口来读取流中的数据,就像通过fileinputsteam读取文件的内容一样。相应的,commport的getoutputstream可以获得端口的输出流,这样就可以往串口输出数据了。

  3.关闭端口

  使用完的端口,必须记得将其关闭,这样可以让其它的程序有机会使用它,不然其它程序使用该端口时可能会抛出端口正在使用中的错误。很奇怪的是,commportidentifier类只提供了开启端口的方法,而要关闭端口,则要调用commport类的close()方法。


  通讯方式

  commport的输入流的读取方式与文件的输入流有些不一样,那就是你可能永远不知这个inputstream何时结束,除非对方的outputstream向你发送了一个特定数据表示发送结束,你收到这个特定字符后,再行关闭你的inputstream。而comm.jar提供了两种灵活的方式让你读取数据。

  1.轮询方式(polling)

  举个例子,你同gf相约一起出门去看电影,但你的gf好打扮,这一打扮可能就是半小时甚至一小时以上。这时你就耐不住了,每两分钟就催问一次“好了没?”,如此这样,直到你的gf说ok了才算完。这个就叫轮询(polling)。

  在程序中,轮询通常设计成一个封闭的循环,当满足某个条件时即结束循环。刚才那个例子中,你的gf说“ok了!”,这个就是结束你轮询的条件。在单线程的程序中,当循环一直执行某项任务而又无法预知它何时结束时,此时你的程序看起来可能就像死机一样。在vb程序中,这个问题可以用在循环结构中插入一个doevent语句来解决。而java中,最好的方式是使用线程,就像以下代码片断一样。

  public testport extend thread

  {

  ...

  inputstream input = serialport.getinputstream();

  stringbuffer buf = new stringbuffer();

  boolean stopped = false;

  ...

  public void run()

  {

  try {

  while( !stopped )

  int ch = input.read();

  if ( ch==q || ch==q )

  {

  /*结束读取,关闭端口...*/

  stopped = true;

  ...

  }

  else

  {

  buf.append((char)ch);

  ...

  }

  }catch (interruptedexception e) { }

  }

  }

  2.监听方式(listening)

  comm api支持标准的java bean型的事件模型。也就是说,你可以使用类似addxxxlistener这样的方法为一个串口注册自己的监听器,以监听方式进行数据读取。

  如要对端口监听,你必须先取得commportidentifier类的一个实例,

  commport serialport = portid.open("my app", 60);

  从而取得serialport,再调用它的addeventlistener方法为它添加监听器,

  serialport.addeventlistener(new myportlistener());

  serialport的监听器必须继承于serialporteventlistener接口。当有任何serialport的事件发生时,将自动调用监听器中的serialevent方法。serial event有以下几种类型:

  bi -通讯中断.

  cd -载波检测.

  cts -清除发送.

  data_available -有数据到达.

  dsr -数据设备准备好.

  fe -帧错误.

  oe -溢位错误.

  output_buffer_empty -输出缓冲区已清空.

  pe -奇偶校验错.

  ri - 振铃指示.

   

  下面是一个监听器的示例:

  public void myportlistener implements serialporteventlistener

  {

   public void serialevent(serialportevent evt)

   {

  switch (evt.geteventtype())

  {

   case serialportevent.cts :

    system.out.println("cts event occured.");

    break;

   case serialportevent.cd :

    system.out.println("cd event occured.");

    break;

   case serialportevent.bi :

    system.out.println("bi event occured.");

    break;

   case serialportevent.dsr :

    system.out.println("dsr event occured.");

    break;

   case serialportevent.fe :

    system.out.println("fe event occured.");

    break;

   case serialportevent.oe :

    system.out.println("oe event occured.");

    break;

   case serialportevent.pe :

    system.out.println("pe event occured.");

    break;

   case serialportevent.ri :

    system.out.println("ri event occured.");

    break;

   case serialportevent.output_buffer_empty :

    system.out.println("output_buffer_empty event occured.");

    break;

   case serialportevent.data_available :

    system.out.println("data_available event occured.");

    int ch;

    stringbuffer buf = new stringbuffer();

    inputstream input = serialport.getinputstream

    try {

     while ( (ch=input.read()) > 0) {

      buf.append((char)ch);

     }

     system.out.print(buf);

    } catch (ioexception e) {}

    break;

   }

  }

  这个监听器只是简单打印每个发生的事件名称。而对于大多数应用程序来说,通常关心是data_available事件,当数据从外部设备传送到端口上来时将触发此事件。此时就可以使用前面提到过的方法,serialport.getinputstream()来从inputstream中读取数据了。



文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·Java串行端口技术协议-JSP教程,Java技巧及代码
·VB6中水晶报表(Crystal Report 4.6)的使用经验-.NET教程,报表/图形/Office
·一种全新的软件界面设计方法(摘)-.NET教程,Asp.Net开发
·RSA加密算法在VB中的实现-.NET教程,VB.Net语言
·ubb代码转化html代码-ASP教程,脚本编码
·用C#创建可拖动窗体-.NET教程,C#语言
·ASP技术访问WEB数据库-ASP教程,数据库相关
·浅谈基站蓄电池的维护与保养
·VB中枚举指定目录下所有文件的方法-.NET教程,评论及其它
·ADO.NET 2.0 Dataset和Datatable 新功能新特性-.NET教程,Asp.Net开发
最新文章
·解决局域网遭遇盗用mac地址上网的问题_局域网教程
·photoshop将照片处理为艺术插画特效_photoshop教程
·狂人!用日ip不到500的站一年赚了10万元_网赚技巧
·李治国:急躁公司做不了分类信息_站长访谈
·李彦宏教你创业实用的七大招_站长心得
·新站如何被百度快速的收录_站长心得
·影响搜索排名的77种因素_站长心得
·网站站长把你懂的东西卖给不懂的人,才能赚钱_站长心得
·个人站点提高访问量谋略1_站长心得
·做adsense的一些经验_google推广
相关主题
西部数码虚拟主机

友情链接
CNNIC 西部数码
万网 自助建站
虚拟主机 asp空间
域名注册 域名
域名申请 主页空间
论坛空间 网站空间
国际域名 虚拟空间
空间租用 DDOS防火墙
成都主机托管 四川主机托管
主机租用 服务器租用
网站目录 自助建站
虚拟主机 网址大全
软件下载
自助链接
虚拟主机资讯 特价虚拟主机
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
发表评论 打印  刷新     关闭