




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
武汉工业学院20**毕业论文PAGE第1页共36页武汉工业学院本科毕业设计(论文)设计题目:TCP/IP与RS232协议转换器的设计(软件)姓名:学号:院(系):电气信息工程系专业:自动化指导教师:武汉工业学院电气与信息工程系目录TOC\o"1-3"\h\z摘要 2前言 4一、 设计概述 51.1设计要求 51.2系统结构框图 51.3 模块电路的介绍 61.3.1 主控制器S3C44BOX 61.3.2 串口收发控制模块 71.3.3 TCP/IP协议转换模块 7二. 系统硬件单元电路设计 82.1 MAX232接口电路 82.2 RTL8019接口电路 8三. 硬件电路板的调试和测试 9四. 软件开发环境的建立 104.1Uclinux简介及其优点 104.2建立主机开发环境 114.3 uclinux内核裁减,编译,移植 124.3.1 TCP/IP及串口驱动添加 124.3.2 编译uClinux 144.3.3 移植uclinux内核 14五. 软件程序构架 165.1 软件结构 165.2 串口处理程序模块 175.3 TCP/IP处理模块 185.4 软件工作原理剖析 225.4.1 帧的统一化 225.4.2 系统数据流向分析 23六总结 26七致谢 26八附录 27九参考文献 34武汉工业学院20**毕业论文 第33页共36页摘要本次毕业设计的课题是“TCP/IP与RS232协议转换器的设计”,主要以ARM7系列的S3C44BOX微处理器和RTL8019AS网络接口芯片等构建嵌入式系统,移植uClinux,并在RHLinux90和uclinux为ARM处理器提供的交叉开发工具下,完成基于TCP/IP协议的串口/以太网数据转换设备的开发。该设备支持服务器和客户机模式,为传统串口设备通过标准TCP,IP协议接入lnternet提供了一种低成本解决方案。本文主要描述了单串口以态网协议转换,实现RS232串口数据流的收/发控制,封装/拆封串口帧,并通过TCP/lP协议转换模块将以太网发送缓冲区的串口帧封装在UDP包中,并传给IP层;同时,接收以太网数据帧并向上层层解包,分离应用层数据,然后数据的解析处理交由串口发送模块完成,实现RS232串口流与以太网端口流的透明转换。关健词:串口;以太网;S3C44BOX;RTL8019AS;TCP/IP;uclinux;AbstractThisgraduationprojecttopicis“Serialport/EthernetdatatransferbasedonuClinuxoperationsystem”,EmbeddedsystembasedonARM7MCUS3C44BOXandnetworkinterfacechipRTL8019ASisdeveloped,OnwhichuClinuxoperationsystemisported.Serialport/EthernetdatatransferdevicethroughTCP/IPprotocolisdevelopedunderRHLinux9.0anduClinuxcrossevelopmenttoolsforARM.Serverandclientmodearesupported.Itprovidesalow—costsolutionfortraditionalserial—interfacedequipmenttoconnectwiththeInternet.Thisarticledescribesthesingleserialport/EthernetdatatransferbyTCP/IPprotocol.ItrealizesRS232serialdatastreamreceive/transfer,Packaging/unsealedserialframe.UndertheTCPprotocolconversionmodule,thesedatacouldbesentserialUDPpacketencapsulationinEthernetframebuffer,andtransmitIPlayer;orcouldbereceivedthroughreceivingEthernetdataframestolayeronthepackage,separatingtheapplicationlayerdata.ImplementationRS232serialport/Ethernetportdataflowtransparenttransfer.KeywordsSerialport;Ethernet;S3C44BOX;RTL8019AS;TCP/IP;uclinux;、前言随着企业规模的扩大和Internet技术的广泛普及,全球各个领域的不同企业已经对“让设备联网”达成共识,而在工业控制和通信设备中,更多的却是符合RS232标准的串行口设备。如何将串行口的数据转发到网络上,实现设备的远程控制、数据的远程传输便成了一个亟待解决的问题。同时,考虑到成本问题,以往设备又不可能全部淘汰,因此,本文提出一种基于TCP/IP的串口转换网关,可从根本上解决这一难题。
串口转换网关使得串口数据流到以太网数据流的传输成为可能。它能连接RS232串口设备,并将串口数据进行选择和处理,把RS232接口的数据流转化成以太网数据流,这样就可以进行网络化的数据处理,实现串行数据的网络化。采用此种方案,无需淘汰原有串口设备,多台设备可同时入网,既可以提高设备利用率,又节约组网费用,还可在已有的网络基础上简化布线复杂度。同时可以设计多串口转换接口,采用串口扩展芯片GM8123可实现低成本、较高速度、控制简单的串口方案。此为本文拓展的方向,从于可以更大地降低成本,使开发到应用有更大价值。本文主要描述的是单串口以态网转换接口的开发,借助uclinux的内核小,效率高,在网络方面是非常完整的,拥有TCP/IP和串口驱动,提供了丰富的API接口函数,特别是提供了网络通用的编程接口套接字,实现TCP协议建立连接等优点,进行基于三星公司的S3C44B0X嵌入式系统开发。实现uclinux移植,网络驱动和串口驱动的加载,实行应用程序的开发。利用tftp下载uclinux映像文件,容易实现系统升级。设计概述随着网络技术的发展,以以太网和TCP/IP为代表的成熟度较高的开放式网络技术逐渐在工业控制领域被广泛采用,设备网络化是未来发展的趋势,人们希望能够通过LAN网络连接各种设备,读取控制中心指令,传输数据,实现设备的IP化控制、管理及数据存取;而另一方面,目前工业领域的大量数控机床、仪器仪表、传感器、读卡器等设备尚不具备网络接口,这些设备之间最常用的通信接El为RS一232/422/485串口。在不改变原有设备结构的基础上为其添加串口/网络接口,使其通过TCP/IP协议接入互联网,是串口设备上网的低成本解决方案。本文开发的串口/以太网转换设备通过ARM7系列的32位微处理器S3C44BOX对串行口和网卡数据协议进行转换和处理,使接收到的串口数据流转换为包含TCP/IP协议可为网络识别与传送的数据包,通过网络接口设备发送至Internet,并对来自以太网的数据帧进行判断,使之转换为串行数据,送达响应的串口设备,实现串行口数据与以太网数据的相互转换,将传统串口设备升级为具有网络接口的设备。1.1设计要求本次毕业设计的课题为“基于RS232与TCP/IP协议转换”,主要由三星公司的S3C44B0X协议处理芯片,串口收发控制模块,TCP/lP协议转换模块组成。并完成BootLoader烧写,硬件电路的测试,uclinux的编译,嵌入式系统的开发。具体要求:程序烧写工序简单可靠,系统工作稳定。对Uclinux内核裁减,驱动加载,实现其优点。CPU与网卡及MAX232接口电路可靠,并提供Jtarg调试电路。能将串口接收到的数据通过,广播方式发送到局域网中的每台机器。1.2系统结构框图本系统微处理器CPU采用三星公司的S3C44B0X,8MHz外部钟振,内部倍频至64MHz,FlashROM采用SST39VF16016Mbit(1M×16bit)程序Flash;RAM:64Mbit(4×1M×16bit)PC100/PC133兼容SDRAM;网口控制芯片采用Realtek公司的RTL8019,串口控制芯片采用常见的MAX232。主要芯片都是高度集成,接线简洁,原理清晰。其图如下:图1系统结构框图模块电路的介绍下面将分块介绍协议转换的主控芯片s3c44b0,串口收发模块,及TCP/lP协议转换模块的功能,剖析分块模块的基本组成和工作原理。主控制器S3C44BOXS3C44BOX是SAMSUNG公司基于ARM7TDMI核的32位微处理器。ARM7TDMI是目前ARM7系列中应用较广的处理器核,T、D、M、1分别表示:T一支持16位Thumb指令集;D一支持片上调试(Debug);M一内嵌硬件乘法器(Multiplier);1一支持嵌入式ICE接口。S3C44BOX是高度集成的SoC片上系统,集成了存储控制器、UART控制器、LCD控制器、AD转换器、IIC和IIS总线控制器、中断控制器、定时器、通用I/0口等。S3C44BOX采用平坦地址空间,其内置的8个外部存储bank可扩展出256MB的地址空间。S3C44BOX的片内模块如图2所示。S3C44BOX内置2通道UART,其中每一路UART分别包含一个l6字节的接受FIFO和发送FIFO,波特率可编程控制,最高支持115.2kbps,支持5,6,7,8位数据长度,1,2位停止位,支持奇偶校验,支持中断模式和DMA模式。圈2S3C44BOX片内结构圈串口收发控制模块
实现RS232串口数据流的收/发控制,包括微控制器、MAX232等元件。微控制器控制串口数据收发,接收串口源数据,封装后写入以太网发送缓冲区打包传输;同时,接收以太网应用层的数据,解析并发送给测控设备。它不关心通信数据的具体意义,只负责接收/发送,封装/拆封串口帧,提供通用接口。TCP/lP协议转换模块
它是一个微型的以太网接入模块,由微控制器(s3c44b0)、网卡接口芯片rtl8019、及辅助元件构成。微控制器控制网卡接口芯片进行网络通信,实现地址解析协议(ARP)、Internet控制报文协议(ICMP)、IP协议、用户数据报协议(UDP)等协议的解析和封包。将以太网发送缓冲区的串口帧封装在UDP包中,并传给IP层;同时,接收以太网数据帧并向上层层解包,分离应用层数据,然后数据的解析处理交由串口发送模块完成,实现RS232串口流与以太网端口流的透明转换。系统硬件单元电路设计RS232与TCP/IP协议转换电路主要由两部分组成,其一为TTL电平与RS232电平转换电路,有MAX232集成芯片实现;其二是网卡接口电路,主控芯片是RTL8019。MAX232接口电路MAX232芯片时MAXIM公司生产的低功耗、单电源双RS232发送/接收器。适用于各种EIA-232E和V.28/V.24的通信接口。MAX232芯片内部有一个电源电压变换器,可以把输入的+5V电源变换城RS-232C输出电平所需10V电压,所以采用此芯片接口的串行通信系统只要单一的+5V电源就可以。现选用其中一路发送/接受。T1IN接S3C44B0的TXD0端,R1OUT接S3C44B0的RXD0因为MAX232具有驱动能力,所以不需要外加驱动电路。系统串口模块电路如图3RS232电平转换电路。图3RS232电平转换电路RTL8019接口电路以太网控制芯片选用RealTek公司高度集成的全双工以太网控制器RTL80l9A,收发可同时达到l0Mbps速率。具有16位数据线接口和20位地址线接口,支持8/16位的数据模式,其数据端口与s3c44b0的低16位数据线相连,中断请求端口接 CPU的外部中断EINT3引脚。支持8条线路的中断请求,是一种应用比较广泛的网卡芯片。图4网卡接口电路硬件电路板的调试和测试RS232与TCP/IP协议转换电路提供了标准的20针JTAG接口,在JTAG板上具有JTAG口转并口电路。仿真调试软件主要采用ADS1.2中的AXD。只需用并口线将JTAG板与主机的并口相连(如图5),同时在主机上运行ARM7.exe(调试代理软件),下载串口测试程序,测试串口电路的稳定性。下载网络测试程序,同过ping看网卡RTL8019是否接通。但在测试各接口电路前,必须把启动代码BootLoader烧到flash存储器中。在这里顺便介绍一下BootLoader。BootLoader是存储在系统非易失性存储器中,在系统上电后执行系统初始化的启动代码。BootLoader的作用主要是完成用户程序在编译后下载到目标板上运行时,首先对系统进行存储器的映射并建立调试环境,然后通过ADS调试环境下载,显然,这个过程对普通用户来说显得特别烦琐,然而,要在裸板(没有任何程序的系统板)上调试运行程序,也只能采用这种方法。图5硬件调试接线图软件开发环境的建立4.1Uclinux简介及其优点本文开发的协议转换系统上移植了uClinux操作系统。uClinux是基于Linux内核并符合GNU/GPL公约的一种)开源操作系统,不同的是它对Linux的内存管理和进程管理等部分进行了改写,以满足没有内存管理单元(MMU)的微处理器的需要。另外,uClinux将Linux庞大的应用程序库glibc精简为uClibc,因此uClinux的内核比相应的Linux内核小得多,更适合存储容量有限的嵌入式系统。同时,uClinux保留了Linux系统良好的稳定性,强大的网络功能和优秀的文件系统支持等特点,在嵌入式设备中应用十分广泛,被称为“微控制领域的Linux系统”。uClinux具有良好的移植性,可以移植到不同的微处理器的开发板.有于采用模块化内核的设计,很多功能模块可以独立地加上或卸载,因此在编译系统内核时可以对内核再重新配置和裁减,选择嵌入式没备所需的功能支持模块,以减小内核大小,达到在嵌入式系统有限资源的基础上实现所需功能的目的。对于不同的处理器和开发板,uClinux的移植大致可分为3个层次:架构级。uClinux目前能支持较多的体系结构,但如果要移植的处理器不在uClinux支持的处理器体系之内,则需要添加或修改linux/arch目录下相关处理器架构的文件,包括中断处理、内存映射的维护、任务上下文和初始化过程等。平台级。对于uClinux已芰持体系的分支处理器,则需要在相关体系结构目录下建立相应目录并参照同一架构其他系列的处理器编写相应代码。板级。对于uClinux支持的处理器,只需要板级移植只针对不同的开发板硬件资源完成驱动程序编写和环境变量设置等内容本系统采用uClinux作为操作系统。与一般全靠硬件实现的串口服务器比较起来,配置要复杂,需要用户具有一定的技术背景,不过因为带有操作系统,其灵活性也是硬件串口服务器所不能比拟的。用户可以通过编写应用程序,来随意扩展所需的功能。Uclinux是一个完全符合GNU/GPL公约的操作系统,完全开发代码,并且免费。Uclinux即“微控制领域中的Linux系统”,具有以下优点:(1)
Linux是开放源代码的,不存在黑箱技术,遍布全球的众多Linux爱好者都是Linux开发者的强大技术支持者。(2)
Linux源代码随处可见,注释丰富,文档齐全,易于解决各种问题。(3)
Linux的内核小,效率高。(4)
Linux内核的结构在。,它提供了对包括十兆位、百兆位及千兆位的以太网络,还有无线网络,以及光纤等的支持。(5)
Linux在内核结构的设计中考虑适应系统的可裁减性的要求。可将无用的代码去除掉,近一步减少内核规模。4.2建立主机开发环境先安装Linux操作系统Redhat9.0,对uClinux的配置和编译要在linux操作系统下进行。解压uClinux移植包光盘中提供的uClinux-ARMSYS-20050101.tar.gz是移植自uClinux-dist-20040408.tar.gz,20040408版本在很多方面比早先的20030522版本完善很多,这也使我们的各种移植工作变得方便很多。这里我们使用的内核版本是Linux2.4.24。uClinux-ARMSYS-20050101.tar.gz是针对ARMSYS的硬件平台进行移植的,它对uClinux-dist-20040408.tar.gz所做的修改部分保存在uClinux-20040801-ARMSYS.patch补丁文件中,供用户参考。将uClinux-ARMSYS-20050101.tar.gz拷/opt/下(或者其它目录),运行解压命令:tarxvzfuClinux-ARMSYS-20050101.tar.gz解压结束后会在/opt/下生成uClinux-dist目录。(3)将arm-elf-tools-20030314.sh拷贝到根目录,运行安装:sharm-elf-tools-20030314.shuclinux内核裁减,编译,移植Linux内核采用模块话设计,几乎很多功能块可独立地安装或卸载。因此,对内核重新编译,删除不需要的功能模块,可使系统运行所需的内核显著减小,从于缩减资源的使用量,也实现了uclinux的量身定制。TCP/IP及串口驱动添加打开shell终端。#cd/home/uClinux-dist#makemenuconfig进入uClinux配置(uClinuxv3.1.0Configuration),选中“Kernel/Library/DefaultsSelectionà”敲空格进入。选中内核设置项和用户选项:[*]CustomizeKernelSettings[*]CustomizeVendor/UserSettings建议通过直接载入立宇泰公司提供的内核配置文件Config_Kernel和用户配置文件Userconfig_eth(到download/default.asp下载)来完成配置。将Kernelconfig_eth拷贝到uClinux-dist/Linux-2.4.x目录下,将Config_User拷贝到uClinux-dist/Config目录下。回到终端,按下ESC键两次,敲回车退出。进入内核配置(LinuxKernelv2.4.24-uc0Configuration),选中“LoadanAlternateConfigurationFile”,敲空格键进入,输入Kernelconfig_eth文件名,按回车退出。内核选项就被设置好了。按下ESC键,敲回车保存设置。自动切换到用户选项配置。同样选中“LoadanAlternateConfigurationFile”,敲空格键进入,输入Userconfig_eth文件名,按回车退出。用户选项就被设置好了。也可以手动修改。手动修改的步骤如下:进入内核配置(LinuxKernelv2.4.24-uc0Configuration)。配置GeneralSetup>选中“GeneralSetup>”,敲空格进入。选中第2项:[*]NetworkingSupport按ESC退出。配置Networkingoptions>选中“Networkingoptions>”,敲空格进入。需要选中其中的两项:<*>Packetsocket……[*]TCP/IPnetworking配置NetworkingdeviceSupport>选中“Filesystem>”,敲空格进入。选中:[*]Networkdevicesupport?选中“Ethernet(10or100Mbit)>”敲空格进入:选中:[*]OtherISAcards在下拉的选项中,选中:<*>NE2000/NE1000support敲三次ESC,敲回车,退出内核配置。配置NetworkApplications>选中“NetworkApplications>”敲空格进入,选中以下几项:[*]arp……[*]ifconfig[*]inetd……[*]ping……[*]route……编译uClinux在/opt/目录下,按下面的步骤对uClinux源码包进行编译:makedep………建立依赖关系makeclean(非必要)……………清除旧的编译结果makelib_only……编译库makeuser_only…编译用户程序makeromfs………产生rom文件系统makeimage………产生映像文件make………………编译内核编译成功后,在uClinux-dist/目录下将产生images目录,其中包含的3个文件:image.ram,image.rom和romfs.img就是我们可以用来下载和烧录的映像文件。移植uclinux内核设置tftp服务器TFTP协议是一个简单的基于UDP文件传输协议,其实现比较简单,使用方便.TFTP服务在LINU上有客户端和服务器端两个软件包.可以先看看你的PC机器上是否已经安装了TFTP客户端和服务器端:[root@SunLife~]#rpm-qtftptftp-0.39-1[root@SunLife~]#rpm-qtftp-servertftp-server-0.39-1[root@SunLife~]#如果已经安装,就可以配置它了.TFTP可以通过图形化的界面来配置.也可以手工配置.当然操作要有ROOT权限.手工修改TFTP配置文件,可以定制TFTP服务.其配置文件/etc/xintd.d/tftp内容如下:[root@SunLife~]#cat/etc/xinetd.d/tftp#default:off#description:Thetftpserverservesfilesusingthetrivialfiletransfer\#protocol.Thetftpprotocolisoftenusedtobootdiskless\#workstations,downloadconfigurationfilestonetwork-awareprinters,\#andtostarttheinstallationprocessforsomeoperatingsystems.servicetftp{disable=nosocket_type=dgramprotocol=udpwait=yesuser=rootserver=/usr/sbin/in.tftpdserver_args=-s/tftpbootper_source=11cps=1002flags=IPv4}[root@SunLife~]#TFTP服务器默认把/tftpboot作为输出文件的根目录,当然你也可以换成其他目录.TFTP服务器默认是关闭的.所以要将disable设为no.server是指定TFTP服务器的服务器程序为/usr/sbin/in.tftpd(它是一个守护进程).修改配置以后,就要重新启动TFTP服务:[root@SunLife~]#/etc/init.d/xinetdrestart停止xinetd:[确定]启动xinetd:[确定][root@SunLife~]#即可.开启minicomLinux系统下使用minicom串口通信工具,就像Windows下的超级终端。使用minicom之前,先要配置参数。在shell命令下执行“minicom-s”命令,选择“Serialportsetup”菜单项,通过相应的按键选择进入子项,B115200,选择/dev/ttyS0等。保存配置,退出。在shell命令下执行“minicom”命令,进入minicom控制台。下载image.ram映像文件连接好开发板的串口线,网线,电源线。启动开发板,按下enter键,进Bootloder下载模式下,把uClinux-dist/目录下将产生images目录,其中一个文件:image.ram,复制到linux操作系统的/tftpboot目录下,在minicom控制台下,敲入tftp命令即可下载映像文件,然后执行go0x0c008000启动uclinux内核,此时可以看到启动信息。软件程序构架软件结构由于程序的开发和执行是在PC和ARM两个不同的平台上进行的,因此需要进行交叉编泽和连接。uClinux为ARM核处理器提的一套完整的交义开发工具链arm—elf—toolchain,其中包括汇编编译器arm—elf—as,c/c++编译器arm—elf—gcc,连接工具arm—gcc—ld,反编泽二进制文件工具arm—elf—objdump等本文科序在RedHat9.0Linux操作系统下使用arm—elf—toolchain二具开发,程序没计采用多线程技术,Linux系统下的多线程遵循POSIX线程接口。作为一种多任务、并发的工作疗式,多线程程序可以提高应用程序相应,改善程序结构。本建立了两个子进程,分别用于理串口数据经网卡发送和网卡数据经串口发送两种功能,程序流程如图6所示。测试过程通过NFS网络文件系统进行,在Pc端配置NFS服务器,设置共享文件夹及权限,调试无误后,加入自己开发的程序重新编译uClinux内核,并将编译好的二进制文件固化到开发板的ROM中,使其开机后自动运行。图6串口/以太网转换设备软件流程图串口处理程序模块在Linux系统下,串口属于字设备,位于/dev目录下,串口操作包括打开和关闭串口,设置串口属性(如波特率设置,数据位、校验位和停止位设置)、读写串口等。Linux系统将设备看成文件处理,本文系统的两个串口COM1和COM2分别对应于uClinux系统下/dev/ttySO和/dev/ttyS1两个文件,打开或关闭设备的操作对应于打开或关闭相应的文件。以COM1为例,打开并初始化过程如下:(1)打开串口是通过使用标准的文件打开函数操作:fd=open(“/dev/ttyS0”.O_RDWR)://以读写方式打开串口//fl打开错误或异常判断If(fd<0){perror(“OpenserialPortCOMlFailed!”);exit(一1);}tcgetattr(0,&oldstdtio);//保存标准串口属性tcgetattr(fd,&oldtio);//保存原来串口属性tcgetattr(fd,&nev.stdtio);//设置新的串口属性newtio.c.cflag=BAUDRATE|CRTSCTS|CS8|CLOCAL|CREAD;//设置波特率数据位等//其他设置tcsetattr(fd,I'CSANOW,&newtio);//新属性没置生效(2)设置串口
最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置structtermios结构体的各成员值。
structtermio
{
unsignedshort
c_iflag;
/*输入模式标志*/
unsignedshort
c_oflag;
/*输出模式标志*/
unsignedshort
c_cflag;
/*控制模式标志*/
unsignedshort
c_lflag;
/*localmodeflags*/
unsignedchar
c_line;
/*linediscipline*/
unsignedchar
c_cc[NCC];
/*controlcharacters*/};(3)发送数据char
buffer[1024];int
Length;int
nByte;nByte=write(fd,buffer,Length);(4)读取串口数据使用文件操作read函数读取,如果设置为原始模式(RawMode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作。char
buff[1024];int
Len;int
readByte=read(fd,buff,Len);TCP/IP处理模块TCP/IP协议是目前lnternet上用最广泛的一套协议簇,它参考开放系统互连(os1)模型,采用一种简化的4层模型,分别为应用层、传输层、网络层、链路层,各层主要协议如图7所示。其中TCP(TransmissionControlProtocol,传输控制协议)和UDP(UserDatagramProtocol,用户数据报协议)是以太网上数据的两种传输协议。TCP是基于连接的协议,在正式收发数据前,必须和对方建立可靠的连接。UDP是面向非连接的数据直接传输协议,不需要双方的问答确认。图7TCP/IP体系结构模型Linux系统提供Socket套接字进行网络编程,Socket最早是在UNIX系统上为TCP/IP网络通信与开发的一个接口程序,后来被成功移植到DOS、Windows等操作系统上,成为lnternet上网络开发最为通用的API函数。用于网络开发的Socket主要有StreamSockets(流格式),DatagramSockets(数据报格式)和RawSockets(原始socket)3种类型,流格式Socket与TCP协议对应,数据报格式Socket与UDP协议对应,原始Socket则主要用于协议开发和一些底层操作。图8UDPServer程序开发步骤本文在开发时选择支持以下模式:TCPServer.TCPClient,UDPServer/Client。TCPServer,模式执行服务器功能,等待其他主机或网络设备建立TCP连接的请求并相应,连接建立后收发数据;TCPClient模式执行客户端功能,自动与远程事机或网络设备建立TCP联系,收发数据;UDPSelrver/Client模式可以同时发送数据到多个计算机或网络设备,发送时无须建立连接过程,发送完成后无须回应。以UDPServer广播发送方式为例,Socket程序处理流程如图8所示,该模式将串口接收到的数据通过,广播方式发送到局域网中的每台机器。以下介绍一下程序设计时常用的函数。socketintsocket(intdomain,inttype,intprotocol)domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等)。type:我们网络程序所采用的通讯协议。protocol:由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了。bindintbind(intsockfd,structsockaddr*my_addr,intaddrlen)sockfd:是由socket调用返回的文件描述符。addrlen:是sockaddr结构的长度。my_addr:是一个指向sockaddr的指针。listenintlisten(intsockfd,intbacklog)sockfd:是bind后的文件描述符。backlog:设置请求排队的最大长度。当有多个客户端程序和服务端相连时,使用这个表示可以介绍的排队长度。listen函数将bind的文件描述符变为监听套接字。返回的情况和bind一样。acceptintaccept(intsockfd,structsockaddr*addr,int*addrlen)sockfd:是listen后的文件描述符。connectintconnect(intsockfd,structsockaddr*serv_addr,intaddrlen)。sockfd:socket返回的文件描述符。serv_addr:储存了服务器端的连接信息。其中sin_add是服务端的地址。addrlen:serv_addr的长度。connect函数是客户端用来同服务端连接的。setsockopt(设置socket状态)表头文件#include<sys/socket.h>定义函数intsetsockopt(ints,intlevel,intoptname,constvoid*optval,,socklen_toptlen);函数说明setsockopt()用来设置参数s所指定的socket状态。参数level代表欲设置的网络层,一般设成SOL_SOCKET以存取socket层。参数optname代表欲设置的选项,有下列几种数值:SO_DEBUG打开或关闭排错模式SO_REUSEADDR允许在bind()过程中本地地址可重复使用SO_TYPE返回socket形态。SO_ERROR返回socket已发生的错误原因SO_DONTROUTE送出的数据包不要利用路由设备来传输。SO_BROADCAST使用广播方式传送SO_SNDBUF设置送出的暂存区大小SO_RCVBUF设置接收的暂存区大小SO_KEEPALIVE定期确定连线是否已终止。SO_OOBINLINE当接收到OOB数据时会马上送至标准输入设备SO_LINGER确保数据安全且可靠的传送出去。总的来说网络程序是由两个部分组成的--客户端和服务器端。它们的建立步骤一般是:服务器端socket-->bind-->listen-->accept。客户端socket-->connect。(1)UDP协议套接字的初始化,以广播的形式在局域网发送,具体见附录。voidsocket_init(void){…………bzero(&serverAddr,sizeof(serverAddr));serverAddr.sin_family=AF_INET;serverAddr.sin_port=htons(PORT);serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);//setclientbroadcastmodebzero(&clientAddr,sizeof(clientAddr));clientAddr.sin_family=AF_INET;clientAddr.sin_port=htons(PORT);clientAddr.sin_addr.s_addr=htonl(INADDR_BROADCAST);//setserverusebroadcastmodesocket_status=setsockopt(fd_server,SOL_SOCKET,SO_BROADCAST,(char)&option,sizeof(option));//setbroadcastmode…………socket_status=bind(fd_server,(structsockaddr*)&serverAddr,addr_len);}(2)开辟两个线程,具体见附录。voidpthread_open(void){ret=pthreat_create(&id_fromuart,NULL,Read_fro_uart_to_net,NULL);…………ret=pthreat_create(&id_fromnet,NULL,Read_fro_net_to_uart,NULL);}软件工作原理剖析本节在单串口TCP/IP协议转换的基础上,拓展成多串口编程思路,其实质是在定义串口数据帧发送格式时多了一个串口号,所以可以看作是单串口的编程框架图,有利于设计的升级。因此在这里就以分析多串口的方式来代替单串口协议转换。帧的统一化
系统4个串口源的数据要作为以太网帧的一部分,为了向设备提供透明的接口和区分数据源,需要制定统一的帧格式。帧格式如图9所示,其中串口号字段用来区分数据源;帧头、帧尾作为一个串口帧的起始分界(可自定义);数据部分是来自串口的原始数据流。同样,网口发送数据也要有一致的帧格式,如图10所示。显然,串口帧是作为UDP层的协议数据进行传输的。图9串口数据帧发送格式图10网口数据帧发送格式
系统数据流向分析
串口转换网关,实现串口和网口间的数据转换,关键是串口数据如何送到网络上、网络数据又怎样转到串口。其中,串口链路层完成串口数据收发功能,串口网络层作为TCP/IP应用层的一部分,实现串口帧的封装。发送是入协议栈的过程,如图11所示,接收是出协议栈的过程(图略),不同之处在于对数据的收/发处理。图11数据入协议栈的封装过程
串口到网口的数据转换传输:串口链路层,接收来自测控设备的数据,交给串口网络层,该层完成串口数据帧的封装并放入以太网的发送缓冲区。当系统规定的UDP打包时间到或已经有串口数据帧时,打UDP包,并逐层下送,直到把数据送上物理介质,完成比特流的传输。
为了能一次传输尽量多的数据,系统对数据长度作了严格定义:串口数据帧的数据段最大长度为300个字节;网口发送帧的数据段最多允许4个串口数据帧。同时,还要满足具体应用对实时性的要求:对每一个串口规定一个最长响应时间。时间到时,不管是否已接收:300个字节都要对串口数据进行封装,并放人以太网发送缓冲区;同时,为了避免系统由于等待以太网发送缓冲区串口帧数达到4,而造成串口数据不能实时发送,要求在一定的时间内进行一次以太网通信,而不必等待4个串口帧到齐才打包传输。
这样,系统对数据容量和时间的双重规定,能保证具体应用对实时性的要求,并能一次传输尽量多的数据,降低了由于时间上的“空等”造成系统实时性差的可能性。4个串口在串口层完成的功能是相同的,仅以COMl为例,给出串口层上数据流,如图12所示。图12串口数据流程图13说明了多串口数据帧等待打包传输的过程。图13以太网打包流程
网口数据到多串口的数据流向,是对以太网链路层的数据帧向上逐层解包的过程。如图7所示,将收到的以太网帧,依次去掉每层的协议头分解出应用层数据,再以0x24和OxOa为分界分离,根据串口号字段的值,将信息发送到相应的设备,完成预定的控制。图14网口到串口数据处理流程六总结本次毕业设计基本完成了预先设定的指标,在多串口扩展中,具体思路已初步形成,其程序设计已经开始。通过本次毕业设计,让我系统的了解了嵌入式系统产品开发的一般流程和注意事项,串口服务器也基本达到设计要求。在uclinux嵌入式系统移植过程中遇到了不少困难,特别是系统驱动程序的编写及调试,在操作系统下极不好调试。对于网络套接字的编程,驱动程序提供的API函数,由于不兼容性,在参考资料里又没有一本系统的书,所以编程很困难,对调试要求就更高。但通过自己对嵌入式开发经验的不断积累,在孙老师的帮助下,问题不断得到解决。本次设计主要是参考杭州立宇泰电子有限公司的ARMSYS-C开发板设计完成的,主要的创新点在:(1)采用了uclinux作为操作系统进行嵌入式系统开发。(2)借助串口扩展芯片GM8123,提出了多串口服务器的编思想。七致谢在设计和论文成文的过程中,由于初次用嵌入式系统进行开发,遇到了不少问难,在孙江波老师和杨昌老师的大力支持和帮助,才得以顺利完成,在次表示深深感谢!在毕业设计期间,和张超同学每天坚持学习,同时还教会了很多linux操作系统的知识,还有宿友王飞同学也给予了大力的支持和帮助,在次也一并表示感谢!八附录TCP/IP与RS232协议转换程序:#include<sys/param.h>#include<sys/stat.h>#include<sys/ioctl.h>#include<sys/types.h>#include<sys/socket.h>#include<sys/file.h>#include<netinet/in.h>#include<arpa/inet.h>#include<netinet/ip.h>#include<netdb.h>#include<memory.h>#include<malloc.h>#include<stdlib.h>#include<string.h>#include<time.h>#include<unistd.h>#include<fcntl.h>//#include<singnal.h>#include<unistd.h>#include<stdio.h>#include<errno.h>#include<pthread.h>#include<termios.h>#include<ctype.h>#include"math.h"#definePORT0#defineMAX_MSG_SIZE100#defineBAUDRATEB115200charmsg[MAX_MSG_SIZE];intfd_uart,fd_server;pthread_tid_fromuart,id_fromnet;//creattwopthreadstructsockaddr_inserverAddr,clientAddr;pthread_mutex_tmutex;//自旋锁/*函数名称:Uart_open()函数功能:传递参数:no*/voidUart_open(void){fd_uart=open("/dev/ttyS0",O_RDWR|O_NOCTTY);//if(fd_uart<0){printf("uart0openerror!\n");exit(1);}else{printf("uart0opensuccess!\n");}}/*函数名称:Uart_init()函数功能:setspeed,boardrate,mask,long传递参数:no*/voidUart_init(void){structtermiosoldtio,newtio;//***********************************//tcgetattr(fd_uart,&oldtio);cfmakeraw(&oldtio);//*********************************//bzero(&newtio,sizeof(structtermios));newtio.c_cflag|=(CLOCAL|CREAD);newtio.c_cflag|=BAUDRATE;newtio.c_cflag&=~CSTOPB;newtio.c_cflag&=~PARENB;newtio.c_cflag&=~CSIZE;newtio.c_cflag|=CS8;newtio.c_cflag&=~CRTSCTS;newtio.c_lflag=0;newtio.c_oflag=0;newtio.c_cc[VMIN]=4;newtio.c_cc[VTIME]=0;newtio.c_iflag&=~(IXON|IXOFF|IXANY);//********************setttyS0portbaudrate*****************//cfsetispeed(&newtio,BAUDRATE);cfsetospeed(&newtio,BAUDRATE);tcsetattr(fd_uart,TCSANOW,&newtio);//choiceanewconfigandmakeitworkimmediatlytcflush(fd_uart,TCIFLUSH);}/*函数名称:Socket_open()函数功能:builtUDPsocket传递参数:*/voidSocket_open(void){/*builtUDPsocket*/fd_server=socket(AF_INET,SOCK_DGRAM,0);//usrudpprotocolif((fd_server)<0){printf("uart0openerror!\n");exit(1);}else{printf("uart0opensuccess!\n");}}/*函数名称:socket_init()函数功能:setbroadcastmode,andblidipandport0,传递参数:*/voidsocket_init(void){intsocket_status,ipaddr_status;//structsockaddr_inserverAddr,clientAddr;intaddr_len=sizeof(structsockaddr_in);intoption=1;charbuffer[256];bzero(&serverAddr,sizeof(serverAddr));serverAddr.sin_family=AF_INET;serverAddr.sin_port=htons(PORT);serverAddr.sin_addr.s_addr=htonl(INADDR_ANY);//serverAddr.sin_addr.s_addr=inet_addr(SERVER_IP);//setclientbroadcastmodebzero(&clientAddr,sizeof(clientAddr));clientAddr.sin_family=AF_INET;clientAddr.sin_port=htons(PORT);clientAddr.sin_addr.s_addr=htonl(INADDR_BROADCAST);//setserverusebroadcastmodesocket_status=setsockopt(fd_server,SOL_SOCKET,SO_BROADCAST,(char)&option,sizeof(option));//setbroadcastmodeif(socket_status==-1){printf("setsocketopt()callfail!\n");exit(1);}socket_status=bind(fd_server,(structsockaddr*)&serverAddr,addr_len);if(socket_status==-1){printf("bind()callfail!\n");exit(1);}}/*函数名称:Read_fro_uart_to_net()函数功能:Thisisonepthreadfunction.receivecharfromuart,andsendthesechartonet传递参数:*/void*Read_fro_uart_to_net(void){char*buffer;intpacket_len,ret,ncount;packet_len=256;buffer=malloc(packet_len);if(buffer<0){printf("mallocbuffercreatfail\n");exit(1);}while(1){pthread_mutex_lock(&mutex);//openlockincasethecpuisusedbyonlypthreadprintf("readyforreceivedatd\n");ret=read(fd_uart,buffer,1);//receivedataif(ret==-1){printf("receivedatafail\n");exit(1);}//*****************startreceivedata********************//while(*buffer!='\n'){ncount++;buffer++;ret=read(fd_uart,buffer,1);if(ret==-1){printf("receivedatafail\n");exit(1);}}ret=sendto(fd_server,buffer,ncount,0,(stru
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 亲子教育居间劳务协议
- 2025年度北京市社区医疗服务合作协议范本
- 化妆品生产质量管理体系手册
- 垃圾处理厂工程居间协议
- 季度销售成绩回顾与未来展望报告
- 烟叶项目可行性研究报告
- 循环经济产业园项目可行性报告
- 电子杂志制作与推广手册
- 智能家居行业运营指南
- 个人学习成长计划表之阶段性目标
- 部编版三年级语文下册教学计划(含进度表)
- 2025年常州机电职业技术学院单招职业适应性考试题库及答案1套
- 2025年中考英语热点话题预测-哪吒(含答案)
- 【2025新教材】教科版一年级科学下册全册教案【含反思】
- 律师执业风险防范研究-深度研究
- 2024年全国职业院校技能大赛中职组(母婴照护赛项)考试题库(含答案)
- 2025年春新人教版语文一年级下册教学课件 语文园地二
- 2025年1月浙江高考英语听力试题真题完整版(含答案+文本+MP3)
- 2025年内蒙古兴安盟突泉县选聘生态护林员450人历年高频重点提升(共500题)附带答案详解
- 2025年兴湘集团全资子公司招聘笔试参考题库含答案解析
- 蒙医学中的推拿暖宫疗法与妇科保健技巧
评论
0/150
提交评论