随着通信网络技术和集成电路设计的高速发展,以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
if(speed == name_arr[i]) {
tcflush(fd, tcioflush);
cfsetispeed(&opt, speed_arr[ i ]);
//设置波特率,speed_arr[ i ]为波特率表某值
cfsetospeed(&opt, speed_arr[ i ]);
status = tcsetattr(fd1, tcsanow, &opt);
//使用tcsetattr设置设备工作方式
if(status != 0) {
perror("tcsetattr fd1");
return;
}
tcflush(fd,tcioflush);
}
}
}
(3) 读写串口
设置好串口之后,把串口当作文件,使用read和write读写串口终端。函数原型为write(fd,buffer,length)和read(fd,buffer,length)。
(4) 关闭串口
输入输出处理完毕,用close关闭串口。关闭串口就是关闭文件,即close(fd)。
2.4 linux下的socket编程
socket接口是tcp/ip网络的api,它是建立在传输层协议(主要是tcp和udp)上的一种套接字规范。socket接口定义了许多函数或例程,程序员可以用它们来开发tcp/ip网络上的应用程序。网络的socket数据传输是一种特殊的i/o,socket也是一种文件描述符。socket具有一个类似于打开文件的函数调用socket(),该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket实现的。常用的socket类型有两种:流式socket(sock_stream)和数据报式socket(sock_dgram)。流式是一种面向连接的socket,针对于面向连接的tcp服务应用;数据报式是一种无连接的socket,对应于无连接的udp服务应用。本方案采用流式socket,因为它提供一种可靠的面向连接的数据传输办法,有自己的检错和纠错机制,并且不管是对单个的数据报,还是对于数据包,它都提供了一种流式数据传输方式。
3 进程之间通信
在linux中,每一个进程都有它的独立的运行空间,进程之间要实现通信就要用到系统提供的通信机制。在linux中用来进行进程间通信与同步的机制有:共享内存、信号量、消息队列、管道、有名管道、socket等等。在本系统中,用到的是共享内存和信号量。在两个进程间通信时用到的是共享内存,实现对它的互斥访问用的是信号量。共享内存允许两个或更多的进程共享一块内存。在linux任务中通过/dev/mem设备在这段内存中寻址,进程也通过读取这段内存的数据获得信息。共享内存从理论上讲,应该是两个进程之间最快速的通信方式,因为它将信息直接的映射入内存省去了其它ipg方法的中间步骤。使用共享内存时,同步问题尤其重要。"信号量"就是为解决这种问题而引入的。信号量能够让程序员实现一种对任意事件的锁定机制。
4 结束语
本文设计了一种基于嵌入式处理器s3c2410及linux操作系统的串行设备与以太网通信的嵌入式网关系统。本网关可实现以太网与串行设备的通信,通过改进可以满足与更多类型的串行设备的通信。随着以太网的发展和嵌入式系统设计被人们越来越广泛的关注,这种设计方案将会在工业控制、楼宇自动化、智能家居等领域得到越来越广泛的应用,具有广阔的应用前景。