资源描述
第七章第七章 嵌入式嵌入式LinuxLinux下的通信应用下的通信应用伴随着嵌入式系统技术的发展,纯单机工作已经远远不能满足用户的需求,因此各个系统之间的信息交互由于具有广泛的应用价值而成为嵌入式技术更深层次的应用。本章将介绍嵌入式Linux系统下的各种通信应用,串口通信、网络通信、蓝牙通信以及CAN总线通信。读者可以尝试把通信编程和之前的各种例子结合起来,完成功能更加完善的应用系统。主要内容主要内容 第一节嵌入式嵌入式Linux下的串口通信下的串口通信第二节嵌入式嵌入式Linux网络编程网络编程第三节嵌入式蓝牙技术嵌入式蓝牙技术第四节CAN总线总线主要内容:主要内容:一、串口简介一、串口简介二、串口编程二、串口编程第一节第一节 嵌入式嵌入式Linux下的串口通信下的串口通信随着计算机系统的应用和微机网络的发展,通信功能显得越来越重要。串口作为计算机一种常用的接口,具有连接线少、通信简单的优点,因此得到广泛应用。特别是在嵌入式系统的开发和应用中,经常需要使用宿主机实现目标机的调试及现场数据的采集和控制,从而通过串口线连接宿主机和目标机,达到通信的目的。现在的PC机一般有两个串行口:COM1和COM2,我们可以选择任何一个进行连接,然后在操作系统上面进行正确的配置。Windows操作系统和Linux操作系统都能够很好地支持串口,特别是在Linux环境下可以对串口通信简单地进行编程,下面就来介绍串口编程。第一节第一节 嵌入式嵌入式Linux下的串口通信下的串口通信一、串口简介一、串口简介在Linux系统环境下的所有设备都提供了相应的设备文件供用户访问,设备文件都位于/dev目录下。COM1和COM2对应的文件分别为/dev目录下的ttyS0和ttyS1,我们可以通过打开并读写这两个文件来对串口进行操作。使用open()函数打开串口的例子如下:int fd;/*以读写方式打开串口以读写方式打开串口*/fd=open(/dev/ttyS0,O_RDWR);if(-1=fd)/*不能打开串口一不能打开串口一*/perror(提示错误!提示错误!);第一节第一节 嵌入式嵌入式Linux下的串口通信下的串口通信二、串口编程二、串口编程Termios的结构如下:Struct termiostcflag_t c_iflag;/输入模式输入模式tcflag_t c_oiflag;/输出模式输出模式tcflag_t c_cflag;/控制模式控制模式tcflag_t c_lflag;/局部模式局部模式cc_t c_ccNCCS;/特殊控制字符特殊控制字符在上面的结构体成员中,c_cflag是最常用的,它用于控制串口的波特率、奇偶校验、停止位等。在c_cflag成员中,选项CLOCAL和CREAD是必须的,即本地和接收使能。例如,下面的代码将波特率设为115200、数据位为8位、偶校验并且停止位为1位:options.c_cflag|=B115200|CLOCAL|CREAD|CS8|PARENB;options.c_cflag&=PARODD;options.c_cflag&=CSTOPB;第一节第一节 嵌入式嵌入式Linux下的串口通信下的串口通信二、串口编程二、串口编程所有对串口的操作都是通过结构体termios和几个函数实现的,其中最常用的两个函数是tcgetattr()和tcsetattr()。在一般情况下,程序通过tcgetattr()函数获取设备当前的设置,然后修改这些设置,最后用tcsetattr()使这些设置生效。我们也可以用tcgetattr()函数保存设备的配置,最后在程序结束前用函数tcsetattr()恢复设备的配置。常用的操作结构体termios的函数如下:int tcgetattr(int fd,struct termios*t)该函数用于获得文件描述符fd所表示设备的当前设置值,并将此设置值写入指针t内。若成功,函数返回0,否则返回1。int tcsetattr(int fd,int options,struct termios*t)tcsetattr()函数用来将termios结构指针t内的设置值赋给当前用文件描述符fd表示的设备终端。参数options决定什么时候改变生效第一节第一节 嵌入式嵌入式Linux下的串口通信下的串口通信二、串口编程二、串口编程int cfsetispeed(struct termios*t,speed_t speed);int cfsetospeed(struct termios*t,speed_t speed)上面的两个函数分别用来设置设备的输入和输出速度,通过结构体t分别将设备的输入输出速度设为speed。它们只是设置了termios结构体的速度,若要修改设备的速度还需要调用tcsetattr()函数。int cfgetispeed(struct termios*t);int cfgetospeed(struct termios*t);上面两个函数分别用来获得设备的输入和输出速度。int tcflush(int fd,int queue);丢弃写入要引用的对象,其中参数fd为要处理的串口。第一节第一节 嵌入式嵌入式Linux下的串口通信下的串口通信二、串口编程二、串口编程主要内容:主要内容:一、网络通信一、网络通信二、二、Socket简介简介三、网络编程网络编程第二节第二节 嵌入式嵌入式Linux网络编程网络编程随着网络的发展,需要解决网络间不同主机进程间的相互通信问题。为此,首先要解决网络上不同进程的标识问题。在同一主机上,采用唯一的进程号(processID)来标识不同的进程,但是对于网络上的不同主机,可以用相同的进程号来表示没有任何关系的两个进程。同时,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。为了解决这些问题,TCP/IP协议引入了地址和端口的概念。地址用来区分网络上不同的主机,即我们常说的IP地址;端口用来区分同一主机上不同的运用程序,由于TCP/IP传输层的两个协议TCP和UDP是相互独立的,因此不同协议的相同端口号并不冲突。第二节第二节 嵌入式嵌入式Linux网络编程网络编程一、网络通信一、网络通信在UNIX系统中,网络应用编程界面有两类:UNIXBSD的Socket和UNIXSystemV的TLI。由于Sun公司采用了支持TCP/IP的UNIXBSD操作系统,使TCP/IP的应用有了更大的发展,其网络应用编程界面Socket在网络软件中被广泛应用,至今已引进到Windows和VxWorks等操作系统中,成为开发网络应用软件的强大工具。Socket相当于网络上的通信节点,即IP地址加上端口号。应用程序使用了Socket之后,就可以和网络上的任何一个通信节点连接。Socket之间的通信就如同一台PC机上两个进程间的通信一样。在Linux操作系统中,可以将Socket看成是一种设备,即一种可作双向传输的信道,Linux程序可以经过此设备与本地或是远程的程序进行通信。第二节第二节 嵌入式嵌入式Linux网络编程网络编程二、二、Socket简介简介目前,Internet仍使用IPv4作为寻址模式。在Socket中,寻址模式的结构为sockadd_in,定义如下:struct sockadd_insa_family_t sin_family;/*addressing mode*/unsigned short int sin_port;/*port number*/struct in_addr sin_addr;/*Internet address*/其中结构成员sin_family用来说明Socket所使用的寻址模式,在网络编程中,其值只能是AF_INET;成员sin_port表示TCP/IP的端口号;成员sin_addr是in_addr结构,用来表示IP地址;而in_addr的结构很简单,只有一个unsignedlong型的成员变量。由于IP地址的形式是xxx.xxx.xxx.xxx,它是字符型的数据,要将一个用字符型表示的IP地址转换为unsignedlong型的成员,需要使用如下函数:unsigned long inet_addr(const char*string);第二节第二节 嵌入式嵌入式Linux网络编程网络编程三、网络编程网络编程端口号的获取需要使用下面两个函数。因为一般的Intel架构的CPU采用的是小端模式,而Motorola和Sun公司的机器则使用的是大端模式,为了消除这个差别,必须使用下面两个位排序函数来设置端口号:unsigned long htonl(unsigned long hostlong);unsigned short htons(unsigned short hostshort);其中,函数htonl()处理长整型的数据,而函数htons()用于处理短整型的数据。用于获取IP地址和端口号的一段代码如下:strunt sockaddr_in adr_srvr;adr_srvr.sin_addr.s_addr=inet_addr(192.168.1.10);adr_srvr.sin_port=htons(8000);网络程序的设计可以采用两种协议:TCP和UDP。TCP是一种可靠的、面向连接的协议,而UDP则是不可靠的、无连接的。第二节第二节 嵌入式嵌入式Linux网络编程网络编程三、网络编程网络编程1,采用,采用TCP协议的网络程序设计协议的网络程序设计在设计网络程序时,一般按照客户端和服务器端进行设计,客户端和服务器端的设计流程是不一样的。第二节第二节 嵌入式嵌入式Linux网络编程网络编程三、网络编程网络编程因为TCP协议是面向连接的,所以在建立连接之前,经历的过程比较多。网络程序无论是使用TCP还是UDP协议,要通过Socket传输数据,都必须建立Socket,可以使用socket()函数建立一个Socket。该函数的原型如下:int socket(int domain,int type,int protocal);参数domain的值在网络程序中只能为AF_INET,表示使用Internet协议;参数type为连接的类型,这里的值应为SOCK_STREAM,表示采用TCP建立连接;参数protocal代表通信协议,一般设为0,表示自动选择。bind()函数用于将IPv4Socket寻址结构绑定到其所建立的Socket,这样当有数据包到达时,Linux内核会将这个数据包让给其绑定的Socket来处理。bind()函数的原型如下:int bind(int sockfd,const struct sockaddr_in*my_addr,int adr_len);参数sockfd是调用函数socket()的返回值;参数my_addr用来存放绑定的IPv4寻址结构;参数adr_len为结构sockaddr_in的长度。第二节第二节 嵌入式嵌入式Linux网络编程网络编程三、网络编程网络编程使用listen()函数来监听、等待客户端的连接请求。该函数的原型如下:int listen(int sockfd,int backlog);参数sockfd为socket()函数的返回值;参数backlog用来指定最大连接数,一般设为5。当服务器端接收到客户端的连接请求时,会把连接请求放在连接队列中,接着用accept()函数处理并接受队列中的请求。int accept(int sockfd,struct sockadd_in*addr,int addrlen);参数addr用来存放客户端的IP地址,其他两个参数的设置同bind()函数的这两个参数。connect()函数是客户端使用的函数。当客户端建立好Socket后,会调用这个函数向服务器端请求连接。该函数的原型如下:int connect(int sockfd,struct sockaddr_in*serv_addr,int addrlen);参数serv_addr用来存放服务器端的IP地址,其他两个函数的设置方法同上。使用close()函数终止客户端与服务器端的连接。函数运行成功返回0,否则返回1。该函数的原型如下:int close(int sockfd);第二节第二节 嵌入式嵌入式Linux网络编程网络编程三、网络编程网络编程2,采用,采用UDP协议的网络程序设计协议的网络程序设计采用UDP协议进行网络程序设计第二节第二节 嵌入式嵌入式Linux网络编程网络编程三、网络编程网络编程下面主要介绍这个过程中用到的两个特别函数recvfrom()和sendto()。recvfrom()函数的原型如下:int recvfrom(int sockfd,void*buf,int len,unsigned flags,struct sockadd_in*from,int fromlen);参数sockfd为函数socket()的返回值;参数buf用来存放接收的信息;参数len表示接收信息的长度,一般设为sizeof(buf);参数flags一般设为0;参数from为发送端的IP地址;参数fromlen为发送端IP地址的长度,一般设为sizeof(from)。sendto()函数的原型如下:int sendto(int sockfd,void*buf,int len,unsigned flags,struct sockaddr_in*to,int tolen);参数buf用来存放要发送的信息;参数to为接收端的IP地址;其余参数的用法同recvfrom()函数。第二节第二节 嵌入式嵌入式Linux网络编程网络编程三、网络编程网络编程主要内容:主要内容:一、蓝牙技术一、蓝牙技术 二、蓝牙体系结构二、蓝牙体系结构 三、蓝牙通信网络三、蓝牙通信网络 四、四、Linux Bluetooth 软件层软件层 五、五、USB适配器适配器 第三节第三节 嵌入式蓝牙技术嵌入式蓝牙技术蓝牙(bluetooth)技术是由爱立信、Intel、诺基亚、东芝和IBM五家公司于1998年5月共同提出开发的。它是一种用于替代便携或固定电子设备上使用的电缆或连线的短距离无线连接技术。在办公室、家庭和旅途中,通过蓝牙遥控装置可以形成一点到多点的连接,即在该装置周围组成一个“微网”,网内任何蓝牙收发器都可与该装置互通信号。蓝牙计划主要面向网络中各类数据及语音设备,如PC机、笔记本电脑、打印机、传真机、数码相机、移动电话、家电设备等,使用无线微波的方式将它们连成一个微网,多个微网之间也可以互连,从而方便快速地实现各类设备之间的通信。第三节第三节 嵌入式蓝牙技术嵌入式蓝牙技术一、蓝牙技术一、蓝牙技术蓝牙协议体系结构同样采用分层方式,包括蓝牙专用协议和一些通用协议。专用协议位于协议栈的底部,从底到上依次是蓝牙无线层(BluetoothRadio)、基带层(Baseband)、LMP层(LinkManagerProtocol)、L2CAP层(LogicallinkControlandAdaptationProtocol)、RFCOMM(serialcableemulation)、SDP层(ServiceDiscoveryProtocol)。另外,RFCOMM层以ETSITS07.10为基础,目的是取代电缆连接;TCS(TelephonyControlProtocolSpecification)以ITUT的Q.931为基础,目的是进行呼叫控制。在蓝牙专用协议之上可以承载PPP、TCP/IP、UDP/IP、WAP等通用高层协议。无线层规范物理层无线传输技术。蓝牙工作在2.4GHz的ISM频段,大部分国家采用24002483.5MHz,f2402kMHz,k=078,即将该频段划分为79个带宽为1MHz的信道;在低频端留有2MHz的保护带,在高频端留有3.5MHz的保护带。调制方式采用GFSK,BT=0.5,正频偏表示“1”,负频偏表示“0”。系统采用跳频扩频技术,抗干扰能力强、保密性好。第三节第三节 嵌入式蓝牙技术嵌入式蓝牙技术二、蓝牙体系结构二、蓝牙体系结构基带层采用查询和寻呼方式,使调频时钟及调频频率同步,为数据分组提供对称连接(SCO)和非对称连接(ASL)并完成数据包的定义、前向纠错、循环冗余校验、逻辑通道选择、信号噪化、加密、编码和解码等功能。它采用混合电路交换和分组交换方式,既适合语言传送,也适合一般的数据传送。每一个语音通道支持64kb/s同步语音,异步通道支持最大速率723.kb/s(反向57.6kb/s)的非对称连接或433.9kb/s的对称连接。LMP负责蓝牙设备之间的链路建立,包括鉴权、加密等安全技术及基带层分组大小的控制和协商。它还控制无线设备的功率以及蓝牙节点的连接状态。L2CAP与LMP平行工作,共同实现OSI的数据链路层的功能,它可提供对称连接和非对称连接的数据服务。RFCOMM在蓝牙的基带上仿真RS232的功能,实现设备串行通信。例如,在拨号网络中,主机将AT命令发送到调制解调器,再传送到局域网,建立连接后,应用程序就可以通过RFCOMM提供的串口发送和接收数据。SDP是蓝牙体系中非常关键的部分,只有通过SDP了解通信双方的设备信息、业务类型、业务特征,然后才能在蓝牙设备之间建立通信连接。第三节第三节 嵌入式蓝牙技术嵌入式蓝牙技术二、蓝牙体系结构二、蓝牙体系结构个人通信的目标就是利用各种可能的网络技术,实现人与人之间在任何时间、任何地点进行任何种类的通信。在近距离通信中,蓝牙无线接入技术使无线单元间的通信变得十分容易,将计算机技术与通信技术更紧密地结合在一起,人们可随时随地进行信息的交换与传输。除此之外,蓝牙移动终端还能通过无线方式访问局域网以及Internet等网络,例如:1.实现蓝牙协议与TCP/IP协议的转换。2.在安全的基础上实现蓝牙地址与IP地址之间的地址解析。3.通过路由表对网络内部的蓝牙移动终端进行跟踪、定位。4.在两个不同的piconet(匹克网)的蓝牙移动终端之间交换路由信息。如果目的端位于单位内部的局域网或者Internet,则需要通过蓝牙网关进行蓝牙协议与TCP/IP协议的转换,如果没有IP地址,则由蓝牙网关来提供IP地址,其通信方式为TBGMT。如果目的端位于办公网络内部的另一个匹克网,则通过蓝牙网关来建立路由连接,从而完成整个通信过程的漫游其通信方式为MTBGM_MT(为主移动终端)MT。第三节第三节 嵌入式蓝牙技术嵌入式蓝牙技术三、蓝牙通信网络三、蓝牙通信网络BlueZ是官方LinuxBluetooth栈,由HCI(HostControlInterface)层、Bluetooth协议核心、L2CAP(LogicalLinkControlandAdaptationProtocol)、SCO音频层、其他Bluetooth服务、用户空间后台进程以及配置工具组成。Bluetooth规范支持针对BluetoothHCI数据分组的UART(通用异步接收器/传送器)和USB传输机制。BlueZ栈对这两个传输机制(drivers/Bluetooth/)都支持。BlueZBNEP(Bluetooth网络封装协议)实现了Bluetooth上的以太网仿真,这使TCP/IP可以直接运行于Bluetooth之上。BNEP模块(net/bluetooth/bnep/)和用户模式pand后台进程实现了Bluetooth个人区域网(PAN)。BNEP使用register_netdev将自己作为以太网设备注册到Linux网络层,并使用上面为WLAN驱动程序描述的netif_rx来填充sk_buffs并将其发送到协议栈。BlueZRFCOMM(net/bluetooth/rfcomm/)提供Bluetooth上的串行仿真,这使得串行端口应用程序(如minicom)和协议(如点对点协议PPP)不加更改地在Bluetooth上运行。RFCOMM模块和用户模式dund后台进程实现了Bluetooth拨号网络。第三节第三节 嵌入式蓝牙技术嵌入式蓝牙技术四、四、Linux Bluetooth 软件层软件层BluetoothUSB适配器拥有一个BluetoothCSR芯片组,并使用USB传输器来传输HCI数据分组。因此,LinuxUSB层、BlueZUSB传输器驱动程序以及BlueZ协议栈是使设备工作的主要内核层。LinuxUSB子系统类似于PCMCIA子系统,它们都有与移动设备交互的主机控制器设备驱动程序,并且都包含一个向主机控制器和单个设备的设备驱动程序提供服务的核心层。USB主机控制器遵循两个标准之一:UHCI(UniversalHostControlInterface)或OHCI(OpenHostControlInterface)。由于具有PCMCIA,单个USB设备的Linux设备驱动程序不依赖于主机控制器。经由USB设备传输的数据分为四种类型(或管道):Control、Interrupt、Bulk和Isochronous。前两种类型通常用于小型消息,而后两种类型则用于较大型的消息。USB设备插入时,主机控制器使用控制管道来枚举它并给它分配设备地址(1127)。主机控制器设备驱动程序读取的设备描述符包含关于设备的信息。Linux的usbcore内核模块支持USB主机控制器和USB设备,并包含USB设备驱动程序可以使用的函数和数据结构。第三节第三节 嵌入式蓝牙技术嵌入式蓝牙技术五、五、USB适配器适配器USB驱动程序利用usbcore及自己的class/subclass/protocol信息注册了两个入口点:probe和disconnect。当附加相应的USB设备时,usbcore用枚举期间从设备配置描述符中读取的class信息来匹配已注册的class信息,并将设备与相应的驱动程序绑定。这个核心使用一种叫做URB(即USBRequestBlock,在include/linux/usb.h中定义)的数据结构来异步地管理主机和设备之间的数据传输。设备驱动程序使用这些例程来请求各种类型的数据传输。传送请求完成后,核心会使用以前注册的回调函数来通知驱动程序。对BluetoothUSB设备而言,HCI命令使用Control管道传输,HCI事件使用Interrupt管道,Asynchronous(ACL)数据使用Bulk管道,而Synchronous(SCO)音频数据使用Isochronous管道。Bluetooth规范为BluetoothUSB设备定义了class/subclass/protocol代码0 xE/0 x01/0 x01。BlueZUSB传输驱动程序(drivers/bluetooth/hci_usb.c)将该class/subclass/protocol信息注册到LinuxUSB核心。BelkinUSB适配器插入时,主机控制器设备驱动程序会枚举它。因为在枚举期间从适配器读取的设备描述符与hci_usb驱动程序注册到USB核心的信息相匹配,所以这个驱动程序可附加到BelkinUSB设备。由hci_usb驱动程序从以上描述的各个端点读取的HCI、ACL和SCO数据被透明传送到BlueZ协议栈。一旦完成这些工作,通过使用以上描述的BlueZ服务和工具,LinuxTCP/IP应用程序就可以运行在BlueZBNEP上,而串行应用程序则可以运行在BlueZRFCOMM上。第三节第三节 嵌入式蓝牙技术嵌入式蓝牙技术五、五、USB适配器适配器主要内容:主要内容:一、一、CAN总线简介总线简介二、二、CAN总线硬件特征总线硬件特征三、三、CAN控制器驱动控制器驱动第四节第四节 嵌入式蓝牙技术嵌入式蓝牙技术控制器局域网(ControllerAreaNet,CAN)是一种现场总线,主要用于检测及控制各种过程。CAN最初是由德国BOSCH公司为汽车监测和控制而设计的,目前已逐步应用到其他工业控制中,现已成为ISO11898国际标准。CAN总线的优点如下:1.低成本。2.极高的总线利用率。3.数据传输距离很长(长达10公里)。4.数据传输速率高(高达1Mbit/s)。5.可根据报文的ID决定接收或屏蔽该报文。6.可靠的错误处理和检错机制。7.发送的信息遭到破坏后可自动重发。8.节点在错误严重的情况下具有自动退出总线的功能。9.报文不包含源地址或目标地址,仅用标识符来指示功能信息和优先级信息。10.在一个由CAN总线构成的单一网络中,理论上可以挂接无数个节点。第四节第四节 嵌入式蓝牙技术嵌入式蓝牙技术一、一、CAN总线简介总线简介CAN总线的基本组成如图717所示。它包含三个部分:节点控制器S3C2410微处理器、CAN控制器MCP2510或MCP2515芯片、CAN收发器TJA1050或TJA1040芯片。第四节第四节 嵌入式蓝牙技术嵌入式蓝牙技术二、二、CAN总线硬件特征总线硬件特征6kb/s)的非对称连接或433.int socket(int domain,int type,int protocal);MCP2510片选DISABLE。int bind(int sockfd,const struct sockaddr_in*my_addr,int adr_len);前两种类型通常用于小型消息,而后两种类型则用于较大型的消息。例如,下面的代码将波特率设为115200、数据位为8位、偶校验并且停止位为1位:BlueZ是官方Linux Bluetooth栈,由HCI(Host Control Interface)层、Bluetooth 协议核心、L2CAP(Logical Link Control and Adaptation Protocol)、SCO音频层、其他Bluetooth 服务、用户空间后台进程以及配置工具组成。由于具有PCMCIA,单个USB设备的Linux设备驱动程序不依赖于主机控制器。第四节 嵌入式蓝牙技术 二、CAN总线硬件特征该函数用于获得文件描述符fd所表示设备的当前设置值,并将此设置值写入指针t内。CAN最初是由德国BOSCH公司为汽车监测和控制而设计的,目前已逐步应用到其他工业控制中,现已成为ISO-11898国际标准。wait_queue_head_t wq;bind()函数的原型如下:由于IP地址的形式是xxx.由hci_usb驱动程序从以上描述的各个端点读取的HCI、ACL和SCO数据被透明传送到BlueZ协议栈。驱动程序会根据module_init()函数所指定的参数作为入口函数,在CAN控制器驱动中,这个入口函数为s3c2410_mcp2510_init(),它主要完成一些基本的初始化工作。CAN控制器驱动的初始化工作主要有:1.软件复位,进入配置模式。2.设置CAN总线波特率。3.关闭中断。4.设置ID过滤器。5.切换MCP2510到正常状态(Normal)。6.清空接受和发送缓冲区。7.开启接收缓冲区,开启中断(可选)。1.初始化工作完成之后,会引入驱动程序的操作集。第四节第四节 嵌入式蓝牙技术嵌入式蓝牙技术三、三、CAN控制器驱动控制器驱动应用层的read()函数首先调用s3c2410_mcp2510_read,该函数负责用户区和内核区之间的数据传送。之后调用RevRead函数和s3c2410_isr_mcp2510函数对数据缓冲区进行操作,在这个过程中会调用MCP2510_Read函数,它的工作包括:1.在local处理器上关闭中断。2.MCP2510片选ENABLE。3.CAN总线发送流程。4.MCP2510片选DISABLE。5.打开中断。其中,CAN总线发送流程的具体操作顺序如下:1.1)在s3c2410_fops结构中添加写接口。2)用户程序使用CanData数据结构给驱动模块传递参数。3)从用户空间读取待发送的内容。4)对用户空间传递的数据加以解析。5)MCP2510通过SPI接口与处理器传递数据。第四节第四节 嵌入式蓝牙技术嵌入式蓝牙技术三、三、CAN控制器驱动控制器驱动对于写操作,应用层的write()函数首先调用s3c2410_mcp2510_write,该函数负责用户区和内核区之间数据传送。之后调用MCP2510_canWrite函数和MCP2510_Write_Can函数。在该函数中完成CAN的数据结构之后,调用MCP2510_Write函数,它的工作包括:1.在local处理器上关闭中断。2.MCP2510片选ENABLE。3.CAN总线单字节写入操作。4.MCP2510片选DISABLE。5.打开中断。其中,CAN总线单字节写入操作的顺序如下:1.1)SPI总线发送数据函数:SendSIOData()。2)发送单字节写入命令:0 x02。3)发送写入的地址。4)发送写入的内容。第四节第四节 嵌入式蓝牙技术嵌入式蓝牙技术三、三、CAN控制器驱动控制器驱动除了read和write操作,ioctl的操作也很重要。CAN控制器的ioctl函数如下:static int s3c2410_mcp2510_ioctl(struct inode*inode,struct file*file,unsigned int cmd,unsigned long arg)其中,参数inode为设备节点,arg为io参数,file为CAN控制器设备的设备文件指针,cmd为io选项第四节第四节 嵌入式蓝牙技术嵌入式蓝牙技术三、三、CAN控制器驱动控制器驱动下面再介绍驱动中常用到的两个数据结构:CanData和Mcp2510_DEV。typedefstructunsignedintid;/CAN总线IDunsignedchardata8;/CAN总线数据unsignedchardlc;/数据长度intIsExt;/是否是扩展帧intrxRTR;/是否是远程帧CanData,*PCanData;typedefstructCanDataMCP2510_CandataMCP2510_CanRevBuffer;/recievedatabufferintnCanRevpos;/recievebufferposforqueuedeventsintnCanReadpos;/readbufferposforqueuedeventsintloopbackmode;wait_queue_head_twq;spinlock_tlock;Mcp2510_DEV;staticMcp2510_DEVmcp2510dev;第四节第四节 嵌入式蓝牙技术嵌入式蓝牙技术三、三、CAN控制器驱动控制器驱动n本章主要讲述嵌入式linux系统下的各种通信应用,包括串口通信、网络通信、蓝牙通信与CAN总线通信,其中CAN总线是本章的重点和难点。每种通信所对应的协议内容和工作方式是理解每种通信应用过程的关键,建议读者仔细分析,其它的如GPRS、VoIP也可以参照上述思路进行学习。小结小结1.请完成串口通信实验。2.请完成嵌入式网络编程。3.举例描述socket 程序中的大数量和小数据量传输方式的选择和原因。4.请完成蓝牙通信实验。5.请完成Can总线通信实验。6.请举例简述Can数据传输一次数据的大小和回环方式的选择。7.请基于Can总线通信和Qt用户界面实现聊天室程序。8.思考嵌入式Linux下的其它通信方式与协议,并列表进行区分。习题习题
展开阅读全文