| 异步串行口——以太网设备服务器及应用 |
| 类别:电子综合 |
|                    吴康 本文介绍一种通过在TINI平台上建立一个应用层的有效简易方法,可将单独的串行设备迁移到以太网.并以应用实例作说明。 众所周知,当今难以计数的电子设备通过串口和其它设备通信。实际上,对于许多设备来讲,很多情况下,串行口是它们与外部世界通信的唯一渠道。例如自动调温器,销售点系统,远端监视器,条码阅读器,票据打印机,RFID(无线频率识别)收发器,血压计以及许许多多千差万别的现场设备,无论定是从传统的检测工具到最新的楼宇自动化等无不例外,但这些设备均没有直接参与用大型计算机网络的手段.而新的应用开发需要TCP/IP(传送控制协议/国际互连网协定)的连通性和以太网的通信能力。然而,昂贵的成本和耗时的设计常常又令人望而却步。怎么办? 本文介绍一种简易、经济的办法,通过在微型因网接口(Tiny InterNet Interfaces)TINI平台(该平台基于DS80C390或DS80C400微控制器实现)上建立一个应用层,可将单独的串行设备迁移到以太网。一旦将设备连接到以太网,TINl web服务,例如HTTP(超文本传送协议)服务器的实现便水到渠成。下面就该方法的几个方面作分折说明. RS-232串口 本文所讨论的异步串行通信基于RS-232-C标准,可一直追溯到计算机历史的早期。RS-232-C发布于1969年。现在的大多数串行口不支持标准所规定的所有信号。此外,已实现的信号也只是以一种“相当接近”于标准的方式在使用。为此,将不考虑纯粹的历史定义,而只关注当前RS-232的使用方式。 空号和传号 RS—232—C规定“空号”(二进制0)为一个+3V至+25V的电平,“传号”(二进制1)为-3V至-25V。-3V和+3V之间的区域为“切换区”。很多通用异步收发器(UART)采用更现代的(相对来讲)TTL电平0V和+5V表示0和1。专用的电平转换器,例如著名的MAX232,可以实现TTL和RS—232电平的转换。因为DS80C390/DS80C400的串行口是TTL兼容的,因此在和其它TTL电平的UART接口时不必采用电平转换器。 DCE和DTE 数据通信设备(DCE)和数据终端设备(DTE)是一条通信信道的两个端点。它们之间的一个主要差别是串行连接器的插脚定义。通过一个所谓的空调制解调器可在它们两者之间进行转换。 表1列出DTE串行连接器DB-9上的信号定义,以及另外一个采用空调制解调器的DTE 上的对应信号。 流控制 串行通信时,你可以向一条芯线发送(TD)而从另外一条接收(RD)。然而,如果两个采用RD/TD通信的设备任意进行发送,其中一个有可能超速另一个而导致数据丢失。通常采用以下两种办法之一实现必要的流控制: *XON/XOFF(常常简单地称为软件流控制) *RTS/CTS(常常简单地称为硬件流控制) XON/XOFF流控方式通过发送带内字符使另一侧暂停(XOFF,13h)或继续(XON,11h)发送。如果XON和XOFF字符出现在二进制数据流中,则发送方软件忽略它而由接收方软件打开。 RTS/CTS需要使用额外的信号线。RTS(请求发送)由发送方发出。如果接收准备就绪,接收方以CTS回应(清除发送),当其接收缓冲器满时就清除CTS。 有些设备支持流控制而有些不能。于是,默认设置常常为“没有流控制”,如果已知某个设备执行流控制,该设置将不起作用。 速度,数据位,停止位和奇偶位 为了通信成功,还必须设置发送速度(位速率),数据位数和停止位,以及奇偶校验类型(如果有的话)。大多数新设备采用一种“8N1”设置,代表8个数据位,无奇偶位,和一个停止位。然而,传统系统各种可能都有,因此,正确地进行设置还并非微不足道。 TINI和网络 TINI是Dallas Semiconductor开发的一种技术平台,目的是协助用户快速整合DS80C390和DS80C400网络微控制器到其目标应用中。TINI定义了一个芯片组,并包含一个嵌入式操作系统,其中整合了经过高度优化的Java运行环境。Java编程者可从其中获得一般的嵌人式开发中不多见的强大功能:多线程,无用单元收集,继承性,虚拟化,跨平台能力,强大的网络支持以及最后但很重要大量免费的开发工具。TINI使用者通常不直接面对汇编代码。不过,为了优化严格要求速度的通道或者访问底层硬件,同时也支持并鼓励本地语言子程序(TINI操作系统用本地代码写成,因此串行I/O的吞吐率和现代PC没有明显差异)。 除了完全支持java.net包之外,TINI Java运行环境还包含一个完整实现的javax.comm子系统。通过Java可毫不费力地访问TCP/IP和串行口,因此TINI系统可非常容易地用来实现串行口-以太网桥。 下面的例子所用到的TINIm390验证模块(可插入E10插座)是DS80C390TINI开发平台的硬件部分(TINIm400采用DS80C400)。除了SRAM,闪存,以太网,CAN总线,1-Wire等,系统还具有四个串行口。两个UART位于DS80C390内部(称为serial0和serial1);两个端口在外面(采用一片16550选配件)。需要注意的是,E10插座上的两个串行连接器都被接到了serial0,它们只是在DTE/DCE引脚安排上有所差异。 举例 下面介绍两个具体应用,并从一个普通的串行口—以太网程序中摘录片段出来,经过修改,它可适应于几乎各种应用。这些范例利用TINIm390/400验证模块搭建而成。TINI验证模块作为一个“黑匣子”被用来连接多个串行设备到以太网。根据最终设备的需要,TINI可以执行简单的数据传递,或者也可以对数据流进行解析、翻译或调整(见图1所示)。                     尽管可以在TINIm390/400的开发者外壳上运行这些范例,更合理的做法是将其驻留于闪存之中,掉电之后还能够自启动,并利用其他的一些TINI构造技术使最终产品更加牢靠。 如果想修改这些范例,需要具备一些基本的网络知识和编程经验。样例工作代码也可从Dallas的ftp站点(np://dalsemi.com)下载。 虚拟调制解调器 第一个范例-“虚拟调制解调器,利用TINIm390/400和TCP/IP连接,替代物理调制解调器和电话线。假定有一个旧设备,比如某工厂的“机器状态监视器”,它利用一个调制解调器,一天之内数次拨号到一个中央服务器,报告机器的状态、负载和效率数据。为了削减服务器侧日益增长的调制解调器库,并利用现有的LAN(区域性网络)取代连接到设备的电话线,可以: 重写服务器软件以支持TCP/IP,并且用TINI虚拟调制解调器取代每个机器上原有的调制解调器。 这样,机器状态监视器就不必再作任何修改,对于最终设备而言,虚拟调制解调器的使用和一个真正的调制解调器完全一样! 除了述配置,虚拟调制解调器当然也可以成对使用。如果双方都使用虚拟调制解调器,就无须对服务器软件作任何改动,TINI模块可直接替换现有的调制解调器。 在此表象之下,虚拟调制解调器每次接到“ATD(异步分时”调制解调器拨号命令时,实际建立的是TCP连接。“ATH(提示中止)”断开命令关闭TCP连接。软件也可实现一系列其他的经典AT调制解调器命令,并被诸如Microsoft Windows之类的网络系统认作真调制解调器。此外,虚拟调制解调器还可以侦听TCP端口,当收到“呼叫”信号时,向终端设备发出“振铃”。 下面的代码片段显示了如何对TINIm390上的串行口进行初始化: public static void main(String args[ ]) { TINIOS.setSerialBootMessagesState(false); TINIOS.setDebugMessagesState(false); TINIOS.setConsoleOutputEnabled{false}; System.out.println(“connecting to serial0 at 9600bps, ” ‘listening on TCP port 8001”); try { CommP0rtIdentifier portld= CommPortIdentlfier.getPortIdentifier(“serlal0”); SerialP0rt port = (SerialPort) portIdOpen{’VHOdemTINI”, 10000); TINIOS.setRTSCTSFlowControlEnable(1,false); TINIOS.setRTSCTSFlOwControlEnable(0,true); TCPSerialVirtualModem modem = new TCPSerialVirtualModem(port,/* Comm speed / 9600,/*TCP Port */8001); modem,processInput(); ) catch (Kxception e) { System.out.println(”Exception: ”+e.toString()); ) ) 这段代码首先禁止掉所有来自TINI操作系统的调试输出——TINI 上的标准惯例。获得一个端口号后,打开这个端口(如果端口正在被另一个应用使用,第二个参数指明等待多久)。接下来,设置硬件流控制状态。由于TINIm390仅有一套RTS/CTS线用于串口0和1,在目标端口使用它们之前,程序首先应该关掉其它端口上的流控制。下面,就是一个Java虚拟调制解调器范例。 虚拟调制解调器类包含一个AT命令解释器和网络代码。下面的代码可用来设置串口位速率,数据和停止位,以及奇偶位,从中可以发现,处理人站连接是何等简单: /** CreateS a new Virtual MOdem Connected to a Serial port on * one end and a TCP port on the data side. * Serial - - the Serial port this Virtual Modem talks to. * Speed - - the Speed the Serial port Should be Set to. * tcpport - - the TCP port this Virtual Modem listens on. * throws IOException when there’s a problem with the serial or TCP port. */ public TCPSerialVirtualModem(Serial Port Serial, int Speed, inttcpport) throwSs IOException { super(Serial); try { serial.setSerialportparams(speed, Serialport.DATABITS_8, Serialport.STOPBITS_1, Serialport.PARITY—NONE); } catch (UnSupportedcommoperationException e) { throw new IOEXception( ); } … serVerSock = new Serversocket(tcpport, 1); // backlog of one liStenThread = new liStenInbound( ); liStenThread.Start( ); } 最后,以下listenThread( )片段可接受一个到来的连接请求: pUubliC void run( ) { ‘ . int rc; socket S; while (running) { S = null; // No incoming connection request try { answered= false; s=serverSockk.accept( ); // Discard incoming connection if already connected if (connected) throw new IOEXception( ); sock=S; // for answer( ) UPS监视器 第二个实例是将TINIm390/400连接到一个不中断电源的串口。软件采用网络UPS工具协议,允许多个客户端在多种平台上检测UPS的状态。该项目源于需要由一台没有串口的新Macintosh计算机监视现有的UPS电源的需求。 目前存在两种基本的UPS设备:即所谓的“智能型”和简单型(或“哑巴型”)。简单的UPS在多个串行引脚上指示其工作状态,它实际上不输出任何ASCII数据。由于不存在太多的串行引脚,因而它仅能够指示几组有限的信息。例如:           javax.comm..notifyon一.( )方法可在Java中简单实现响应状态改变的代码. 例如: … // LiSten for DTR Changes try { pOrt.addEVentLiStener(thiS); } catCh (T00ManyLiStenersEXCeption e) { } port .notifyonDSR(true); … public Void SerialEVent(SerialportEvent ev) { try { if (ev.getvEenttype( ) = = SerialportEvent.DSR) · … } catCh ... … } 智能型UPS更有趣一点,因为它执行一个串行协议,能够返回电池充电的百分比或温度等参数。在不同的生产商之间,通信协议相差悬殊,且通常没有文档记录。 归功于Java内置的强大网络支持,本实例几乎不需要其它解释。在while( )循环体内的代码一直等待,直至接收到一个UDP请求,然后解析这个请求,利用getAddress( )从输人数据包中获取请求者,向请求者发送一个回应。 通用串行口-以太网应用关于完整的串行口—以太网实例的讨论超出了本文范畴,不过,下列部分代码还是展示了在串行口—以太网桥的串口和网络之间,如何高效地利用多线程传递数据。串口和TCP端口被抽象为Input/Outputstreams dataIn和dataout,因而,这一层的代码实际上不必关心任何有关网络的情况,而且,它还可以在CAN和1—Wire间桥接数据。 Public GenericBridge( ) { running=true; · dCThread =new dataCOpy( ); dCThread.Start( ); } //Thread that copies,everything from dataIn to dataout private class datacopy extends thead { public void run ( ) { int r = 0; while (running && r >= 0 ) { try { synchronized {threadLock} { r = dataln.read(dataBuffer); if (r > O) dataOut.write(dataBuffer, 0, r); } } catch (exception e) { r = -l/; ... // Handle error ) } ) ) ) 结论           许多旧设备仅支持异步串行通信,然而,当前的许多应用要求以太网和TCP/IP组网能力。利用强大的Java运行环境和基于DS80C390和DS80C400微控制器的TINI技术,很容易在数小时之内开发出一个串行口—以太网转换器。           |
- 海尔空调制冷故障维..
- 2008-1-25
- 大尺寸TFT显示器..
- 2008-1-27
- 利用DC/DC转换..
- 2008-1-27
- 电动车铅酸蓄电池的..
- 2008-1-27
- 大型搅拌站自动配料..
- 2008-1-27
- 城市和工业污水处理..
- 2008-1-27
- 开关电源的数字控制..
- 2008-1-27
- 精密的智能电池使充..
- 2008-1-27
- 基于DSP控制的2..
- 2008-1-27
- 增强型运营商级多服..
- 2008-1-27
- 高效CCD数码相机..
- 2008-1-27
- Atheros 单..
- 2008-1-27
- Philips 推..
- 2008-1-27
- Fujitsu 数..
- 2008-1-27
- 如何给PCI卡选用..
- 2008-1-27
- A/D转换芯片的测..
- 2008-1-27
- 基于CTl技术的交..
- 2008-1-27
- MMIC和RFIC..
- 2008-1-27
- 利用皮弹服务器进行..
- 2008-1-27
- 白色发光二极管及其..
- 2008-1-27



