您好,欢迎来到爱go旅游网。
搜索
您的当前位置:首页嵌入式课设

嵌入式课设

来源:爱go旅游网
*****************

实践教学

*******************

兰州理工大学

计算机与通信学院

2013年春季学期

嵌入式系统开发技术课程设计

题 目: 嵌入式串口通信的设计 专业班级: 通信工程(2)班 姓 名: 郭向斌 学 号: 10250218 指导教师: 成 绩:

1

目 录

目 录 .............................................................................................................................................. 2 摘 要 ................................................................................................................................................ 3 前 言 ................................................................................................................................................ 4 一、串口通信概述 ........................................................................................................................... 5

1.1基本原理 .......................................................................................................................... 5 1.2基本任务 .......................................................................................................................... 5 二、串行接口标准 ........................................................................................................................... 6 三、串口驱动程序设计 ................................................................................................................... 7

3.1 串口操作需要的头文件 ................................................................................................. 7 3.2 打开串口 ......................................................................................................................... 7 3.3 串口设置 ......................................................................................................................... 8 3.4 串口读写 ....................................................................................................................... 10 3.5 关闭串口 ....................................................................................................................... 12 四、程序流程图及代码 ................................................................................................................. 13

4.1 程序设计流程图 ........................................................................................................... 13 4.2 源程序代码 ................................................................................................................... 13 参考文献......................................................................................................................................... 18 总 结 .............................................................................................................................................. 19 致 谢 .............................................................................................................................................. 20

2

摘 要

随着嵌入式系统的发展和大规模应用,为了提升系统的整体性能,必须实现PC机和嵌入式计算机之间的通信。在实际开发应用中,串口通信是不可缺少的部分,是目前嵌入式系统与PC机之间一种非常重要而且普遍应用的通信方式。本文通过基于2410F 的嵌入式串口通信的实现,按照嵌入式系统的软、硬件结构组成,较为详细地介绍了串口通信的硬件电路和软件实现方法。该系统的硬件主体设计以三星S3C2410 处理器为核心控制器件,通过与计算机串口间的连接,实现在ARM 平台上与外部设备通信的基本功能。

关键词:嵌入式系统;串口通信;Linux系统

3

前 言

目前,先进的嵌入式计算机以其优良的品质、高可靠性及模块化,广泛地应用于工业控制、航空航天、医疗、智能仪表、通信、数控、自动化生产设备、数据采集等领域。在实际应用中,有时需要借助微机强大的数据处理能力和丰富的软件资源,使得组成的系统功能更为强大。为了提升系统的整体性能,必须实现PC机和嵌入式计算机之间的通信。在数据采集的实际开发应用中,串口通信是不可或缺的一部分,也是目前嵌入式系统与PC机之间最重要,应用最普遍的通信方式。

串口通信是简单嵌入式系统的一个应用,串口通信是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口通信不但能实现计算机与嵌入式开发板之间的数据传输,而且还能实现计算机对嵌入式开发板的控制。

4

一、串口通信概述

1.1基本原理

串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数从CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。串口是系统资源的一部分,应用程序要使用串口进行通信,必须在使用之前向操作系统提出申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

1.2基本任务

(1)实现数据格式化:因为来自CPU 的是普通的并行数据,所以,接口电路应具有实现不同串行通信方式下的数据格式化的任务。在异步通信方式下,接口自动生成起止式的帧数据格式。在面向字符的同步方式下,接口要在待传送的数据块前加上同步字符。

(2)进行串---并转换:串行传送,数据是一位一位串行传送的,而计算机处理数据是并行数据。所以当数据由计算机送至数据发送器时,首先把串行数据转换为并行数才能送入计算机处理。因此串并转换是串接口电路和的重要任务。

(3)控制数据传输速率:串行通信接口电路应具有对数据传输速率-----波特率进行先择和控制的能力。

(4)进行错误检测:在发送接口电路对传送的字符数据自动生成奇偶校验位或其他校验码。在接收时,接口电路检查字符的奇偶校验或其他检验码,确定是否发生传送错误。

(5)进行TTL 与EIA 电平转换:CPU 和终端均采用TTL 电平及正逻辑,它们与EIA 采用的电平及负逻辑不兼容,需在接口电路中进行转换。

5

二、串行接口标准

根据连接器(含电平转换器)的不同,串行接口标准最常用的有RJ-232、RS-422A、RS-232C标准。RS-232C是1969年由电子工业协会(EIA)公布的标准。该标准的用途是定义数据终端设备DTE(Data Terminal Equipment)与数据通信设备DCE(Data Communication Equioment)的接口特性。

数据终端设备就是连接通信两端设备的连线(如空MODEM)或其他设备。RS-232C标准的构架如图2.1所示。

图2.1 RS-232C标准的构架

6

三、串口驱动程序设计

由于嵌入式系统是一个受资源限制的系统,因此不能直接在嵌入式系统硬件上进行编程。作为一个完整的嵌入式系统,其软件设计也是一个很重要的方面。本系统软件的实现是通过串口设置和读写串口等操作来完成宿主机与目标机间的串口通信。

3.1 串口操作需要的头文件

在开发嵌入式Linux串口驱动程序时,需要以下头文件:

#include /*标准输入输出定义*/ #include /*标准函数库定义*/ #include /*UNIX标准函数定义*/ #include #include

#include /*文件控制定义*/ #include /*POSIX终端控制定义*/ #include /*错误号定义*/

3.2 打开串口

在嵌入式Linux系统中,打开一个串口设备和打开普通文件一样。嵌入式Linux系统下的串口文件通常位于/dev下:串口一为/dev/ttyS0;串口二为/dev/ttyS1。

打开串口时通过使用标准的文件函数open( )来进行操作的,下面假设以读写方式打开串口一。

int fd;//文件描述符

fd=open(“/dev/ttyS0”,O_RDWR);//以读写方式打开串口 if(fd==-1)//如果不能打开串口一 {

perror(“提示错误!”); }

7

3.3 串口设置

在Linux 系统中,设备都是以文件的形式表示的,串口参数一般包括波特率、起始位数量、停止位数量等。下面对这些串口参数进行详细说明。

(1)起始位

通信线路上没有数据被传送时,处于逻辑“1”状态。当发送字符数数据是首先发送一个逻辑“0”信号,这个逻辑低电平就是起始位。起始位通过通信线路传输到接收端,接收端检测到这个低电平之后,就开始准备接收数据位信号。起始位所起的作用就是使通信双方同步。

(2)数据位

当接收端收到起始位后,开始接收数据位。数据位的个数可以是5~8位。在数据传送过程中,数据位从最低有效位开始传送,接收端收到数据后,依次将其转换成并行数据。

(3)奇偶校验位

数据位发送完后,为了保证数据的可靠性,还要传送一个奇偶校验位。奇偶校验用于差错检测。如果选择偶检验,则数据位和奇偶位的逻辑“1”的个数必须为偶数,相反,如果是奇检验,则数据位和奇偶位的逻辑“1”的个数为奇数。

(4)停止位

在奇偶位或数据位(当无奇偶校验时)之后发送停止位。停止位表示一个数据的结束。它可以是1~2位的低电平。接收端收到停止位后,通信线路便恢复逻辑“1”的状态,直到下一个数据的起始位到来。

(5)波特率

通信线路上传输的位(码元)信号都必须保持一致的信号持续时间,单位时间内传送码元的数目称为波特率。对大多数嵌入式设备来说,其波特率都设置为115200。

访问串行口通过对设备文件的访问来实现,仅需打开相应的设备文件。串口的设置主要是设置struct termios 结构体中的各成员值。

#include

8

struct termio { unsigned short c_iflag; /*输入模式标志*/ unsigned short c_oflag; /*输出模式标志*/ unsigned short c_cflag; /*控制模式标志*/ unsigned short c_lflag; /*本地模式标志*/ unsigned char c_line; /*线路规范*/ unsigned char c_cc[NCC]; /*控制特征值*/

}

①波特率设置:

struct termios option; tcgetattr(fd,&option);

cfsetispeed(&option,B115200);/*设置为115200Bps*/ cfsetospeed(&option,B115200); tcsetattr(fd,TCANOW,&option); ②检验位设置:

无校验 8 位:

options.c_cflag &=~PARENB options.c_cflag &=~CSTOPB; options.c_cflag &=~CSIZE; options.c_cflag︱=~CS8; 奇效验(Odd)7 位:

options.c_cflag︱=~PARENB; options.c_cflag &=~PARODD; options.c_cflag &=~CSTOPB; options.c_cflag &=~CSIZE; options.c_cflag︱=~CS7; 偶校验(Even)7 位: options.c_cflag &=~PARENB; options.c_cflag︱=~OARODD; options.c_cflag &=~ CSTOPB; options.c_cflag &=~CSIZE; options.c_cflag︱=~CS7; Space 校验7 位:

9

options.c_cflag &=~ PARENB; options.c_cflag &=~CSTOPB; options.c_cflag &=&~CSIZE; options.c_cflag︱=~CS8; ③停止位设置:

1位: options.c_cflag &=~CSTOPB; 2位: options.c_cflag︱=CSTOPB; ④模式设置:

需要注意的是,如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯。

options.c_lflag &=~(ICANON︱ECHO︱ECHOE︱ISIG);/*Input*/ options.c_oflag &=~OPOST;/*Output*/

3.4 串口读写

在Linux 系统中,对设备和目录的操作都等同于文件的操作,这样大大简化了系统对不同设备的处理,提高了效率。在程序中,设备和文件都是使用文件描述符来进行操作的。文件描述符是一个非负的整数,是一个索引值,并指向内核中每个进程打开文件的记录表。当打开一个现存的文件或者是创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写时也需要将文件描述符作为参数传递给相应的函数。

在Linux 系统中,所有的设备文件都位于“/ dev”下,其中串口对应的设备名为“/ dev/ ttyS0”,因此对串口的读写就可以像读写(“read”和“write”) 普通文件一样来读写设备文件,所不同的是需要对串口的其他参数另做配置。

打开串口之后,读写串口就很容易了,把串口当作文件读写就可以了。 (1)发送数据 char butter[1024]; int Length=1024; int nByte;

nByte=write(fd,buffer,Length); (2)读取串口数据

使用文件操作read 函数读取,如果设置为原始模式(Raw Mode)传输数据,那

10

么read 函数返回的字符数是实际串口收到的字符数。读取数据时比较需要技巧的。

char buff[1024]; int Len=1024;

int rdadByte=read(fd,buff,Len);

也可以使用操作文件的函数来实现异步读取,如fcntl,或者selectt 等来操作。 fd_set rfds; struct timeval tv; int retval;

/*下面几行设置要监视进行读写操作的文件集*/ FD-ZERO(&rfds); //文件集清零

FD_SET(ports[portNo].handle,&rfds); //向集合中添加一个文件句柄 tv.tv_sec=Timeout/1000; //设置等待的时间 tv.tv_usec=(Timeeout%1000)*1000;

retval=select(16,&rfds,NULL,NULL,&tv;) //文件所监视的文件集准备好. if(rdtvel) //文件集中有文件在等待时间内 准备好了. {

actuaIRead=read(ports[portNo].handle,buf,maxCnt); //读取数据 }

下面两个实例给出了串口读和写两个程序部分代码。写串口的程序将在宿主机上运行,读串口程序将在目标板上运行。

写串口部分程序: do {

printf(“Input some words(enter „quit‟ to exit):”); memset(buff, 0,BUFFER_SIZE);

if(fgets(buff,BUFFER_SIZE,stdin)==NULL) {

perror(“fgets”);

11

}

break;

write(fd,buff,strlen(buff)); }whie(strncmp(buff,”quit”,4)); 读串口部分程序: do {

memset(buff,0,BUFFER_SIZE); if(read(fd,buff,BUFFER_SIZE)>0) { }

}while(strncmp(buff,”quit”,4));

printf(“The received words are:%s”,buff);

3.5 关闭串口

在Linux 系统中,对设备和目录的操作都等同于文件的操作, 关闭串口就是关闭文件,而设备和文件都是使用文件描述符来进行操作的。文件描述符是一个索引值,指向内核中每个进程打开文件的记录表,因此关闭文件就只要关闭文件描述符就可以了。

close(fd);

12

四、程序流程图及代码

4.1 程序设计流程图

图4.1 串口通信程序设计流程图

4.2 源程序代码

/*serial_com.c*/ #include #include #include

13

#include #include #include #include #include

#define MODEMDEVICE \"/dev/ttyS0\" #define _POSIX_SOURCE 1 #define FALSE 0 #define TRUE 1

volatile int STOP=FALSE; main() {

int fd,n=0,c,BAUDRATE,i,BUFNUMBER=32,READNUMBER=32; char receivebuf[BUFNUMBER]; struct termios oldtio,newtio; struct stat st; errno=0;

fd=open(MODEMDEVICE,

O_RDWR|O_NOCTTY/*|O_NDELAY|O_NONBLOCK*/);/*打开串口*/

{

perror(MODEMDEVICE); printf(\"Error in open COM1\\n\");

errno=0; if (errno)

exit(-1); }

tcgetattr(fd,&oldtio);

bzero(&newtio,sizeof(newtio)); BAUDRATE=B9600;

14

cfsetispeed(&newtio,BAUDRATE);/*设置串口输入波特率*/ cfsetospeed(&newtio,BAUDRATE);/*设置串口输出波特率*/ newtio.c_cflag|=CS8|CLOCAL|CREAD;/*设置串口奇偶校验位*/

newtio.c_iflag=IGNPAR|ICRNL;

newtio.c_lflag&=~(ICANON|ECHO|ECHOE|ISIG); newtio.c_lflag|=(ICANON|ECHO/*|ECHOE*/|ISIG); newtio.c_cc[VINTR]=0;

newtio.c_cc[VQUIT]=0; newtio.c_cc[VERASE]=0; newtio.c_cc[VKILL]=0; newtio.c_cc[VEOF]=4; newtio.c_cc[VTIME]=0; newtio.c_cc[VMIN]=1; newtio.c_cc[VSWTC]=0; newtio.c_cc[VSTART]=0; newtio.c_cc[VSTOP]=0; newtio.c_cc[VSUSP]=0; newtio.c_cc[VEOL]=0; newtio.c_cc[VREPRINT]=0; newtio.c_cc[VDISCARD]=0; newtio.c_cc[VWERASE]=0; newtio.c_cc[VLNEXT]=0; newtio.c_cc[VEOL2]=0;

c=fcntl(fd,F_SETFL,FNDELAY);

c=tcflush(fd,TCIOFLUSH); tcsetattr(fd,TCSANOW,&newtio);

n=0; for(i=0;i{

receivebuf[i]=0;

15

}

bzero(receivebuf,BUFNUMBER);

printf(\"The 1 state of the file :%d\\n\

n=read(fd,receivebuf,READNUMBER); /*读串口*/

printf(\"The 2 state of the file :%d\\n\ if (errno)

{

perror(\"READ() Failed\");

errno=0;

printf(\"n=%d\\n\

}

else

{ printf(\"read char number=%d\\n\ for(i=0;i{ printf(\"The %dth Received char is %c\\n\

}

}

n=write(fd,receivebuf,READNUMBER); /*写串口*/

if (n<0)

tcsetattr(fd,TCSANOW,&oldtio);

close(fd); } if (n<0) { close(fd);

perror(\"read() failed!\");

tcsetattr(fd,TCSANOW,&oldtio);

}

16

close(fd); }

17

参考文献

[1]张思民编著.嵌入式系统设计与应用[M]. 北京:清华大学出版社, 2008. [2]ARM Limited. ARM Developer Suiter (Version 1.2) , Assemble Guide, ARM DUI 0068A, 2000.

[3]熊茂华、杨震伦主编. ARM9嵌入式系统设计与开发应用[M].北京:清华大学出版社,2008.

[4]刘彦文主编.基于ARM TDMI的S3C44BOX嵌入式微处理器技术[M].北京:清华大学出版社,2009.

[5]徐磊编著.Linux系统下C程序开发详解[M]. 北京:电子工业出版社,2008. [6]华清远见嵌入式培训中心编著. 嵌入式Linux系统开发标准教程(第2版)[M]. 北京:人民邮电出版社,2009.

[7]罗苑棠编著.嵌入式Linux驱动程序和系统开发实例精讲[M].北京:电子工业出版社,2009.

[8]罗蕾主编. 嵌入式实时操作系统及应用开发(第2版)[M]. 北京:北京航空航天大学出版社,2007.

[9]华清远见嵌入式培训中心编著. Linux设备开发详解(第2版)[M]. 北京:人民邮电出版社,2010.

18

总 结

通过本次嵌入式系统课程设计,加深了我对所学过的各种理论的认识和理解,并在一定程度上掌握并会运用。我还学会了把学到的知识用于解决实际问题,培养、加强锻炼了我的动手实践能力。更为难得的是,在这次课程设计过程中,屡屡碰见一些问题,在解决这些问题的过程中,不断加强了我对嵌入式系统各方面知识的理解。对于一些自己不清楚,不明白但平时又很难发现的知识点有了一次全面的巩固与复习。

在大学阶段,理论的学习和实践是密不可分的。离开了实践的理论是没有任何意义可言的。与此同时,理论是需要伴随着实践才能完善。同时,在与同学共同在解决一些问题的过程中,提高了我们的团队协作精神。

总之,这次课程设计中我学到了很多知识,拓展了我的思维,而且让我明白了怎样理论联系实际,在实践过程中遇到的问题怎样用理论来解决,为以后的工作积累了经验,增强了信心。

19

致 谢

通过本次的课程设计,我们都学到了许多东西,体会到了从书本学习与实际应用中的不同,这种感同身受必将对我们今后的学习与生活带来很大的帮助。在这段时间里,我们的指导老师时时在我们的身旁引导我们,帮助我们,倾注他们所有的才华,用心血让我们学会从理论走向实际这一目标十分艰辛,对我们来说是飞跃的过程。不会忘记他们为了我们紧缩的眉头,焦急的眼神,疲倦的笑容,忙碌的身影。谢谢老师在本次课程设计中给予我们的帮助,同时也感谢给予我帮助的同学们!

20

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- igat.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务