英利工控主板10串口应用方案

 2011-2-25         

        多串口通讯在工控领域中是十分常用的一种通讯方式,常用于数据交互、搜集、传送等。基于这类应用,英利嵌入式Linux工控主板自带6个异步串口;还支持用户通过精简ISA总线、USB等接口扩展出更多的串口。本文介绍使用英利工控主板,通过精简ISA总线连接ETA503 四串口扩展模块,组成10串口的扩展应用方案。同时,通过USB接口扩展串口的应用方案参见《英利工控主板8串口应用方案》

 

        本文以EM9460工控主板为例,然而该方案完全适用于英利EM9x60系列工控主板。

 

        该方案的系统构成如下图所示:

 

英利工控主板10串口应用方案

由EM9460工控主板与ETA503组成的10串口系统

 

        ETA503是一款基于英利嵌入式Linux工控主板的四串口扩展模块,通过一片16C554和一片逻辑控制器扩展出四个串口供用户使用。ETA503的硬件设计使得用户既能快速方便地进行评估,又能很好地将其融入自己的产品设计中。用户可通过以下步骤来快速实现10串口应用方案:

 

        1、原型评估
        ETA503 的外观示意图如下:

 

ETA503外观示意图

(标注尺寸:inch(1 inch = 1000mil = 25.4mm))

 

        ETA503包括5个插座,其中CN1为精简ISA总线接口,其信号定义如下:

 

信号名称及简要描述

PIN#

信号名称及简要描述

       RESET#,复位输出

1

2

        SA0,地址总线
       SD0,数据总线,低位

3

4

        SA1,地址总线
       SD1,数据总线

5

6

        SA2,地址总线
       SD2,数据总线

7

8

        SA3,地址总线
       SD3,数据总线

9

10

        SA4,地址总线
       SD4,数据总线

11

12

        WE#,写信号控制线
       SD5,数据总线

13

14

        RD#,读信号控制线
       SD6,数据总线

15

16

        CS1#,片选线
       SD7,数据总线,高位

17

18

        VCC,+5V电源输出
       IRQ1,中断请求线

19

20

        GND,公共地

 

        CN3-CN6是四个扩展出的9线制串口,LVTTL(3.3V)电平,分别对应ttyISA0-ttyISA3,具有相同的信号定义如下:

 

信号名称及简要描述

PIN#

信号名称及简要描述

       DCD#

1

2

        DSR#
       RXD

3

4

        RTS#
       TXD

5

6

        CTS#
       DTR#

7

8

        RI#
       GND

9

10

        VCC(+5V)

 

        从英利公司购买EM9x60开发评估套件和ETA503,通过精简ISA总线进行连接,可进行快速的功能评估。ETA503的驱动程序已经固化在英利嵌入式Linux工控主板中,在此基础上,客户可利用英利公司为ETA503提供的基本通讯应用程序源代码快速评估多串口扩展单元的基本性能是否满足其具体的应用需求。

 

        2、设计应用产品
        实际应用时,ETA503可以作为一个“器件”直接背插在用户的应用底板上,以获得最佳的数据传输性能。如果需要修改各个串口的驱动形式,如RS232C、RS485、RS422等,用户可以参考相应开发评估底板的电路原理图和PCB图。

 

        3、应用程序开发
        在Linux应用环境中对扩展串口的编程方法与标准的串口应用程序完全一样,只是需要注意打开扩展串口的设备名称有所不同,对于扩展串口需采用“/dev/ttyISAx”,而不是板卡上的串口名称“/dev/ttySx”。

 

        英利所提供的扩展驱动库文件放置在根文件系统/lib/modules/2.6.30目录下,相关的驱动文件是:
        /lib/modules/2.6.30/eta503_serial.ko

 

        在使用时需要首先载入该驱动功能模块,在Linux操作系统下,一般是利用系统的内部指令insmod来实现向系统内核载入模块:
        [root@EM9X60 /mnt/nandflash]#  insmod  /lib/modules/2.6.30/eta503_serial.ko

 

        在嵌入式领域的应用中,往往是需要自动加载模式的方式,这一功能可通过编程来实现,利用C++中的构造函数以及析构函数可以很好地实现驱动功能模块的自动载入和自动卸载。

 

        定义一个class CSerial 串口通讯类,在该类中主要实现串口通讯应用的功能。
        其构造函数:
        CSerial:: CSerial ( )
        {
                system( 'insmod /lib/modules/2.6.30/eta503_serial.ko' ); // 载入扩展串口驱动模块
        }

 

        对应的析构函数:
        CSerial::~CSerial( ) 
        {
                system( 'rmmod eta503_serial.ko' ); // 卸载驱动模块
        }

 

        应用程序中,一旦定义了class CSerial 的实例就实现了键盘模块的自动载入。后续就可按照标准打开串口设备文件的方式操作扩展串口。在Linux系统中,所有的设备文件都位于“/dev”目录下,EM9460板卡上6个串口所对应的设备名依次为“/dev/ttyS1”-“/dev/ttyS6”,通过ETA503扩展出的串口设备名依次为“/dev/ttyISA0”-“/dev/ttyISA3”。为了方便统一应用程序,可以做以下操作:

 

        if( PortNo>6 )
                sprintf( portname, '/dev/ttyISA%d', PortNo-6); // PortNo为串口端口号,从7开始
        else
                sprintf( portname, '/dev/ttyS%d', PortNo ); // PortNo为串口端口号,从1开始
        m_fd = open( portname,O_RDWR | O_NOCTTY | O_NONBLOCK);

 

        具体串口通讯的细节可参考《英利Linux工控主板应用程序编程手册》中的相关章节。如果还需要更多的串口扩展,可参阅《英利工控主板8串口应用方案》中的介绍作进一步的串口扩展。客户可以综合这两个方案并进行拓展应用,以扩展出符合自己需求数量的串口。