注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

易拉罐的博客

心静自然凉

 
 
 

日志

 
 

转 串口通讯应用方案  

2010-03-28 11:25:50|  分类: 串行通信 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
串口通讯,是工业自动化、智能终端、通信管理等领域传统且重要的通讯手段。最常用到的串口通信模式往往是两种:RS232和RS485。其中RS232通讯方式有三线制和九线制两种。
 
        英创所有型号的嵌入式主板均提供有串行通信接口(串口),根据不同的主板型号,串口的数量也不同,如: ETR232i、 ETR186提供有3个串口;EM9000、EM9161提供有4个串口;EM9260、EM9360、EM9160则直接提供多达6个串口。除了系统板载的串口以外,客户还可根据自己的应用进行灵活扩展。基于英创的嵌入式系统的精简ISA总线或专用的扩展底板,可扩展出更多的通用串口,现可用的扩展配件有:ETA502、ETA503、ETA504。所有的串口的通讯的最高波特率均能达到115200bps。
 
        英创嵌入式网络主板直接提供的串口既有标准的RS232接口,也有TTL电平的串行接口,这意味着,TTL电平的串口只需要添加简单的外围电路驱动,就可直接转换为标准RS232、RS485接口以及RS422接口。某些用户(如电力系统用户)还可以根据实际情况需要,在串口上添加光电隔离电路,以达到保护端口的目的。英创公司给用户提供的开发底板(随基本开发套件提供)就充分地考虑了用户对于串口应用的多方面要求,既引出了RS232接口,也引出了 RS485接口,满足了用户灵活使用的需要。
 
串口扩展模块
 
        英创公司所提供的基于系统提供串口的嵌入式主板,均是通过嵌入式主板上的插针的方式,作为与用户的接口。这些串口,能够满足大多数的应用环境。除止之外,还可以使用英创公司的串口扩展模块进行扩展。
 
ETA502
 
        ETA502是基于英创公司的嵌入式系统所特有的精简ISA总线来扩展一个单串口的扩展模块。该串口扩展模块是一个9线制的标准的RS232扩展模块,直接支持MODEM控制。
 
        该模块可以通过ISA总线在英创公司的所有嵌入式主板(X86系列及ARM系列)中使用。
转 串口通讯应用方案 - 易拉罐bb - 易拉罐的博客
ETA502模块

ETA503:

      ETA503是基于英创公司的嵌入式系统所特有的精简ISA总线,扩展4个串口的扩展模块。4个串口均是9线制通用RS232电平信号。

      该模块可以通过ISA总线在英创公司的所有嵌入式主板(X86系列及ARM系列)中使用,即可以通过短的排线连接在ISA总线上,这种方式可以快速实现功能评估,也可以将ETA503当作一个元器件一样,用插针插在应用系统中所提供的插座上(ARM9+ETA503应用方案示列参考:WinCE系统多串口扩展方案)。

转 串口通讯应用方案 - 易拉罐bb - 易拉罐的博客

ETA503模块



ETA504:
 
        ETA504是基于英创的ETR232i、ETR232H嵌入式系统主板,用以扩展至7个串口的扩展应用底板。其中,COM1~COM3继承了主板上原有串口,与标准评估底板的信号一致。COM4~COM7是通过主板上的精简ISA总线,利用ST16C554所扩展的4个3线制的通用RS232串口。
 
转 串口通讯应用方案 - 易拉罐bb - 易拉罐的博客
ETR232i+ETA504
 
 
 
RS485通讯接口:
 
        在很多的工业应用场合中,长距离的通讯,仍是采用RS485的通讯方式,这种方式的应用简单、通讯可靠、成本也很低。
 
        其接法是:将通用的串行通讯口的接收(RX)与发送(TX)分别接至RS485接口芯片的接收输出(RO)与发送输入(TI)口,再用一个信号来控制RS485的收/发状态。英创公司提供的RS485通讯电路中,对RS485的收发控制采用了自动收/发控制电路。这样,一是减少了对系统资源的占用,二是保持与RS232一样的驱动程序,从而提高程序的执行效率。
 
        自动收/发控制原理:
 
转 串口通讯应用方案 - 易拉罐bb - 易拉罐的博客转 串口通讯应用方案 - 易拉罐bb - 易拉罐的博客
 
RS485自动收/发控制电路
 
        在通讯空闲状态,TXD(数据发送信号)为高, A点为高,B点经R21给C11充电,其充电时间为T1,该时间定为串口发送一个字节所需的时间,由R21与C11的参数来确认。充满后,R/T为低,RS485处于接收数据的状态。
 
        在发送数据时,TXD起始位产生第一个下降沿,使A点为低,B点经过D5进行快速放电,使R/T很快变为高,RS485处于数据发送状态。在发送过程中,当TXD变成高电平时,C11通过R21缓慢充电,使R/T仍然保持在发送状态,可有效吸收总线上的反射信号。当RC充电结束,使R/T转入接受状态时,总线上的上拉、下拉电阻将维持TXD高电平的发送状态,直至整个bit发送结束。
 
        当数据发送完毕以后,TXD变为高电平,RC又开始充电,即经T1时间后,RS485又转换为数据接收状态。
 
        虽然RS485接口芯片具有一定的抗浪涌能力,但是在很多的工业现场,仍存在对接口芯片及系统有威胁的干扰。所以通常会采取一定的措施来进行系统的保护。如光电隔离与TVS等。需注意的是,如加了光电隔离,必须使其电源也隔开,这样才能起到隔离作用。(如下图所示)
 
 
转 串口通讯应用方案 - 易拉罐bb - 易拉罐的博客转 串口通讯应用方案 - 易拉罐bb - 易拉罐的博客
 
英创公司提供的RS485参考电路
 
9线制串口电平转换模块ETA232
 
        在英创所提供的嵌入式主板中,即给了RS232电平信号的串行通讯接口,也给出了TTL电平信号的串行通讯接口,且TTL电平信号的串口支持MODEM控制。如用户在使用中,要用到TTL电平信号的串口来作RS232的通讯或是控制MODEM,则需要将TTL电平信号转换为RS232电平信号。为此,英创公司也提供了相应的转换模块ETA323,将TTL接口的信号转换为9线制标准的RS232接口。
 
转 串口通讯应用方案 - 易拉罐bb - 易拉罐的博客
 
ETA232 RS232电平转换模块
 
基于英创公司的嵌入式系统的串口的基本应用:
 
        对于英创公司所提供的串口通讯的驱动,均是以中断服务的形式,实现与底层硬件间的通讯。
 
        下面以X86系列为例,说明其最基本的应用原理:
 
转 串口通讯应用方案 - 易拉罐bb - 易拉罐的博客
 
应用结构示意图
 
        中断服务程序的任务,就是对串口数据的接收及用户数据的发送进行处理并对数据环形BUFF管理的过程。
 
        当有数据被接收时,中断服务程序便将所接收到的数据从硬件模块中取出,并按一定的规则送入到指定的串口的接收BUFF中存贮。用户使用GetInputData( )函数来读取接收BUFF中的数据。应注意的是,GetInputData( )函数一次只能从BUFF中读取一个字节的数据,所以,在应用程序中,应重复调用这个函数直到函数的返回值为-1时,才表明将接收BUFF中的数据全部读出。
 
        当用户要发送数据时,调用PutOutputData ( )将用户已准备好的数据,依次填入数据发送BUFF中。在数据填完后,调用StartSend( )启动串口发送中断,这时数据的发送将由中断服务程序来完成。应注意的是,PutOutputData ( )函数一次也只能将一个字节的数据填入BUFF中,要反复调用该函数直到所有的数据都被填入BUFF。如PutOutputData ( )函数返回了-1,则表明BUFF已被填满,再往BUFF中填数据,将不会被接授。
 
        对于用户的应用程序,可以参考以下的说明:
 
1、 用户可以用查询或定时或其它的方式,对串口的数据读取。如确认接收BUFF中有数据存在,建议一次将其全部读出。读取串口数据的参考程序如下:
 
int ReadRxdBuff( int ComIdx , unsigned char *RxBuff , int MaxLen )
{
       int i1,i2;
 
       for(i2=0 ; ; )
       {
           //检查某个串口是否有数据,如没有数据则退出,否则,将数据放入缓存器以便使用
           i1 = GetInputData( ComIdx );
           if( i1==-1 )
                     break;
              RxBuff[i2]=char ( i1 );
              i2++;     
              if(i2==MaxLen)
                     break;
       }
       return i2;
}
 
        函数的参数说明如下:
 
ComIdx                               要读取的串口序号
*RxBuff                               读出的数据要存放的数据缓存器
MaxLen                               读出数据的最大长度,以限制一次性读取的长度
 
2、当用户有数据需要发送时,首先应将要发送的数据准备好,再依次将的要发送的数据一次性全部填入对应的发送BUFF中。再启动数据发送。应注意的是,要发送的数据的长度要有一定的限制,不能超出发送BUFF的长度。数据发送的参考程序如下:
 
int SendTxdBuff( int ComIdx , unsigned char *TxBuff , int TxLen )
{
       int i1,i2;
      
       for( i2=0; i2 < TxLen;i2++ )<>
       {
           i1=PutOutputData( ComIdx ,TxBuff[i2] );
              //每填入一个数据,建议检查一下BUFF是否被填满
              if( i1==-1 )
                     break;
       }
       //数据被填入BUFF后,应启动发送中断。让中断程序来完成数据的发送
       StartSend( ComIdx );
       return i2;
}
 
        函数的参数说明如下:
 
ComIdx                               要发送数据的串口序号
*TxBuff                               要发送的数据
TxLen                                  发送数据的长度
 
  评论这张
 
阅读(497)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017