1 引言随着通信网络技术和集成电路设计的高速发展,以tcp/ip网络传输通信协议为代表,成熟度较高的开放式网络通信技术向各种自动化系统进行渗透,连接并控制所有设备。而在工业控制和各种通讯设备中,更多的却是符合rs-232标准的串行口设备。要将串行口的数据转发到网络上以实现数据的远程传输,就必须使用网关系统。网关又被称为网间协议变换器,用于连接采用不同通信协议的网络,实现网络之间的数据传输。本文提出了一种基于嵌入式系统来实现串口和以太网口之间的数据传输的设计方案。本文以32位嵌入式微处理器s3c241o为核心,通过移植嵌入式操作系统linux,并在linux上开发相应的驱动程序和应用程序来构建一个方便、实用的网关。
2 嵌入式网关的结构化设计本网关主要实现串口和以太网口之间的数据传输。其总体结构可简化为硬件层和软件层两部分
2.1 硬件设计本系统采用结构化设计,由串行口模块,协议转换模块和以太网接口模块等三部分组成。串口的数据以报文的格式发送到以S3C2410为核心的协议转换模块中,协议转换模块完成对该报文的接收和翻译,并通过以太网接口模块转发到internet上,最终实现串口设备到以太网的协议转换。
各模块基本组成描述如下:(1) 微处理器mcu基于arm92ot内核的s3c241o微处理器是一个多用途的通用芯片,它内部集成了微处理器和常用外围组件,特别适用于手持设备;(2) 1o/1oom以太网接口选用realtek公司生产的rtl82oi芯片作为以太网的物理层接口控制芯片。再通过rj45就可连接到以太网;(3) flash存储器采用一片hy29lv16o构建flash存储器系统,其存储容量为2mb;(4) sdram存储器选用两片hynix公司的hy57v64162o芯片并联构建sdram存储器系统;(5) jtag接口可对芯片内部的所有部件进行访问,通过该接口可对系统进行调试,编程等;(6) 串行接口s3c241o自身就带有两个uart控制器,我们将它们与MAX232相连进行电平转换,就可以得到两个标准rs-232串行接口;(7) i/o接口主要包括键盘控制模块和液晶显示模块等。2.2 软件设计网关的软件体系结构设计分为3个层次:(1) linux内核:提供文件系统管理、中断和中断处理、系统初始化、网络协议栈等;(2) 硬件驱动层:包括驱动串口、以太网等;(3) 应用程序:如串口通信程序、网络服务程序等。● 建立linux开发环境。基于linux操作系统的应用开发环境由S3C2410的开发板和宿主pc机所构成。目标板所用到的操作系统的内核编译、应用程序的开发和调试由宿主pc机来完成。双方通过串口和以太网接口建立连接关系。首先,在宿主机上安装linux操作系统,然后从网上下载工具链如:arm-elf-gcc-2.95.3-2.i386.rpm将它复制到宿主机上的任一目录下,键入安装命令,将交叉编译器安装到宿主机,建立起交叉开发环境.就可以用交叉编译器arm-elf-gcc编译操作系统内核和用户应用程序了。● 设备驱动程序。设备驱动程序是内核和硬件之间的接口。它是一组数据结构和函数的集合,其中以init_module和cleanup_module这两个函数和file_operations,inode,file这三个数据结构最重要,它们都在linux/fs.h中定义。这些数据结构和函数通过定义的接口控制一个或多个设备。设备驱动程序位于内核的最底层,直接与硬件进行交互。内核提供统一的系统调用,用户程序通过这些标准系统调用来访问硬件设备。本设计中需要开发的硬件驱动有:以太网卡控制器,串口,lcd,小键盘等驱动程序。为linux内核编写驱动要做的只是为相应的设备编写几个基本函数并vfs注册即可。一般都是在一个现成的驱动程序的基础上针对特殊的硬件设备作相应的改动。驱动编好以后,就为上层的应用程序提供了接口函数,然后开始编写针对该设备的应用程序。最后重新编译内核,把linux的二进制文件烧进flash存储器,就可以使用这些外部设备了。● 应用程序设计。本网关的主要功能就是实现串口协议和网络协议的转换。由于移植了linux操作系统,我们只需在linux操作系统上编写串口应用程序和网络应用程序就可以实现网关的设计要求。应用程序设计框图如图3所示。主要包括三个应用程序:linux下的串口编程、socket编程以及进程间通信。
2.3 linux下的串口编程串口是通信应用中最简单也是最常用的接口。在linux下,串口被当作文件对待,每个串口都被赋予了一个文件描述符。在linux中打开和预置一个串行设备的基本步骤:(1) 打开串口在 linux 下串口文件是位于/dev下的,串口一为/dev/ttys0,串口二为/dev/ttys1。打开串口是通过使用标准的文件打开函数open操作。(2) 设置串口设置串口包括波特率设置,效验位和停止位设置,它主要是设置struct termios结构体各成员c_ illag, c_ oflag, c_ cflag、c_1nag的值。设置这个结构体比较复杂,下面是设置波特率的函数:void set_speed(int fd, int speed){ //fd为打开串口的文件句柄,speed为串口速率int i; int status; struct termios opt; tcgetattr(fd, &opt); //使用tcgetattr获取当前设备方式for (i= 0; i
3 进程之间通信在linux中,每一个进程都有它的独立的运行空间,进程之间要实现通信就要用到系统提供的通信机制。在linux中用来进行进程间通信与同步的机制有:共享内存、信号量、消息队列、管道、有名管道、socket等等。在本系统中,用到的是共享内存和信号量。在两个进程间通信时用到的是共享内存,实现对它的互斥访问用的是信号量。共享内存允许两个或更多的进程共享一块内存。在linux任务中通过/dev/mem设备在这段内存中寻址,进程也通过读取这段内存的数据获得信息。共享内存从理论上讲,应该是两个进程之间最快速的通信方式,因为它将信息直接的映射入内存省去了其它ipg方法的中间步骤。使用共享内存时,同步问题尤其重要。“信号量”就是为解决这种问题而引入的。信号量能够让程序员实现一种对任意事件的锁定机制。
4 结束语本文设计了一种基于嵌入式处理器S3C2410及linux操作系统的串行设备与以太网通信的嵌入式网关系统。本网关可实现以太网与串行设备的通信,通过改进可以满足与更多类型的串行设备的通信。随着以太网的发展和嵌入式系统设计被人们越来越广泛的关注,这种设计方案将会在工业控制、楼宇自动化、智能家居等领域得到越来越广泛的应用,具有广阔的应用前景。
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』