(ARM Linux嵌入式系统开发基础)第8章ARM-Linux串行接口通

上传人:au****y 文档编号:118789571 上传时间:2019-12-25 格式:PPT 页数:107 大小:891.50KB
返回 下载 相关 举报
(ARM Linux嵌入式系统开发基础)第8章ARM-Linux串行接口通_第1页
第1页 / 共107页
(ARM Linux嵌入式系统开发基础)第8章ARM-Linux串行接口通_第2页
第2页 / 共107页
(ARM Linux嵌入式系统开发基础)第8章ARM-Linux串行接口通_第3页
第3页 / 共107页
(ARM Linux嵌入式系统开发基础)第8章ARM-Linux串行接口通_第4页
第4页 / 共107页
(ARM Linux嵌入式系统开发基础)第8章ARM-Linux串行接口通_第5页
第5页 / 共107页
点击查看更多>>
资源描述

《(ARM Linux嵌入式系统开发基础)第8章ARM-Linux串行接口通》由会员分享,可在线阅读,更多相关《(ARM Linux嵌入式系统开发基础)第8章ARM-Linux串行接口通(107页珍藏版)》请在金锄头文库上搜索。

1、第8章 ARM-Linux串行接口通信程序设计 第8章 ARM-Linux串行接口通信 程序设计 8.1 串行接口 8.2 A/D接口 8.3 瓦斯信息采集系统应用实例 第8章 ARM-Linux串行接口通信程序设计 8.1.1 串行接口的原理 串行接口是一种广泛应用的I/O接口,其数据和控制信 息是一位接一位串行地传送。串行通信是指将构成字符的每 个二进制数据位,依据一定的顺序逐位进行传送的通信方法 。在串行通信中,有两种基本的通信方式:同步串行通信和 异步串行通信。 8.1 串 行 接 口 第8章 ARM-Linux串行接口通信程序设计 (1) 同步串行通信方式。同步串行通信是以数据块(字

2、符块) 为信息单位传送,每帧信息可以包含很多字符。同步通信要 求通信双方以相同的速率进行,而且要准确协调,通常通过 共享一个时钟或定时脉冲源保证发送方和接收方准确同步。 这种通信方式的效率较高,但是对时钟同步要求非常严格, 成本较高。 第8章 ARM-Linux串行接口通信程序设计 (2) 异步串行通信方式。异步串行通信以字符为信息单 位传送。双方需要遵守异步通信协议,以字符为数据单位, 发送方传送字符的时间间隔不确定。每个字符传输都以起始 位开始,以停止位结束。通信双方所指定的字符的数据位数 、奇偶校验方法和停止位数必须相同。其传输效率比同步通 信方式低,但是成本较低。异步通信是在以起始位开

3、始、停 止位结束的一个字符内按约定的频率进行同步接收。各个字 符之间允许有间隙,而且两个字符之间的间隔是不固定的。 在同步通信方式中,不仅同一字符中的相邻两位间的时间间 隔要相等,而且相邻字符间的时间间隔也要求相等,这也是 同步通信和异步通信方式的主要差别所在。 第8章 ARM-Linux串行接口通信程序设计 异步串行通信一般用在数据传送时间不能确知、发送数 据不连续、数据量较少和数据传输速率较低的场合;而同步 串行通信则用在要求快速、连续传输大批量数据的场合。当 前嵌入式开发设计中主要采用异步串行通信方式。 第8章 ARM-Linux串行接口通信程序设计 异步串行I/O方式是将传输数据的每个

4、字符一位接一位( 例如先低位、后高位)地传送。数据的各不同位可以分时使 用同一传输通道,因此串行I/O可以减少信号连线,最少用 一对线即可进行。接收方对于同一根线上一连串的数字信号 ,首先要分割成位,再按位组成字符。为了恢复发送的信息 ,双方必须协调工作。在微型计算机中大量使用异步串行 I/O方式,双方使用各自的时钟信号,而且允许时钟频率有 一定误差,因此实现较容易。但是由于每个字符都要独立确 定起始和结束(即每个字符都要重新同步),字符和字符间还 可能有长度不定的空闲时间,因此效率较低。 第8章 ARM-Linux串行接口通信程序设计 第8章 ARM-Linux串行接口通信程序设计 图8-1

5、给出异步串行通信中一个字符的传送格式。开始 通信前,线路处于空闲状态,送出连续“1”。传送开始时首 先发一个“”作为起始位,然后出现在通信线上的是字符的 二进制编码数据。每个字符的数据位长可以约定为5位、6位 、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根 据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数 个或偶数个。也可以约定不要奇偶校验,这样就取消了奇偶 校验位。最后是表示停止位的“1”信号,这个停止位可以约 定持续1位、1.5位或2位的时间宽度。至此一个字符传送完 毕,线路又进入空闲,持续为“1”。 第8章 ARM-Linux串行接口通信程序设计 经过一段随机的时间后,

6、下一个字符开始传送才又发出 起始位。每一个数据位的宽度等于传送波特率的倒数。微机 异步串行通信中,常用的数据传输率为50、95、110、150、 300、600、1200、2400、4800、9600 bps等。 第8章 ARM-Linux串行接口通信程序设计 接收方按约定的格式接收数据,并进行检查,可以查出 以下三种错误: 奇偶错:在约定奇偶检查的情况下,接收到的字符奇 偶状态和约定不符。 帧格式错:一个字符从起始位到停止位的总位数不对 。 溢出错:若先接收的字符尚未被微机读取,后面的字 符又传送过来,则产生溢出错误。 每一种错误都会给出相应的出错信息,提示用户处理。 目前广泛使用的9针DB

7、-9串行口与25针串行口信号线定 义如表8-1所示。 第8章 ARM-Linux串行接口通信程序设计 表8-1 串行接口信号线定义 DB9DB25标记功 能 18DCD载波检测 23RXD接收数据 32TXD发送数据 420DTR数据终端准备好 57GND信号地 66DSR数据准备好 74RTS发送请求 85CTS发送清除 922RI振铃指示 第8章 ARM-Linux串行接口通信程序设计 在ARM系统中,要完成最基本的串行通信功能,实际 上只需要RXD、TXD和GND即可,这样的连接只要三根线 ;如果需要进行数据流控制,将需要采用七线式接法,其连 接方式如图8-2所示。 第8章 ARM-Li

8、nux串行接口通信程序设计 图8-2 串行通信连接方式 第8章 ARM-Linux串行接口通信程序设计 PC串口采用RS232电平,即标准逻辑“1”对应-5-15 V 电平,标准逻辑“0”对应+5+15 V电平,而在ARM系统中 标准逻辑“1”对应23.3 V电平,标准逻辑“0”对应00.4 V 电平。显然,两者间要进行通信就必须经过信号电平的转换 ,通常使用MAX232/MAX3232等专用集成电路进行电平转 换,典型电路如图8-3所示。 第8章 ARM-Linux串行接口通信程序设计 图8-3 MAX3232典型电路 第8章 ARM-Linux串行接口通信程序设计 8.1.2 程序分析 L

9、inux操作系统从一开始就对串行口提供了很好的支持 ,为串行通信提供了大量的函数,本节主要介绍在Linux中 进行串行通信编程的基本方法,其程序流程如图8-4所示。 第8章 ARM-Linux串行接口通信程序设计 图8-4 串口通信实验流程图 第8章 ARM-Linux串行接口通信程序设计 串行通信的代码如下: #include #include #include #include #include #include #define BAUDRATE B115200 #define COM1 “/dev/ttyS0” #define COM2 /dev/ttyS1 第8章 ARM-Linux串

10、行接口通信程序设计 #define ENDMINITERM 27 /* ESC to quit miniterm */ #define FALSE 0 #define TRUE 1 volatile int STOP=FALSE; volatile int fd; void child_handler(int s) printf(stop!n); STOP=TRUE; /*-*/ 第8章 ARM-Linux串行接口通信程序设计 void* keyboard(void * data) int c; for (;) c=getchar(); if( c= ENDMINITERM) STOP=TRU

11、E; break ; 第8章 ARM-Linux串行接口通信程序设计 return NULL; /*-*/ /* modem input handler */ void* receive(void * data) int c; printf(read modemn); while (STOP=FALSE) read(fd, /* com port */ 第8章 ARM-Linux串行接口通信程序设计 write(1, /* stdout */ printf(exit from reading modemn); return NULL; /*-*/ void* send(void * data)

12、 int c=0; printf(send datan); while (STOP=FALSE) /* modem input handler */ 第8章 ARM-Linux串行接口通信程序设计 c+; c %= 255; write(fd, /* stdout */ usleep(100000); return NULL; /*-*/ int main(int argc,char* argv) 第8章 ARM-Linux串行接口通信程序设计 struct termios oldtio,newtio,oldstdtio,newstdtio; struct sigaction sa; int

13、ok; pthread_t th_a, th_b, th_c; void * retval; if( argc 1) fd = open(COM2, O_RDWR ); else fd = open(COM1, O_RDWR ); /| O_NOCTTY |O_NONBLOCK); 第8章 ARM-Linux串行接口通信程序设计 if (fd 0) error(COM1); exit(-1); tcgetattr(0, tcgetattr(fd, /* save current modem settings */ tcgetattr(fd, /* get working stdtio */ n

14、ewtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; /*ctrol flag*/ 第8章 ARM-Linux串行接口通信程序设计 newtio.c_iflag = IGNPAR; /*input flag*/ newtio.c_oflag = 0; /*output flag*/ newtio.c_lflag = 0; newtio.c_ccVMIN=1; newtio.c_ccVTIME=0; /* now clean the modem line and activate the settings for modem */ tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW, /*set attrib*/ 第8章 ARM-Linux串行接口通信程序设计 sa.sa_handler = child_handler; sa.sa_flags = 0; sigaction(SIGCHLD, /* handle dying child */ pthread_create( pthread_create( pthread_create( pthread

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号