英创信息技术:EM9x60串口通讯基本应用

描述

串口通讯,是工业自动化、智能终端、通信管理等领域传统且重要的通讯手段。最常用到的串口通信模式往往是两种: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接口,满足了用户灵活使用的需要。

串口扩展模块

英创公司所提供的基于系统提供串口的嵌入式主板,均是通过嵌入式主板上的插针的方式,作为与用户的接口。这些串口,能够满足大多数的应用环境。除止之外,还可以使用英创公司的串口扩展模块进行扩展。

ETA503

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

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

嵌入式主板

RS485通讯接口

在很多的工业应用场合中,长距离的通讯,仍是采用RS485的通讯方式,这种方式的应用简单、通讯可靠、成本也很低。

其接法是:将通用的串行通讯口的接收(RX)与发送(TX)分别接至RS485接口芯片的接收输出(RO)与发送输入(TI)口,再用一个信号来控制RS485的收/发状态。英创公司提供的RS485通讯电路中,对RS485的收发控制采用了自动收/发控制电路。这样,一是减少了对系统资源的占用,二是保持与RS232一样的驱动程序,从而提高程序的执行效率。

自动收/发控制原理:

嵌入式主板

在通讯空闲状态,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等。需注意的是,如加了光电隔离,必须使其电源也隔开,这样才能起到隔离作用。

嵌入式主板

ETA232

在英创所提供的嵌入式主板中,即给了RS232电平信号的串行通讯接口,也给出了TTL电平信号的串行通讯接口,且TTL电平信号的串口支持MODEM控制。如用户在使用中,要用到TTL电平信号的串口来作RS232的通讯或是控制MODEM,则需要将TTL电平信号转换为RS232电平信号。为此,英创公司也提供了相应的转换模块ETA323,将TTL接口的信号转换为9线制标准的RS232接口。

嵌入式主板

基于英创公司的嵌入式系统的串口的基本应用

对于英创公司所提供的串口通讯的驱动,均是以中断服务的形式,实现与底层硬件间的通讯。

下面以X86系列为例,说明其最基本的应用原理:

嵌入式主板

中断服务程序的任务,就是对串口数据的接收及用户数据的发送进行处理并对数据环形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 <>

{

i1=PutOutputData( ComIdx ,TxBuff[i2] );

// 每填入一个数据,建议检查一下BUFF是否被填满

if( i1==-1 )

break;

}

// 数据被填入BUFF后,应启动发送中断。让中断程序来完成数据的发送

StartSend( ComIdx );

return i2;

}

函数的参数说明如下:

ComIdx                               要发送数据的串口序号

*TxBuff                               要发送的数据

TxLen                                  发送数据的长度

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分