毕业设计(论文)-基于CAN总线节点通信的设计与实现.doc_第1页
毕业设计(论文)-基于CAN总线节点通信的设计与实现.doc_第2页
毕业设计(论文)-基于CAN总线节点通信的设计与实现.doc_第3页
毕业设计(论文)-基于CAN总线节点通信的设计与实现.doc_第4页
毕业设计(论文)-基于CAN总线节点通信的设计与实现.doc_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

唐 山 学 院毕 业 设 计设计题目:基于CAN总线节点通信的设计与实现 系 别: 计算机科学与技术系 班 级: 06计本1班 姓 名: 指 导 教 师: 2012年6月* 日3唐 山 学 院 毕 业 设 计基于CAN总线节点通信的设计与实现摘 要本设计是基于CAN总线节点的网络通信。设计的硬件用到了ARM处理器,CAN总线模块(主要有控制器MCPC2510,收发器82C250等),PC机,虚拟机。设计实现了用ARM处理器通过SPI串口总线1将信息发送各给CAN总线,利用芯片MCP2510作为控制器控制收发器采集CAN总线上的信息,然后通过设置好的CAN总线模块的自回环模式实现将采集到的信息自收自发。ARM处理器会通过TCP协议,CAN总线是一种新兴的现场总线2,短短时间内就成为了国际上应用最广泛的现场总线之一,其成本低,能耗小,稳定性高,抗干扰强,传输速度快,传输距离远。被广大的技术人员所喜爱。CAN总线开始只是应用于汽车行业,后来由于其众多的优点被逐渐拓展到各个领域,广为人们认知和应用。TCP同UDP协议一样属于运输层协议。不同的是它是基于字节流的,是一种面向连接的,可靠的通信协议。TCP协议通过三个报文段完成连接的建立,这个过程称为三次握手。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算和校验。本设计采用了TCP协议就是因为它的可靠性。套接字(Socket)是为了在多个TCP连接或多个应用程序进程需要通过同一个 TCP协议端口传输数据时,为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCPIP协议交互提供的接口。关键词:CAN总线,MCP2510,TCP协议,虚拟机。Based on the CAN bus communication design and ImplementationAbstractThe design is based on CAN bus network communication. Design of the hardware used in the ARM processor, CAN bus module ( the main controller MCPC2510, transceiver82C250, PC machine, a virtual machine ).Design and implementation of a ARM processor through the SPI serial bus to send information to the CAN bus, using chip MCP2510 as the controller controls the transceiver to collect the information of the CAN bus, and then through the set of CAN bus module self loopback mode to achieve the information collected since the resumption of spontaneous. The ARM processor via the TCP protocol,CAN bus is a new kind of field bus, a short time has become the international most widely used one of the field bus, its low cost, low energy consumption, high stability, strong interference resistance, high transmission speed, the transmission distance. The vast majority of technical staff favorite. CAN bus is used in the automotive industry, and later because of its numerous advantages are gradually extended to various fields widely, cognition and application.TCP and UDP protocol as a transport layer protocol. Different is that it is based on a stream of bytes, is a connection-oriented, reliable communication protocol. The TCP protocol through the three message segment linking the establishment, this process is called the three handshake. TCP uses a checksum function to test whether there is an error in the data; sending and receiving are the calculation and validation. This design uses the TCP protocol because of its reliability.Socket ( Socket ) to a TCP connection or a plurality of application process through the same TCP protocol port data transfer, in order to distinguish the different application processes and connections, many computer operating system to the application and the TCP / IP protocol interaction interface.Key words: CAN bus, MCP2510, TCP protocol, virtual machine- 51 -目 录1绪论31.1 can总线概述:32.2 套接字Socket概述:42 CAN总线原理基础52.1 CAN总线发展史52.2 CAN总线的优势62.3 CAN总线的电气特点62.4 can总线的MAC帧结构72.5 can控制器MCP2510简介73 linux网络编程基础113.1 linux简介113.2 TCP/IP协议113.2.1 TPC/IP简介113.2.2 TCP和UDP简介123.2.3 三次握手133.3 socket套接字143.3.1 socket简介143.3.2 Socket套接字主要类型153.3.3 套接字的使用步骤154系统的设计184.1 系统的总体设计概述185系统各部分的详细设计195.1 超级终端的建立195.2 CAN模块详细设计195.2.1 can的初始化195.2.2 CAN数据接收215.2.3 CAN数据发送225.2.4 CAN总线数据的自发自收245.3 TCP协议网络传输详细设计:265.3.1 ARM目标板服务器的设计265.3.2 虚拟机客户端的设计286系统测试316.1 CAN自发自收的测试316.2 TCP协议通信测试316.3 总体测试317 结束语32谢辞33参考文献34附录35外文资料41中文翻译471绪论1.1 can总线概述:随着人们生活水平的不断进步,科学技术的不断创新发展,导致了自动化系统的深刻变革。为了满足科技多元化的要求,在以往现场总线的基础上不断创新,克服生活、生产中遇到的各种技术性难题,譬如电控系统的车身布线庞大复杂,安装控件短缺,等等。于是CAN总线在上个世纪80年代应运而生了。CAN总线全称Controller Area Network,也即控制器局域网3,是现在全球应用最广泛的现场总线之一。它最早是德国Bosch公司推出的,并最终成为国际标准(ISO11898)。其起先只是应用于车载各电子装置ECU之间交换信息,现在是否使用了CAN总线已经成为了判断一部车是否达到数字化的基本标准,后来由于其优良的电子特性和超值的性价比,不断的被拓展应用于其他各个行业。CAN的只要优点有主要包括以下:成本低。可用双绞线、同轴电缆、光纤,这就是使CAN总线系统在建设和维护过程中显得极为便利。极高的总线利用率。总线仅仅被那些请求总线悬而未决的节点利用,这些请求是根据报文在整个系统中的重要性按顺序处理的。这种方法在网络负载较重时有很多优点,因为总线读取的优先级已被按顺序放在每个报文中了,这可以保证在实时系统中较低的个体隐伏时间。很远的数据传输距离,最长可达10km。很告诉的传输速度,当传输距离为10km的时候传输速度为5kbps,但是当传输距离在40m之内时,can总线的传输速度是可以达到1Mbps这个相当可观的速度。CAN总线的标准帧的帧ID标示符位数为11位,这就决定了CAN总线上的接点数可以达到110个,若是使用扩展帧ID的话,该报文帧ID的标示符位数是29位,所以CAN总线的节点数基本上是没有限制。可以跟根据报文的ID决定接受或者屏蔽该报文。具有可靠的错误处理和检错机制。CAN协议采用CRC检验并可提供相应的错误处理功能,保证了数据通信的可靠性。发送的信息遭到破坏后可自动重发节点在眼中错误的情况下具有自动退出总线的功能。报文不包含源地址或目标地址仅用标识符来指示功能信息优先级信4。此外,CAN只有2根线与外部相连,并且内部集成了错误探测和管理模块。CAN总线采用了多主竞争式总线结构,具有多主站运行和分散仲裁的串行总线以及广播通信的特点。CAN总线上任意节点可在任意时刻主动地向网络上其它节点发送信息而不分主次,因此可在各节点之间实现自由通信。CAN总线协议已被国际标准化组织认证,技术比较成熟,控制的芯片已经商品化,性价比高,特别适用于分布式测控系统之间的数通讯。CAN总线插卡可以任意插在PC AT XT兼容机上,方便地构成分布式监控系统。由于具有如此众多的优点,CAN卓越的特性、极高的可靠性和独特的设计,特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。CAN总线被国际上公认为几种最有前途的现场总线之一。由于其高性能、高可靠性、实时性等优点现已广泛应用于工业自动化、多种控制设备、交通工具、医疗仪器以及建筑、环境控制等众多部门。控制器局域网近几年在中国迅速普及推广。2.2 套接字Socket概述:套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端面点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。套接字是网络I/O的基础。常用的TCP/IP协议的套接字类型有3种类型:流式套接字,它使用了传输控制协议,即TCP。流式套接字用于提供面向连接、可靠的数据传输服务,该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。数据包套接字,它使用UDP协议进行数据的传输。数据包套接字提供了一种无连接的服务,该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。以上2种又称为标准套接字。原始套接字,它与标准套接字的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP协议的数据,数据包套接字只能读取UDP协议的数据。所以原始套接字主要应用于协议的开发。套接字区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。本设计为了稳定可靠的传送数据采用了流式套接字。 2 CAN总线原理基础2.1 CAN总线发展史CAN总线是一种高性能、高可靠性、实时性等优点现已广泛应用于工业自动化、多种控制设备、交通工具、医疗仪器以及建筑、环境控制等众多部门的现场总线,它是于80年代为现代汽车应用被德国博世公司领先推出的一种多主机局部网。随着计算机硬件、软件技术及集成电路技术的迅速发展,CAN逐渐的被推广到各个不同领域,这就导致各种应用领域通信报文需要被标准化。为此,1991年 9月 PHILIPS SEMICONDUCTORS制订并发布了包含标准和扩展两种报文格式的 CAN技术规范(VERSION 2.0)。2.0A就是曾在CAN技术规范版本1.2中定义给出的的CAN报文格式,能提供11位地址,使can能够挂接110个节点;而2.0B给出了标准的和扩展的两种报文格式,提供29位地址,这就使can节点的个数基本没有了限制。又过了两年,ISO于1993年11月正式颁布了道路交通运载工具-数字信息交换-高速通信控制器局部网(CAN)国际标准(ISO11898),为控制器局部网标准化、规范化推广铺平了道路。随着集成电路技术以及计算机硬、软件技术的飞速发展,工业控制系统已成为计算机技术应用领域中最具活力的一个分支,并取得了巨大进步。由于对系统可靠性和灵活性的高要求,工业控制系统的发展主要表现为:控制面向多元化,系统面向分散化,即负载分散、功能分散、危险分散和地域分散。分散式工业控制系统就是为适应这种需要而发展起来的。这类系统是将计算机技术、自动控制技术、通信技术、显示技术和转换技术紧密结合的产物。它的核心是微型计算机,所以在适应范围、可扩展性、可维护性以及抗故障能力等方面,较之分散型仪表控制系统和集中型计算机控制系统都具有明显的优越性。现场设备、接口与计算设备以及通信设备组成了典型的分散式控制系统。现场总线能同时满足过程控制和制造业自动化的需要,因此现场总线已成为工业数据总线领域中最为活跃的一个领域。尽管目前对现场总线的研究尚未能提出一个完善的标准,但现场总线的高性能价格必将吸引众多工业控制系统采用。现场总线的开发拓展与应用已成为工业数据总线领域的热点。总之,正是由于当时现场总线的标准尚未统一,也使得现场总线的应用得以不拘一格地发挥,并为现场总线的完善提供更加丰富的依据。同时低廉的成本,优越的电气特性,超强的稳定性使得控制器局部网 CAN(CONTROLLER AERANETWORK)在当时的社会及科技背景下应运而生了。 2.2 CAN总线的优势 CAN属于现场总线的范畴,它是一种有效支持分布式控制或实时控制的串行通信网络。基于CAN总线的分布式控制系统,网络各节点之间的数据通信实时性强,开发周期短,并且CAN是到目前为止惟一有国际标准的现场总线。2.3 CAN总线的电气特点CAN总线一种串行数据通信协议,它是一种多主总线,通信介质可以是双绞线、同轴电缆或光纤。CAN总线采用差分电压传送,两条信号线一条用CAN_H(后边简称H线)表示 一条用CAN_L(后面简称L线)表示,当两条信号线电压均为2.5V时,为静态,我们称之为“隐性”,用逻辑1来表示。当H线电压高于L线电压的时候,通常是3.5V、1.5V,这个时候为“显性”,用逻辑0来表示。CAN总线通过CAN收发器接口芯片P82C250的两个输出端CAN_H和CAN_L与物理总线相连。CAN总线的接受过滤器可根据CAN的这种电气特性根据节点发送方的ID报文帧决定是否接受该数据,这为CAN总线的仲裁奠定了技术基础5,在以后的章节会有详细的介绍。CAN总线的一个位时间由同步段,传播段,相位段1和相位段2组成。每段的时间份额是可以通过CAN总线控制器来实现编程控制的。而时钟系统tsys和波特率预分值BRP则决定了时间份额的大小:tp=BRP/tsys。如图2-1所示:图2-1 can总线的一个位时间CAN总线2个节点之间的数据传输速度是和2个节点之间的距离有关的,图2-2表示的是两节点直接传输速度和其距离的关系:传输速度/kbps10005002501251005020105节点之间距离/m4013027053062013003300670010000图2-2 can总线节点之间传说速度与距离的关系2.4 can总线的MAC帧结构常用的CAN总线帧数据主要有2中格式:标准格式和扩展格式。标准格式帧数据由ID为11位的仲裁场,控制场,数据场,crc场,ack场组成。扩展格式帧数据由ID为29位的仲裁场,控制场,数据场,crc场,ack场组成。如图2-3所示:图2-3 can总线的帧数据结构在标准格式中,报文的起始位称为帧起始(SOF),然后是由11位标识符和远程发送请求位 (RTR)组成的仲裁场。RTR位标明是数据帧还是请求帧,在请求帧中没有数据字节。 控制场包括标识符扩展位(IDE),指出是标准格式还是扩展格式。它还包括一个保留位 (ro),为将来扩展使用。它的最后四个字节用来指明数据场中数据的长度(DLC)。数据场范围为08个字节,其后有一个检测数据错误的循环冗余检查(CRC)。 应答场(ACK)包括应答位和应答分隔符。发送站发送的这两位均为隐性电平(逻辑1),这时正确接收报文的接收站发送主控电平(逻辑0)覆盖它。用这种方法,发送站可以保证网络中至少有一个站能正确接收到报文。 报文的尾部由帧结束标出。在相邻的两条报文间有一很短的间隔位,如果这时没有站进行总线存取,总线将处于空闲状态。2.5 can控制器MCP2510简介Mcp2510是一种带有SPI接口的CAN总线控制器,灵活的中断能力、接收帧屏蔽和过滤、帧优先级设定等特性使其能够很好的对信息进行管理,减轻了处理器的负担和软件设计的复杂度。它支持CAN技术规范V2.0A和V2.0B,也即支持标准格式和扩展格式的CAN数据帧结构。同时具有接受滤波和管理信息的功能,它支持回环模式可以实现数据的自发自收。MCP2510通过SPI接口与MCU进行数据传输,MCU可用过MCP2510与can总线上的其他MCU单元进行数据传输。MCP2510内含3个发送缓冲器与2个接收缓冲器,同时还具有灵活的中断管理能力,这些特点使得MCU对CAN总线的操作变的非常简便。图2-4为MCP2510内部结构图:图2-4 MCP2510内部结构图(1)收发操作 MCP2510的发送操作通过3个发送缓冲器来实现。这3个发送缓冲器各占据14字节的SRAM。第1字节是控制寄存器TXBNCTRL,该寄存器用来设定信息发送的条件,且给出了信息的发送状态;第26字节用来存放标准的和扩展的标识符以及仲裁信息;最后8字节则用来存放待发送的数据信息。在进行发送前,必须先对这些寄存器进行初始化。(2)中断管理 MCP2510有8个中断源,包括发送中断、接收中断、错误中断及总线唤醒中断等。利用中断使能寄存器(CANINTE)和中断屏蔽寄存器(CANINTF)可以方便地实现对各种中断的有效管理。当有中断发生时,INT引脚变为低电平并保持在低电平,直到MCU清除中断为止。(3)错误检测 CAN协议具有CRCF错误、应答错误、形式错误、位错误和填充错误等检测功能。MCP2510内含接收出错计数器(REC)和发送出错计数器(TEC)两个错误计数器。因而对网络中的任何一个节点来说,都有可能因为错误计数器的数值不同而使其处于错误一激话、错误一认可和总线一脱离3种状态之一6。MCP2510正常工作之前,需要进行正确的初始化。单片机对MCP2510的接收缓冲器和发送缓冲器的操作,必须通过SPI接口用MCP25lO内置读写命令来完成。其读、写命令时序图如图2-5和图2-6所示:图2-5 SPI读命令时序图图2-6 SPI写命令时序图在不的时钟下,CAN总线通讯波特率可以动过设置MCP2510中的CNF1,CNF2,CNF3三个寄存器来设置。具体图2-7所示:图2-7 MCP2510的波特率设置在MCP2510中内含2个Mask过滤器和6个Filter过滤器。可以控制CAN节点是否接受一个或一组ID的数据。这样实现了CAN总线的仲裁,具体规律如图2-8所示:图2-8 Mask和Filter过滤器的控制规则从图中可以看出当Mask过滤器的电压显示为显性逻辑0时,会全部接受数据;当Mask的电压为隐性逻辑1时,只有与Filter电压显隐性相同的ID才会被接受7。MCP2510中内含3个发送缓冲区,可以循环使用。也可以只使用一个发送缓冲区,但是必须保证下次一次数据发送时,上一次的数据发送已经结束;MCP2510中含有2个接受缓冲区,也可以循环使用。数据的发送和接受均可以使用查询或者中断模式。3 linux网络编程基础3.1 linux简介Linux是一种自由和开放源码的类Unix操作系统。目前存在着许多不同的Linux,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,从手机、平板电脑、路由器和视频游戏控制台,到台式计算机、大型机和超级计算机。Linux是一个领先的操作系统,世界上运算最快的10台超级计算机运行的都是Linux操作系统。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux操作系统是UNIX操作系统的一种克隆系统。它诞生于1991 年的10 月5 日(这是第一次正式向外公布的时间)。以后借助于Internet 网络,并经过全世界各地计算机爱好者的共同努力下,现已成为今天世界上使用最多的一种UNIX 类操作系统,并且使用人数还在迅猛增长。 Linux 操作系统的诞生、发展和成长过程始终依赖着以下五个重要支柱:UNIX 操作系统、MINIX 操作系统、GNU 计划、POSIX 标准和Internet 网络。3.2 TCP/IP协议3.2.1 TPC/IP简介TCP/IP是Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。图3-1为TCP/IP协议分层模型。图3-1 TCP/IP协议分层模型3.2.2 TCP和UDP简介TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于点对点的通讯。 TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。 如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向上传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象,实际应用中要求在程序员编程验证。 UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询-应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。 所以,欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。3.2.3 三次握手TCP是面向连接的通信协议,通过三次握手建立连接。所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。建立连接时三次握手的过程:第一次握手:客户端TCP首先给服务器端发送一个特殊的TCP数据段。该数据段不包含应用层数据,并将头部中的SYN位设置为1,所以该数据段被称为SYN数据段。另外,客户选择一个初始序列号SEQ,设SEQ=x并将这个编号放到初始的TCP SYN数据段的序列号字段中。该数据段被封装到一个IP数据段中,并发送给服务器。第二次握手:一旦装有TCP SYN数据段的IP数据报到达了服务器主机,服务器将从该数据报中提取出TCP SYN数据段,给该连接分配TCP缓冲区和变量,并给客户TCP发送一个允许连接的数据段。这个允许连接的数据段也不包含任何应用层数据。但是它的头部中装载着3个重要信息。首先,SYN被设置为1.其次,TCP数据段头部的确认字段被设置为X+1;最后,服务器选择自己的初始序列号,AEQ=y,并将其值放到TCP数据段头部的序列号字段中。第三次握手:在接收到允许连接数据段之后,客户端也会给连接分配缓冲区和变量。客户端主机还会给服务器发送另一个数据段,对服务器的允许连接数据段给出确认。图3-2 是建立连接时三次握手的模型图:图3-2 TCP协议三次握手建立连接过程图释放连接时三次握手过程:第一次握手:由进行数据通信的任意一方提出要求释放连接的请求报文段。第二次握手:接收端收到此请求后,会发送确认报文段,同时当接收端的所有数据也都已经发送完毕后,接受端会向发送端发送一个带有其自己序号的报文段。第三次握手:发送端收到接收端的要求释放连接的报文段后,发送反向确认。图3-3是建立连接时三次握手的模型图:图3-3 TCP协议三次握手释放连接过程图3.3 socket套接字3.3.1 socket简介多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了使得多主机多通信时,不至于发生混乱情况,必须把端口号和主机的IP地址结合起来使用,成为插口或套接字(Socket)。由于主机的IP地址是唯一的,这样目的主机就可以区分收到的数据报的源端机了。套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端面点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是 “插座”。通过将这3个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。3.3.2 Socket套接字主要类型Socket的常用类型有三种:1流式套接字(stream socket)定义:#define SOCK_STREAM 1流式套接字提供了双向、有序的、无重复的以及无记录边界的数据流服务,适合处理大量数据。它是面向联结的,必须建立数据传输链路,同时还必须对传输的数据进行验证,确保数据的准确性。因此,系统开销较大。2数据报套接字(datagram socket)定义:#define SOCK_DGRAM 2数据报套接字也支持双向的数据流,但不保证传输数据的准确性,但保留了记录边界。由于数据报套接字是无联接的,例如广播时的联接,所以并不保证接收端是否正在侦听。数据报套接字传输效率比较高。3原始套接字(raw-protocol interface)定义:#define SOCK_RAM 3原始套接字保存了数据包中的完整IP头,前面两种套接字只能收到用户数据。因此可以通过原始套接字对数据进行分析。3.3.3 套接字的使用步骤1启动Winsock:对Winsock DLL进行初始化,协商Winsock的版本支持并分配必要的资源。(服务器端和客户端)2创建套接字:(服务器端和客户端)SOCKET socket( int af, int type, int protocol );3套接字的绑定:将本地地址绑定到所创建的套接字上。(服务器端和客户端)int bind( SOCKET s, const struct sockaddr FAR * name, int namelen )s为已经创建的套接字,name为socket地址结构,为sockaddr结构,namelen为地址结构的长度。4套接字的监听:(服务器端)int listen(SOCKET s, int backlog )s为一个已绑定但未联接的套接字。backlog为指定正在等待联接的最大队列长度。5套接字等待连接::(服务器端)SOCKET accept( SOCKET s, struct sockaddr FAR * addr, int FAR * addrlen )s为处于监听模式的套接字,sockaddr为接收成功后返回客户端的网络地址,addrlen为网络地址的长度。6套接字的连结:将两个套接字连结起来准备通信。(客户端)int connect(SOCKET s, const struct sockaddr FAR * name, int namelen )s为欲连结的已创建的套接字,name为欲连结的socket地址,namelen为socket地址的结构的长度。7套接字发送数据:(服务器端和客户端)int send(SOCKET s, const char FAR * buf, int len, int flags )s为服务器端监听的套接字,buf为欲发送数据缓冲区的指针,len为发送数据缓冲区的长度,flags为数据发送标记,返回值为发送数据的字符数。8套接字的数据接收:(客户端)int recv( SOCKET s, char FAR * buf, int len, int flags )s为准备接收数据的套接字,buf为准备接收数据的缓冲区,len为准备接收数据缓冲区的大小,flags为数据接收标记,返回值为接收的数据的字符数。9中断套接字连接:通知服务器端或客户端停止接收和发送数据。(服务器端和客户端)int shutdown(SOCKET s, int how)s为欲中断连接的套接字,How为描述禁止哪些操作,取值为:SD_RECEIVE、SD_SEND、SD_BOTH。10关闭套接字:释放所占有的资源。(服务器端和客户端)int closesocket( SOCKET s ) 8s为欲关闭的套接字。图3-4为流程图:图3-4 面向连接的套接字的系统调用时序图4系统的设计4.1 系统的总体设计概述基于CAN总线节点通信的设计与实现,主要设计目的是用户可以通过PC机超级终端检测CAN总线的信息自发自收判断系统是否运行正常,也可以通过网络接收CAN总线采集发送的信息。主要设计思想是运用CAN总线技术,嵌入式技术,TCP通信技术,结合到一起从而实现建立在CAN总线基础上的网络信息采集和发送。系统框架图如图4-1所示:图4-1 系统框架图本系统中,CAN总线节点是不分主从的,控制器MCP2510控制收发器自发信息并且自收信息,模拟实现了节点之间的信息通信,并且可以监控CAN总线是否正常工作。然后ARM通过双绞线应用TCP协议将CAN总线收集到的信息发送到服务器虚拟机上。5系统各部分的详细设计5.1 超级终端的建立本设计是用超级终端作为“显示器”观察CAN总线自发自收信息和虚拟机收到信息的情况。点击开始-所有程序-附件-通讯-超级终端。具体设置如图4-2所示图4-2超级终端的设置建立好超级终端,复位ARM目标板,完成CAN的初始化,连接成功。5.2 CAN模块详细设计5.2.1 can的初始化为了保证CAN总线的正常工作,CAN总线在传输之前还需要进行初始化,这包括硬件的初始化,软件的初始化,对工作需要的验收滤波器的设置、中断的设置,波特率的设置等。当启动设备后,软件复位,进入配置模式,然后设置波特率:typedef enumBandRate_125kbps=1,BandRate_250kbps=2,BandRate_500kbps=3,BandRate_1Mkbps=4CanBandRate;然后设置CAN总线的数据帧格式,包括设置CAN总线的ID,设置CAN总线的总线数据,设置数据长度,是否为远程帧等:typedef structunsigned int id;unsigned char data8;unsigned char dlc;int IsExt;int rxRTR;CanData,*PCanData;然后设置接收过滤器:typedef structunsigned int Mask;unsigned int Filter;int IsExt;CanFilter,*PCanFilter;接着是设置自回环模式来实现数据的自收自发:#define UPCAN_IOCTRL_SETLPBK 0x3CAN的初始化流程为图4-3所示:启动设备设置CAN总线波特率设置CAN总线数据帧的格式软件复位,进入配置模式设置接收过滤器设置为自回环模式进入工作状态CAN的初始化流程图5.2.2 CAN数据接收控制器MCP2510之中内含3个发送缓冲区和2个接受缓冲区,均可循环使用。首先程序会定义CAN总线数据帧结构体的变量,用来存放接收的数据:CanData data;int i;当CAN总线上有数据时,CAN设备会调用函数CanRev读取CAN总线上的数据帧:read(can_fd,&data,sizeof(CanData);然后会选择一个缓冲区,用来接收数据,将数据写入接收缓冲区。最后程序会显示输出接受到的数据:putchar(data.datai);CAN总线接收数据的流程图如图所示:设置CAN的数据帧结构体变量调用接收函数CAN总线上是否有数据读取CAN总线上的数据帧选择接收缓冲区将数据写入缓冲区否是输出CAN总线收到的数据,完成工作图4-4 CAN总线接收数据流程图5.2.3 CAN数据发送当有数据需要被发送时,程序会调用发送函数CanSendString。然后进行一系列初始化定义,包括设置CAN总线数据帧结构体变量,设置数据帧的大小,然后清零数据帧结构体,设置数据帧的ID,设置CAN总线数据帧长毒最大值等:CanData data;int len=strlen(pstr);memset(&data,0,sizeof(CanData);data.id=0x123;data.dlc=8;然后进行发送数据,当发送的数据长度超过数据帧最大长度8字节时,会先发送8个字节,然后剩下的数据以8字节为单位循环发送,知道发送完毕:for(;lenMAX_CANDATALEN;len=len-MAX_CANDATALEN)memcpy(data.data,pstr,8);write(can_fd,&data,sizeof(data);pstr=pstr+8;data.dlc=len;memcpy(data.data,pstr,len);write(can_fd,&data,sizeof(CanData);过程流程如下图4-5:调用发送函数设置CAN的数据帧结构体变量设置CAN数据帧的大小清零结构体变量设置CAN数据帧的ID设置CAN总线数据帧的长度选择发送缓冲区将数据写入缓冲区发送的数据是否超过最大8字节发送8字节数据是发送数据否发送完毕工作结束图CAN总线发送数据流程图5.2.4 CAN总线数据的自发自收设计采用控制器MCP2510的回环模式,当CAN总线收到数据时,会实现一次CAN总线数据的自发自收。首先使用pthread_create函数创建一个线程,创建完毕后就会运行线程函数。pthread_t th_can;线程是进程中某个单一顺序的控制流,指运行中的程序的调度。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就、阻塞和运行三种基本状态。每一个程序都至少有一个线程,那就是程序本身。创建运行线程后,打开CAN设备文件can_fd=open(CAN_DEV,O_RDWR)然后通过CAN的驱动程序IOCTL函数设置CAN数据帧的ID,设置自发自收模式。ioctl(can_fd,UPCAN_IOCTRL_PRINTRIGISTER,1);通过进程中的线程来接收CAN发送过来的数据,然后就是完成自发自收的这个循环过程。for(;)int len;scanf(%s,str);if(strcmp(quitcmd,str)=0)break;len=strlen(str);strlen=n;strlen+1=0;CanSendString(str);流程图如下:定义一个线程打开CAN设备文件通过IOCTL函数设置CAN数据帧的ID,自发自收模式通过进程中的线程来接收CAN发送过来的数据接受完毕发送数据图 CAN总线数据的自发自收流程图5.3 TCP协议网络传输详细设计:本设计中使用的针对TCP面向连接的流式套接字。流式是一种面向连接的socket,针对于面向连接的TCP服务应用;数据报式socket是一种无连接的socket,对应于无连接的UDP服务应用。网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符。socket也具有一个类似于打开文件的函数调用socket(),该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket实现的。5.3.1 ARM目标板服务器的设计在ARM作为目标板服务器通过socket套接字通信的时候,首先程序要定义一个端口,端口的作用是用来区别一个机器的某一个应用程序的。#define DEFAULT_PORT 5050随后需要定义服务器、客户端的socket套接字变量,用来保存socket信息。struct sockaddr_in ser;struct sockadd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论