好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

博创嵌入式培训PPT——第7章 嵌入式Linux下的通信应用(模板).ppt

38页
  • 卖家[上传人]:bao****ty
  • 文档编号:187131668
  • 上传时间:2021-07-25
  • 文档格式:PPT
  • 文档大小:480.50KB
  • / 38 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第7章 嵌入式Linux下的通信应用 第七章 嵌入式Linux下的通信应用 伴随着嵌入式系统技术的发展,纯单机工作已经远远不能满足用户的需 求,因此各个系统之间的信息交互由于具有广泛的应用价值而成为嵌入式技 术更深层次的应用本章将介绍嵌入式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( 提示错误!); 对串口进行设置是一种常见的操作,一般的设置包括波特率设置、 校验位和停止位设置可以通过POSIX标准终端接口(POSIX是 PortableOperationSystemInterfaceofUnix的缩写,它制定了具 有移植性操作系统所应具备的条件)进行相关操作,此接口称为 termios,并在内核目录下的include/asm/termios.h文件中定义 第一节 嵌入式Linux下的串口通信二、串口编程 Termios的结构如下: Struct termios tcflag_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 options.c_cflag 第一节 嵌入式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的UNIX BSD操作系统,使TCP/IP的应用有了更大的发展,其网络应用编 程界面Socket在网络软件中被广泛应用,至今已引进到 Windows和VxWorks等操作系统中,成为开发网络应用软件的强 大工具。

      Socket相当于网络上的通信节点,即IP地址加上端口号应用程序 使用了Socket之后,就可以和网络上的任何一个通信节点连接 Socket之间的通信就如同一台PC机上两个进程间的通信一样 在Linux操作系统中,可以将Socket看成是一种设备,即一种可作 双向传输的信道,Linux程序可以经过此设备与本地或是远程的程 序进行通信 第二节 嵌入式Linux网络编程二、Socket简介 目前,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是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 s。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.