异步串行通讯口(UART)是在工业自动化中应用最为广泛的通讯接口之一,其接口形式包括RS232C、RS485、RS422。作为以网络通讯为特色的英利嵌入式Linux主板,常常会面临支持多串口的应用。如按照国电标准,对于智能电表终端设备就有8串口的要求;国家环保局对监测设备的标准规范中也有8串口的要求等。目前英利EM9x60系列工控主板上均自带6个串口,为了方便客户高效、低成本地实现多串口的扩展,我们专门设计了采用USB接口转换的2串口扩展单元ETA501作为客户实际扩展的参考。ETA501模块利用英利工控主板上的一个USB接口即可很方便地实现基于英利Linux嵌入式主板的8串口应用方案。同时,通过精简ISA总线扩展串口的应用方案参见《英利工控主板10串口应用方案》。
本文将以EM9460为例介绍ETA501的使用方法,该方法同样适用于英利的其他Linux嵌入式主板产品,如EM9160、EM9260等。
该方案的系统构成如下图所示:
由EM9460嵌入式主板与ETA501构成的8串口系统
ETA501是USB转双串口扩展模块,USB2.0兼容,支持即插即用。扩展的每个串口通道支持7、8或9位数据位,1或2位停止位,奇偶校验;支持从50bps到12Mbps的通讯波特率;具有自动硬件或软件流控功能。用户可通过以下步骤来快速实现8串口应用方案:
1、原型评估
ETA501产品外观及结构布局如下:
ETA501 USB转双串口模块
ETA501布局图
其中,CN1和CN2是两个9线TTL电平串口(输出高电平3.3V,输入5V兼容),它们按相同的线序排列,信号定义如下:
信号名称及简要描述 | PIN# | 信号名称及简要描述 | |
DCD# | 1 | 2 | DSR# |
RXD | 3 | 4 | RTS# |
TXD | 5 | 6 | CTS# |
DTR# | 7 | 8 | RI# |
GND | 9 | 10 | VCC(+5V) |
CN3:标准USB Plugs,信号定义如下:
信号名称及简要描述 | PIN# |
1 | V BUS(+5V) |
2 | D- |
3 | D+ |
4 | GND |
通讯指示灯:
D1:TXD1——扩展串口1数据发送指示灯
D2:RXD1——扩展串口1数据接收指示灯
D3:TXD2——扩展串口2数据发送指示灯
D4:RXD2——扩展串口2数据接收指示灯
从英利公司购买EM9x60开发评估套件和ETA501,通过USB进行连接,可进行快速的功能评估。USB转串口的驱动程序已经固化在英利嵌入式Linux工控主板中,在此基础上,客户可利用英利公司为ETA501提供的基本通讯应用程序源代码快速评估多串口扩展单元的基本性能是否满足其具体的应用需求。
2、设计应用产品
ETA501的接插件布局以及信号定义详见《ETA501 USB转双串口模块使用手册》,客户在作具体应用设计时,可将ETA501直接设计在相应的应用威廉希尔官方网站
中,根据需要修改各个串口的驱动形式,如RS232C、RS485、RS422等。在应用底板设计过程中当然还需要参考相应嵌入式Linux主板的评估底板威廉希尔官方网站
原理图和PCB图。
3、应用程序开发
在Linux应用环境中对扩展的双串口的编程方法与标准的串口应用程序完全一样,只是需要注意打开扩展串口的设备名称有所不同,对于扩展串口需采用“/dev/ttyUSBx”,而不是板卡上的串口名称“/dev/ttySx”。
英利所提供的扩展驱动库文件放置在根文件系统/lib/modules/2.6.30目录下,相关的驱动文件包括:
/lib/modules/2.6.30/usbserial.ko
/lib/modules/2.6.30/vizzini.ko
在使用时需要首先载入该驱动功能模块,在Linux操作系统下,一般是利用系统的内部指令insmod来实现向系统内核载入模块:
[root@EM9X60 /mnt/nandflash]# insmod /lib/modules/2.6.30/usbserial.ko
[root@EM9X60 /mnt/nandflash]# insmod /lib/modules/2.6.30/vizzini.ko
在嵌入式领域的应用中,往往是需要自动加载模式的方式,这一功能可通过编程来实现,利用C++中的构造函数以及析构函数可以很好地实现驱动功能模块的自动载入和自动卸载。
定义一个class CSerial 串口通讯类,在该类中主要实现串口通讯应用的功能。
其构造函数:
CSerial:: CSerial ( )
{
system( 'insmod /lib/modules/2.6.30/usbserial.ko' ); // 载入扩展串口驱动模块
system( 'insmod /lib/modules/2.6.30/vizzini.ko' );
}
对应的析构函数:
CSerial::~CSerial( )
{
system( 'rmmod vizzini.ko' ); // 卸载驱动模块
system( 'rmmod usbserial.ko' );
}
应用程序中,一旦定义了class CSerial 的实例就实现了键盘模块的自动载入。后续就可按照标准打开串口设备文件的方式操作扩展串口。在Linux系统中,所有的设备文件都位于“/dev”目录下,EM9460板卡上6个串口所对应的设备名依次为:“/dev/ttyS1”、“/dev/ttyS2”、“/dev/ttyS3”、“/dev/ttyS4”、“/dev/ttyS5”、“/dev/ttyS6”,通过ETA501 USB转双串口的设备名依次为:“/dev/ttyUSB0”、“/dev/ttyUSB1”。
为了方便统一应用程序,可以做以下的操作,如:
if( PortNo>6 )
sprintf( portname, '/dev/ttyUSB%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工控主板应用程序编程手册》中的相关章节。如果还需要更多的串口扩展,可参阅《英利工控主板10串口应用方案》中的介绍作进一步的串口扩展。客户可以综合这两个方案并进行拓展应用,以扩展出符合自己需求数量的串口。
全部0条评论
快来发表一下你的评论吧 !