博创嵌入式培训PPT——第7章 嵌入式Linux下的通信应用(模板).ppt_第1页
博创嵌入式培训PPT——第7章 嵌入式Linux下的通信应用(模板).ppt_第2页
博创嵌入式培训PPT——第7章 嵌入式Linux下的通信应用(模板).ppt_第3页
博创嵌入式培训PPT——第7章 嵌入式Linux下的通信应用(模板).ppt_第4页
博创嵌入式培训PPT——第7章 嵌入式Linux下的通信应用(模板).ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、第7章嵌入式Linux下的通信应用,第七章 嵌入式Linux下的通信应用,伴随着嵌入式系统技术的发展,纯单机工作已经远远不能满足用户的需求,因此各个系统之间的信息交互由于具有广泛的应用价值而成为嵌入式技术更深层次的应用。本章将介绍嵌入式Linux系统下的各种通信应用,串口通信、网络通信、蓝牙通信以及CAN总线通信。读者可以尝试把通信编程和之前的各种例子结合起来,完成功能更加完善的应用系统。 主要内容 第一节 嵌入式Linux下的串口通信 第二节 嵌入式Linux网络编程 第三节 嵌入式蓝牙技术 第四节 CAN总线,1,主要内容: 一、串口简介 二、串口编程,第一节 嵌入式Linux下的串口通信

2、,2,随着计算机系统的应用和微机网络的发展,通信功能显得越来越重要。串口作为计算机一种常用的接口,具有连接线少、通信简单的优点,因此得到广泛应用。特别是在嵌入式系统的开发和应用中,经常需要使用宿主机实现目标机的调试及现场数据的采集和控制,从而通过串口线连接宿主机和目标机,达到通信的目的。 现在的PC机一般有两个串行口:COM1和COM2,我们可以选择任何一个进行连接,然后在操作系统上面进行正确的配置。Windows操作系统和Linux操作系统都能够很好地支持串口,特别是在Linux环境下可以对串口通信简单地进行编程,下面就来介绍串口编程。,3,第一节 嵌入式Linux下的串口通信 一、串口简介

3、,在Linux系统环境下的所有设备都提供了相应的设备文件供用户访问,设备文件都位于/dev目录下。COM1和COM2对应的文件分别为/dev目录下的ttyS0和ttyS1,我们可以通过打开并读写这两个文件来对串口进行操作。使用open()函数打开串口的例子如下: int fd; /*以读写方式打开串口*/ fd = open( /dev/ttyS0, O_RDWR); if (-1 = fd) /* 不能打开串口一*/ perror( 提示错误!); 对串口进行设置是一种常见的操作,一般的设置包括波特率设置、校验位和停止位设置。可以通过POSIX标准终端接口(POSIX是Portable Op

4、eration System Interface of Unix的缩写,它制定了具有移植性操作系统所应具备的条件)进行相关操作,此接口称为termios,并在内核目录下的include/asm/termios.h文件中定义,4,第一节 嵌入式Linux下的串口通信 二、串口编程,Termios的结构如下: Struct termios tcflag_t c_iflag; /输入模式 tcflag_t c_oiflag; /输出模式 tcflag_t c_cflag; /控制模式 tcflag_t c_lflag; /局部模式 cc_t c_ccNCCS; /特殊控制字符 在上面的结构体成员中,

5、c_cflag是最常用的,它用于控制串口的波特率、奇偶校验、停止位等。 在c_cflag成员中,选项 CLOCAL和CREAD是必须的,即本地和接收使能。例如,下面的代码将波特率设为115200、数据位为8位、偶校验并且停止位为1位: options.c_cflag |= B115200|CLOCAL|CREAD|CS8| PARENB; options.c_cflag ,5,第一节 嵌入式Linux下的串口通信 二、串口编程,所有对串口的操作都是通过结构体termios和几个函数实现的,其中最常用的两个函数是tcgetattr()和tcsetattr()。在一般情况下,程序通过tcgetat

6、tr()函数获取设备当前的设置,然后修改这些设置,最后用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()函数用来将termi

7、os结构指针t内的设置值赋给当前用文件描述符fd表示的设备终端。参数options决定什么时候改变生效,6,第一节 嵌入式Linux下的串口通信 二、串口编程,int cfsetispeed(struct termios *t ,speed_t speed); int cfsetospeed(struct termios *t ,speed_t speed) 上面的两个函数分别用来设置设备的输入和输出速度,通过结构体t分别将设备的输入输出速度设为speed。它们只是设置了termios结构体的速度,若要修改设备的速度还需要调用tcsetattr()函数。 int cfgetispeed(str

8、uct termios *t); int cfgetospeed(struct termios *t); 上面两个函数分别用来获得设备的输入和输出速度。 int tcflush(int fd,int queue); 丢弃写入要引用的对象,其中参数fd为要处理的串口。,7,第一节 嵌入式Linux下的串口通信 二、串口编程,主要内容: 一、网络通信 二、Socket简介 三、网络编程,第二节 嵌入式Linux网络编程,8,随着网络的发展,需要解决网络间不同主机进程间的相互通信问题。为此,首先要解决网络上不同进程的标识问题。在同一主机上,采用唯一的进程号(process ID)来标识不同的进程,但

9、是对于网络上的不同主机,可以用相同的进程号来表示没有任何关系的两个进程。同时,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。为了解决这些问题,TCP/IP协议引入了地址和端口的概念。 地址用来区分网络上不同的主机,即我们常说的IP地址;端口用来区分同一主机上不同的运用程序,由于TCP/IP传输层的两个协议TCP和UDP是相互独立的,因此不同协议的相同端口号并不冲突。,第二节 嵌入式Linux网络编程 一、网络通信,9,在UNIX系统中,网络应用编程界面有两类:UNIX BSD的Socket和UNIX System V的TLI 。由于Sun公司采用了支持TCP/IP的UNI

10、X BSD操作系统,使TCP/IP的应用有了更大的发展,其网络应用编程界面Socket在网络软件中被广泛应用,至今已引进到Windows和VxWorks等操作系统中,成为开发网络应用软件的强大工具。 Socket相当于网络上的通信节点,即IP地址加上端口号。应用程序使用了Socket之后,就可以和网络上的任何一个通信节点连接。Socket之间的通信就如同一台PC机上两个进程间的通信一样。 在Linux操作系统中,可以将Socket看成是一种设备,即一种可作双向传输的信道,Linux程序可以经过此设备与本地或是远程的程序进行通信。,第二节 嵌入式Linux网络编程 二、Socket简介,10,目

11、前,Internet仍使用IPv4作为寻址模式。在Socket中,寻址模式的结构为sockadd_in,定义如下: struct sockadd_in sa_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是

12、in_addr结构,用来表示IP地址;而in_addr的结构很简单,只有一个unsigned long型的成员变量。 由于IP地址的形式是xxx.xxx.xxx.xxx,它是字符型的数据,要将一个用字符型表示的IP地址转换为unsigned long型的成员,需要使用如下函数: unsigned long inet_addr(const char *string);,第二节 嵌入式Linux网络编程 三、网络编程,11,端口号的获取需要使用下面两个函数。因为一般的Intel架构的CPU采用的是小端模式,而Motorola和Sun公司的机器则使用的是大端模式,为了消除这个差别,必须使用下面两个位

13、排序函数来设置端口号: 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); 网络程序的设计可以采用两种协议:TC

14、P和UDP。TCP是一种可靠的、面向连接的协议,而UDP则是不可靠的、无连接的。,第二节 嵌入式Linux网络编程 三、网络编程,12,1,采用TCP协议的网络程序设计 在设计网络程序时,一般按照客户端和服务器端进行设计,客户端和服务器端的设计流程是不一样的。,第二节 嵌入式Linux网络编程 三、网络编程,13,因为TCP协议是面向连接的,所以在建立连接之前,经历的过程比较多。网络程序无论是使用TCP还是UDP协议,要通过Socket传输数据,都必须建立Socket,可以使用socket()函数建立一个Socket。该函数的原型如下: int socket(int domain,int ty

15、pe,int protocal); 参数domain的值在网络程序中只能为AF_INET,表示使用Internet协议;参数type为连接的类型,这里的值应为SOCK_STREAM,表示采用TCP建立连接;参数protocal代表通信协议,一般设为0,表示自动选择。 bind()函数用于将IPv4 Socket寻址结构绑定到其所建立的Socket,这样当有数据包到达时,Linux内核会将这个数据包让给其绑定的Socket来处理。bind()函数的原型如下: int bind(int sockfd,const struct sockaddr_in *my_addr,int adr_len); 参

16、数sockfd是调用函数socket()的返回值;参数my_addr用来存放绑定的IPv4寻址结构;参数adr_len为结构sockaddr_in的长度。,第二节 嵌入式Linux网络编程 三、网络编程,14,使用listen()函数来监听、等待客户端的连接请求。该函数的原型如下: int listen(int sockfd,int backlog); 参数sockfd为socket()函数的返回值;参数backlog用来指定最大连接数,一般设为5。 当服务器端接收到客户端的连接请求时,会把连接请求放在连接队列中,接着用accept()函数处理并接受队列中的请求。 int accept( in

17、t 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,否则

18、返回-1。该函数的原型如下: int close(int sockfd);,第二节 嵌入式Linux网络编程 三、网络编程,15,2,采用UDP协议的网络程序设计 采用UDP协议进行网络程序设计,第二节 嵌入式Linux网络编程 三、网络编程,16,下面主要介绍这个过程中用到的两个特别函数recvfrom()和sendto()。 recvfrom()函数的原型如下: int recvfrom(int sockfd,void *buf,int len,unsigned flags,struct sockadd_in *from, int fromlen); 参数sockfd为函数socket()

19、的返回值;参数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网络编程 三、网络编

20、程,17,主要内容: 一、蓝牙技术 二、蓝牙体系结构 三、蓝牙通信网络 四、Linux Bluetooth 软件层 五、USB适配器,第三节 嵌入式蓝牙技术,18,蓝牙(bluetooth)技术是由爱立信、Intel、诺基亚、东芝和IBM五家公司于1998年5月共同提出开发的。它是一种用于替代便携或固定电子设备上使用的电缆或连线的短距离无线连接技术。在办公室、家庭和旅途中,通过蓝牙遥控装置可以形成一点到多点的连接,即在该装置周围组成一个“微网”,网内任何蓝牙收发器都可与该装置互通信号。 蓝牙计划主要面向网络中各类数据及语音设备,如PC机、笔记本电脑、打印机、传真机、数码相机、移动电话、家电设备

21、等,使用无线微波的方式将它们连成一个微网,多个微网之间也可以互连,从而方便快速地实现各类设备之间的通信。,第三节 嵌入式蓝牙技术 一、蓝牙技术,19,蓝牙协议体系结构同样采用分层方式,包括蓝牙专用协议和一些通用协议。专用协议位于协议栈的底部,从底到上依次是蓝牙无线层(Bluetooth Radio)、基带层(Baseband)、LMP 层(Link Manager Protocol)、L2CAP 层(Logical link Control and Adaptation Protocol)、RFCOMM(serial cable emulation)、SDP 层(Service Discove

22、ry Protocol)。另外,RFCOMM 层以ETSI TS07.10 为基础,目的是取代电缆连接;TCS(Telephony Control Protocol Specification)以ITU-T的Q.931 为基础,目的是进行呼叫控制。在蓝牙专用协议之上可以承载PPP、TCP/IP、UDP/IP、WAP等通用高层协议。 无线层规范物理层无线传输技术。蓝牙工作在2.4GHz 的ISM 频段,大部分国家采用24002483.5MHz,f2402kMHz,k=078,即将该频段划分为79个带宽为1MHz的信道;在低频端留有2MHz 的保护带,在高频端留有3.5MHz 的保护带。调制方式采

23、用GFSK,BT=0.5,正频偏表示“1”,负频偏表示“0”。系统采用跳频扩频技术,抗干扰能力强、保密性好。,第三节 嵌入式蓝牙技术 二、蓝牙体系结构,20,基带层采用查询和寻呼方式,使调频时钟及调频频率同步,为数据分组提供对称连接(SCO)和非对称连接(ASL)并完成数据包的定义、前向纠错、循环冗余校验、逻辑通道选择、信号噪化、加密、编码和解码等功能。它采用混合电路交换和分组交换方式,既适合语言传送,也适合一般的数据传送。每一个语音通道支持64kb/s同步语音,异步通道支持最大速率723.kb/s(反向57.6kb/s)的非对称连接或433.9kb/s的对称连接。 LMP负责蓝牙设备之间的链

24、路建立,包括鉴权、加密等安全技术及基带层分组大小的控制和协商。它还控制无线设备的功率以及蓝牙节点的连接状态。 L2CAP与LMP平行工作,共同实现OSI的数据链路层的功能,它可提供对称连接和非对称连接的数据服务。 RFCOMM在蓝牙的基带上仿真RS-232的功能,实现设备串行通信。例如,在拨号网络中,主机将AT命令发送到调制解调器,再传送到局域网,建立连接后,应用程序就可以通过RFCOMM提供的串口发送和接收数据。 SDP是蓝牙体系中非常关键的部分,只有通过SDP了解通信双方的设备信息、业务类型、业务特征,然后才能在蓝牙设备之间建立通信连接。,第三节 嵌入式蓝牙技术 二、蓝牙体系结构,21,个

25、人通信的目标就是利用各种可能的网络技术,实现人与人之间在任何时间、任何地点进行任何种类的通信。在近距离通信中,蓝牙无线接入技术使无线单元间的通信变得十分容易,将计算机技术与通信技术更紧密地结合在一起,人们可随时随地进行信息的交换与传输。除此之外,蓝牙移动终端还能通过无线方式访问局域网以及Internet等网络,例如: 实现蓝牙协议与TCP/IP协议的转换。 在安全的基础上实现蓝牙地址与IP地址之间的地址解析。 通过路由表对网络内部的蓝牙移动终端进行跟踪、定位。 在两个不同的piconet(匹克网)的蓝牙移动终端之间交换路由信息。 如果目的端位于单位内部的局域网或者Internet,则需要通过蓝

26、牙网关进行蓝牙协议与TCP/IP 协议的转换,如果没有IP 地址,则由蓝牙网关来提供IP 地址,其通信方式为T-BGMT。如果目的端位于办公网络内部的另一个匹克网,则通过蓝牙网关来建立路由连接,从而完成整个通信过程的漫游其通信方式为MT-BG-M_MT(为主移动终端)-MT。,第三节 嵌入式蓝牙技术 三、蓝牙通信网络,22,BlueZ是官方Linux Bluetooth栈,由HCI(Host Control Interface)层、Bluetooth 协议核心、L2CAP(Logical Link Control and Adaptation Protocol)、SCO音频层、其他Blueto

27、oth 服务、用户空间后台进程以及配置工具组成。 Bluetooth 规范支持针对Bluetooth HCI数据分组的UART(通用异步接收器/传送器)和USB传输机制。BlueZ栈对这两个传输机制(drivers/Bluetooth/)都支持。BlueZ BNEP(Bluetooth 网络封装协议)实现了 Bluetooth 上的以太网仿真,这使 TCP/IP可以直接运行于Bluetooth之上。BNEP模块(net/bluetooth/bnep/)和用户模式pand后台进程实现了 Bluetooth 个人区域网(PAN)。BNEP使用register_netdev将自己作为以太网设备注册到

28、 Linux网络层,并使用上面为WLAN驱动程序描述的netif_rx来填充sk_buffs并将其发送到协议栈。BlueZ RFCOMM(net/bluetooth/rfcomm/)提供Bluetooth上的串行仿真,这使得串行端口应用程序(如minicom)和协议(如点对点协议PPP)不加更改地在Bluetooth上运行。RFCOMM 模块和用户模式dund后台进程实现了Bluetooth 拨号网络。,第三节 嵌入式蓝牙技术 四、Linux Bluetooth 软件层,23,Bluetooth USB适配器拥有一个Bluetooth CSR芯片组,并使用USB传输器来传输HCI数据分组。因此

29、,Linux USB层、BlueZ USB传输器驱动程序以及BlueZ协议栈是使设备工作的主要内核层。 Linux USB子系统类似于PCMCIA子系统,它们都有与移动设备交互的主机控制器设备驱动程序,并且都包含一个向主机控制器和单个设备的设备驱动程序提供服务的核心层。USB主机控制器遵循两个标准之一:UHCI(Universal Host Control Interface)或OHCI(Open Host Control Interface)。由于具有PCMCIA,单个USB设备的Linux设备驱动程序不依赖于主机控制器。经由USB设备传输的数据分为四种类型(或管道):Control、Int

30、errupt、Bulk和Isochronous。前两种类型通常用于小型消息,而后两种类型则用于较大型的消息。USB设备插入时,主机控制器使用控制管道来枚举它并给它分配设备地址(1127)。主机控制器设备驱动程序读取的设备描述符包含关于设备的信息。Linux的usbcore内核模块支持USB主机控制器和USB设备,并包含USB设备驱动程序可以使用的函数和数据结构。,第三节 嵌入式蓝牙技术 五、USB适配器,24,USB驱动程序利用usbcore及自己的class/subclass/protocol信息注册了两个入口点:probe和disconnect。当附加相应的USB设备时,usbcore 用

31、枚举期间从设备配置描述符中读取的class信息来匹配已注册的class信息,并将设备与相应的驱动程序绑定。这个核心使用一种叫做URB(即USB Request Block,在include/linux/usb.h中定义)的数据结构来异步地管理主机和设备之间的数据传输。设备驱动程序使用这些例程来请求各种类型的数据传输。传送请求完成后,核心会使用以前注册的回调函数来通知驱动程序。 对Bluetooth USB设备而言,HCI命令使用Control管道传输,HCI事件使用Interrupt管道,Asynchronous(ACL)数据使用Bulk管道,而Synchronous(SCO)音频数据使用Is

32、ochronous管道。Bluetooth 规范为Bluetooth USB设备定义了class/subclass/protocol代码0 xE/0 x01/0 x01。BlueZ USB传输驱动程序(drivers/bluetooth/hci_usb.c)将该 class/subclass/protocol信息注册到Linux USB核心。Belkin USB适配器插入时,主机控制器设备驱动程序会枚举它。因为在枚举期间从适配器读取的设备描述符与hci_usb驱动程序注册到USB核心的信息相匹配,所以这个驱动程序可附加到Belkin USB设备。由hci_usb驱动程序从以上描述的各个端点读取

33、的HCI、ACL和SCO数据被透明传送到BlueZ协议栈。一旦完成这些工作,通过使用以上描述的BlueZ服务和工具,Linux TCP/IP应用程序就可以运行在BlueZ BNEP上,而串行应用程序则可以运行在BlueZ RFCOMM上。,第三节 嵌入式蓝牙技术 五、USB适配器,25,主要内容: 一、CAN总线简介 二、CAN总线硬件特征 三、CAN控制器驱动,第四节 嵌入式蓝牙技术,26,控制器局域网 (Controller Area Net,CAN)是一种现场总线,主要用于检测及控制各种过程。CAN最初是由德国BOSCH公司为汽车监测和控制而设计的,目前已逐步应用到其他工业控制中,现已成

34、为ISO-11898国际标准。 CAN总线的优点如下: 低成本。 极高的总线利用率。 数据传输距离很长(长达10公里)。 数据传输速率高(高达1Mbit/s)。 可根据报文的ID决定接收或屏蔽该报文。 可靠的错误处理和检错机制。 发送的信息遭到破坏后可自动重发。 节点在错误严重的情况下具有自动退出总线的功能。 报文不包含源地址或目标地址,仅用标识符来指示功能信息和优先级信息。 在一个由CAN总线构成的单一网络中,理论上可以挂接无数个节点。,第四节 嵌入式蓝牙技术 一、CAN总线简介,27,1.电气特征 CAN能够使用多种物理介质进行传输,例如,双绞线、光纤等。最常用的是双绞线。信号使用差分电压

35、传送,两条信号线被称为CAN_H和CAN_L,静态时均是2.5V左右,此时状态表示为逻辑1(也可以叫做“隐性”)。用CAN_H比CAN_L高表示逻辑0(此时称为“显性”)。 2.MAC帧结构,第四节 嵌入式蓝牙技术 二、CAN总线硬件特征,28,3.基本组成 CAN总线的基本组成如图7-17所示。它包含三个部分:节点控制器S3C2410微处理器、CAN控制器MCP2510或MCP2515芯片、CAN收发器TJA1050或TJA1040芯片。,第四节 嵌入式蓝牙技术 二、CAN总线硬件特征,29,驱动程序会根据module_init()函数所指定的参数作为入口函数,在CAN控制器驱动中,这个入口

36、函数为s3c2410_mcp2510_init(),它主要完成一些基本的初始化工作。CAN控制器驱动的初始化工作主要有: 软件复位,进入配置模式。 设置CAN总线波特率。 关闭中断。 设置ID过滤器。 切换MCP2510到正常状态(Normal)。 清空接受和发送缓冲区。 开启接收缓冲区,开启中断(可选)。 初始化工作完成之后,会引入驱动程序的操作集。,第四节 嵌入式蓝牙技术 三、CAN控制器驱动,30,初始化工作完成之后,会引入驱动程序的操作集。CAN控制器驱动的操作集结构如下: static struct file_operations s3c2410_fops = owner:THIS_

37、MODULE, write:s3c2410_mcp2510_write, read:s3c2410_mcp2510_read, ioctl:s3c2410_mcp2510_ioctl, open:s3c2410_mcp2510_open, release:s3c2410_mcp2510_release, ;,第四节 嵌入式蓝牙技术 三、CAN控制器驱动,31,应用层的read()函数首先调用s3c2410_mcp2510_read,该函数负责用户区和内核区之间的数据传送。之后调用RevRead函数和s3c2410_isr_mcp2510函数对数据缓冲区进行操作,在这个过程中会调用MCP2510

38、_Read函数,它的工作包括: 在local处理器上关闭中断。 MCP2510片选ENABLE。 CAN总线发送流程。 MCP2510片选DISABLE。 打开中断。 其中, CAN总线发送流程的具体操作顺序如下: 1)在s3c2410_fops结构中添加写接口 。 2)用户程序使用CanData数据结构给驱动模块传递参数。 3)从用户空间读取待发送的内容 。 4)对用户空间传递的数据加以解析 。 5)MCP2510通过SPI接口与处理器传递数据。,第四节 嵌入式蓝牙技术 三、CAN控制器驱动,32,对于写操作,应用层的write()函数首先调用s3c2410_mcp2510_write,该函数负责用户区和内核区之间数据传送。之后调用MCP2510_canWrite函数和MCP2510_Write_Can函数。在该函数中完成CAN的数据

温馨提示

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

评论

0/150

提交评论