网络通讯更自由 谈Java串行端口技术协议.doc

上传人:hw****26 文档编号:3120894 上传时间:2019-05-22 格式:DOC 页数:10 大小:70KB
下载 相关 举报
网络通讯更自由 谈Java串行端口技术协议.doc_第1页
第1页 / 共10页
网络通讯更自由 谈Java串行端口技术协议.doc_第2页
第2页 / 共10页
网络通讯更自由 谈Java串行端口技术协议.doc_第3页
第3页 / 共10页
网络通讯更自由 谈Java串行端口技术协议.doc_第4页
第4页 / 共10页
网络通讯更自由 谈Java串行端口技术协议.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

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

2、讯方式最为多见。虽然 USB 接口的电子产品也是层出不穷,但了解一下 Java 在串行通讯方面的技术还有有必要的,说不定有哪位读者还想用此技术写一个 PDA 与电脑之间数据共享的程序呢。本文主要以 RS232 为主来讲解 Java 的串行通讯技术。RS232 通讯基础RS-232-C(又称 EIA RS-232-C,以下简称 RS232)是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。RS232 是一个全双工的通讯协议,它可以同时进行数据接收和发送的工作。RS232 的端口通常有两种:9 针(DB9)和 25 针(DB

3、25)。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)对接这个理,会发现在连某些

4、 RS232 设备时并不奏效。这是因为有些设备在电路内部已将 2 和 3 线调换过来了,你只要 2,3,5(7)针一一对应就行了。小技巧:如何辨别 TXD 和 RXD 端口?搞电子的人手边应该常备一个电表,用来测测电压,电阻什么的会很有用。你只要分别测一下 RS232 端口的 2-5 或 3-5 针脚之间的电压,通常 TXD 针脚与 GND 之间会有315V 左右的负电压,表示它是 TXD 针脚。 让网络通讯更自由 谈 Java 串行端口技术协议(2) 安装 Java Communications API Sun 的 J2SE 中并没有直接提供以上提到的任何一种串行通讯协议的开发包,而是以独立

5、的 jar 包形式发布在 网站上(从这里下载)-即 comm.jar,称之为Javatm Communications API,它是 J2SE 的标准扩展。comm.jar 并不是最近才有,早在1998 年时,sun 就已经发布了这个开发包。comm.jar 分别提供了对常用的 RS232 串行端口和 IEEE1284 并行端口通讯的支持。目前 sun 发布的 comm.jar 只有 Windows 和 Solaris 平台两个版本,如果你需要 Linux 平台下的,可以在http:/ 找到。在使用 comm.jar 之前,必须知道如何安装它。这也是困扰许多初学 java RS232 通讯者

6、的一个难题。如果我们电脑上安装了 JDK,它将同时为我们安装一份JRE(Java Runtime Entironment),通常我们运行程序时都是以 JRE 来运行的。所以以下的安装适用于 JRE。如果你是用 JDK 来运行程序的,请将相应的改成。下载了 comm.jar 开发包后,与之一起的还有两个重要的文件,win32com.dll 和m.properties。comm.jar 提供了通讯用的 java API,而 win32com.dll 提供了供comm.jar 调用的本地驱动接口。而 m.properties 是这个驱动的类配置文件。首先将 comm.jar 复制到libext 目录

7、。再将 win21com.dll 复制到你的 RS232 应用程序运行的目录,即 user.dir。然后将 m.properties 复制到lib 目录。通讯前的准备如果你手头上没有现成的提供了标准 RS232 串口的设备,你可以将自己的电脑模拟成两台不同的串口设备。通常电脑主机后面的面板提供了两个 9 针的串口,请将这两个串口的 2,3,5 脚按前面介绍的方法连接。电子市场都有现成的连接头卖,请不要买那种封装的严严实实的接头,而要买用螺丝封装可以拆开的连接头,这样可以方便自己根据需要连接各个针脚。Comm API 基础我无意于在此详细描述 Comm API 每个类和接口的用法,但我会介绍 C

8、omm API 的类结构和几个重要的 API 用法。所有的 comm API 位于 m 包下面。从 Comm API 的 javadoc 来看,它介绍给我们的只有区区以下 13 个类或接口:m.CommDriver m.CommPort m.ParallelPort m.SerialPort m.CommPortIdentifier m.CommPortOwnershipLm.ParallelPortEvent m.SerialPortEvent m.ParallelPortEventListener (extends java.util.EventListener) m.SerialPort

9、EventListener (extends java.util.EventListener) m.NoSuchPortException m.PortInUseException m.UnsupportedCommOperationException 让网络通讯更自由 谈 Java 串行端口技术协议(3) 下面讲解一下几个主要类或接口。1.枚举出系统所有的 RS232 端口在开始使用 RS232 端口通讯之前,我们想知道系统有哪些端口是可用的,以下代码列出系统中所有可用的 RS232 端口:Enumeration en = CommPortIdentifier.getPortIdentifi

10、ers();CommPortIdentifier portId;while (en.hasMoreElements() portId = (CommPortIdentifier) en.nextElement();/*如果端口类型是串口,则打印出其端口信息*/if (portId.getPortType() = CommPortIdentifier.PORT_SERIAL) System.out.println(portId.getName(); 在我的电脑上以上程序输出以下结果:COM1COM2CommPortIdentifier 类的 getPortIdentifiers 方法可以找到系统

11、所有的串口,每个串口对应一个 CommPortIdentifier 类的实例。2.打开端口如果你使用端口,必须先打开它。tryCommPort serialPort = portId.open(“My App“, 60);/*从端口中读取数据*/InputStream input = serialPort.getInputStream();input.read(.); /*往端口中写数据*/OutputStream output = serialPort.getOutputStream();output.write(.).catch(PortInUseException ex) . 通过 Co

12、mmPortIdentifier 的 open 方法可以返回一个 CommPort 对象。open 方法有两个参数,第一个是 String,通常设置为你的应用程序的名字。第二个参数是时间,即开启端口超时的毫秒数。当端口被另外的应用程序占用时,将抛出PortInUseException 异常。在这里 CommPortIdentifier 类和 CommPort 类有什么区别呢?其实它们两者是一一对应的关系。CommPortIdentifier 主要负责端口的初始化和开启,以及管理它们的占有权。而 CommPort 则是跟实际的输入和输出功能有关的。通过 CommPort 的getInputStr

13、eam()可以取得端口的输入流,它是 java.io.InputStream 接口的一个实例。我们可以用标准的 InputStream 的操作接口来读取流中的数据,就像通过FileInputSteam 读取文件的内容一样。相应的,CommPort 的 getOutputStream 可以获得端口的输出流,这样就可以往串口输出数据了。3.关闭端口使用完的端口,必须记得将其关闭,这样可以让其它的程序有机会使用它,不然其它程序使用该端口时可能会抛出端口正在使用中的错误。很奇怪的是,CommPortIdentifier 类只提供了开启端口的方法,而要关闭端口,则要调用 CommPort类的 close

14、()方法。让网络通讯更自由 谈 Java 串行端口技术协议(4) 通讯方式CommPort 的输入流的读取方式与文件的输入流有些不一样,那就是你可能永远不知这个 InputStream 何时结束,除非对方的 OutputStream 向你发送了一个特定数据表示发送结束,你收到这个特定字符后,再行关闭你的 InputStream。而 comm.jar 提供了两种灵活的方式让你读取数据。1.轮询方式(Polling)举个例子,你同 GF 相约一起出门去看电影,但你的 GF 好打扮,这一打扮可能就是半小时甚至一小时以上。这时你就耐不住了,每两分钟就催问一次“好了没?”,如此这样,直到你的 GF 说

15、OK 了才算完。这个就叫轮询(Polling)。在程序中,轮询通常设计成一个封闭的循环,当满足某个条件时即结束循环。刚才那个例子中,你的 GF 说“OK 了!”,这个就是结束你轮询的条件。在单线程的程序中,当循环一直执行某项任务而又无法预知它何时结束时,此时你的程序看起来可能就像死机一样。在 VB 程序中,这个问题可以用在循环结构中插入一个 doEvent 语句来解决。而 Java 中,最好的方式是使用线程,就像以下代码片断一样。public TestPort extend Thread.InputStream input = serialPort.getInputStream();Strin

16、gBuffer buf = new StringBuffer();boolean stopped = false;.public void run()try while( !stopped )int ch = input.read();if ( ch=q | ch=Q )/*结束读取,关闭端口.*/stopped = true;.elsebuf.append(char)ch);.catch (InterruptedException e) 2.监听方式(listening)Comm API 支持标准的 Java Bean 型的事件模型。也就是说,你可以使用类似AddXXXListener 这样

17、的方法为一个串口注册自己的监听器,以监听方式进行数据读取。如要对端口监听,你必须先取得 CommPortIdentifier 类的一个实例,CommPort serialPort = portId.open(“My App“, 60); 从而取得 SerialPort,再调用它的 addEventListener 方法为它添加监听器,serialPort.addEventListener(new MyPortListener(); SerialPort 的监听器必须继承于 SerialPortEventListener 接口。当有任何SerialPort 的事件发生时,将自动调用监听器中的 s

18、erialEvent 方法。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.getEve

19、ntType()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

20、 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

21、.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.getInputStreamtry while ( (ch=input.read() 0) buf.append(char)ch); System.out.print(buf); catch (IOException e) break; 这个监听器只是简单打印每个发生的事件名称。而对于大多数应用程序来说,通常关心是 DATA_AVAILABLE 事件,当数据从外部设备传送到端口上来时将触发此事件。此时就可以使用前面提到过的方法,serialPort.getInputStream()来从 InputStream 中读取数据了。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。