嵌入式实验6交叉编译及Linux简单程序设计实验

时间:2019-05-14 04:20:02下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《嵌入式实验6交叉编译及Linux简单程序设计实验》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《嵌入式实验6交叉编译及Linux简单程序设计实验》。

第一篇:嵌入式实验6交叉编译及Linux简单程序设计实验

实验六交叉编译及Linux简单程序设计实验的实验报告

一实验目的

1、了解和掌握交叉编译模式和方法;

2、熟悉和掌握Linux简单程序设计。

二实验环境

预装Fedora10_A8_Linux的pc机一台,CVT-A8嵌入式实验箱一台(已构建嵌入式Linux系统),以太网线一根,交叉编译工具链。

三实验步骤

1、连接主机和目标板;(三根线,注意网线和串口线是否连接正常)

2、安装交叉编译器arm-linux-gcc,并配置环境。a)在命令行中输入arm-linux-后按tab键,如果命令能够补齐,说明里面已经有交叉编译工具了,环境变量已经设置好,那接下来的步骤,可以作为参考。如果不能补齐,则把电脑“E:cvtechCVT-A8-III Linux光盘Linux系统及应用源码”目录下的“4.3.3.tar.gz”文件拷贝到Fedora10的/usr/local目录下

b)转到文件夹/usr/local

cd /usr/local

c)解压交叉编译工具链

tar-vzxf4.3.3.tar.gz cd 4.4.3/bin 执行pwd命令得到这个目录的绝对路径,用右键复制这个路径,这个路径一般为/usr/local/4.3.3/bin。

d)打开环境变量设置脚本文件

vi ~/.bash_profile e)在文件中倒数第几行中,把“/usr/local/4.3.3/bin”添加到PATH环境变量路径的后面,类似于PATH=$PATH:/usr/local/4.3.3/bin $PATH表示原来的环境变量路径,添加的/usr/local/4.3.3/bin部分表示在原来的环境变量PATH中添加此交叉编译器的路径

f)vi保存并退出

g)输入命令source ~/.bash_profile使环境变量路径生效

h)在任意目录下输入arm-linux-gcc后回车,如果是arm-linux-gcc no input file表示配置成功,或者仅输入“arm-linu”之后按TAB键看是否能补齐arm-linux-gcc命令,如果能够补齐,说明交叉编译工具链的环境变量设置成功。

3,Linux简单程序设计

a)使用vi等编辑器编写一个简单程序,比如输出“hello world”,实现a+b等C语言程序。

b)在命令行中使用gcc编译器编译并运行程序;使用file命令查看编译后的可执行文件信息。

c)使用交叉编译器arm-linux-gcc编译并运行程序,记录结果;使用file命令查看交叉编译后的可执行文件信息。

d)将交叉编译得到的可执行文件通过tftp下载到目标机,在目标机上执行,记录结果

Cd: Vi:

gcc –o.c:

四实验思考

1、为什么要使用交叉编译模式?

由于嵌入式系统资源匮乏,一般不能像PC一样安装本地编译器和调试器,不能在本地编写、编译和调试自身运行的程序,而需借助其它系统如PC来完成这些工作,这样的系统通常被称为宿主机。宿主机通常是Linux系统,并安装交叉编译器、调试器等工具;宿主机也可以是Windows系统,安装嵌入式Linux集成开发环境。在宿主机上编写和编译代码,通过串口、网口或者硬件调试器将程序下载到目标系统里面运行。所谓的交叉编译,就是在宿主机平台上使用某种特定的交叉编译器,为某种与宿主机不同平台的目标系统编译程序,得到的程序在目标系统上运行而非在宿主机本地运行。ARM上可以运行操作系统,所以用户完全可以将ARM当做计算机来使用,理论上也可以在ARM上使用本地的编译器来编译程序.但是,编译器在编译程序时,会产生大量的中间文件,这会占用很大的内存和磁盘空间,且对CPU处理速度要求较高,比如S3C2440A内存、磁盘空间只有几十到100多兆,CPU只有400-500MHz,完全达不到编译程序的要求.所以,在进行ARM-linux嵌入式开发时必须在PC机(x86结构)上编译出能够运行在ARM上的程序,然后再将程序下载到ARM中来运行.这就用到了交叉编译器.要进行交叉编译,用户需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译用户的源代码,最终生成可在目标平台上运行的代码.交叉编译工具链可以从网上下载,也可以自己制作.但编译器不是万能的,受版本限制,编译某些程序时会报错.常见的交叉编译工具链有:

(1)Cross-2.95.3 tar: 该版本较早,除了编译vivi外一般不使用.(2)arm920t-eabi.tgz: 4.1.2版本的编译器,支持eabi,可以编译TX2440A开发板上的所有程序.(3)arm-linux-gcc: 4.3.2版本的编译器,支持eabi,是最常见的交叉工具链.2、gcc和交叉编译工具生成的可执行文件有什么不同?

Gcc:GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。[2] GCC是自由软件过程发展中的著名例子,由自由软件基金会以GPL协议发布。

GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。

交叉编译工具:在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码。

可执行文件(executable file)指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下,可执行程序的呈现方式不一样。

交叉编译工具可以简单地理解为在电脑上编译,生成的可执行文件在开发板上运行。交叉编译工具是根据开发板芯片的体系结构制作的,这与开发板上的芯片指令系统有关。arm-linux-gcc只是在编译时根据arm芯片的环境来生成可执行文件,生成的可执行文件必须移植到开发板上才能运行。

3、比较可执行文件在主机和目标板上运行的不同,理解交叉编译的含义。执行文件在主机和目标板上运行的不同:

宿主机和开发板可通过网络连接, 宿主机将会包含开发板所需的编译环境, 程序可在宿主机上编译完成后, 传递到开发板上执行, 而在开发板上不会包含编译环境, 只会有执行环境,所以两者的运行不同。

在windows操作系统下,可执行程序可以是.exe文件.sys文件.com等类型文件。

Linux可执行文件格式为ELF即Executable and Linkable Format。格式: ELF header program header table.txt.rodata.data Section header table 交叉编译含义:

交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储空间足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。4.你认为做好本实验应该注意哪些方面?

在做本实验时首先应该做好预习工作,在网上或者书本上查相关资料,了解交叉编译模式和方法,可以提前练习linux的程序设计流程,做一个小的练习,这样在试验中就会更加流畅。在做实验中,应该好好学习助教的讲解,并做好笔记,防止助教讲完就忘记,结果又会遇到一些本来可以自己解决的问题。听完助教讲解后,加上之前的预习,再按照操作一步步完成,一般都不会有问题了。

五实验心得

通过本次实验,了解和掌握了交叉编译模式和方法,熟悉和掌握了Linux简单程序设计。在实验开始时对实验的整体流程的了解还不是很清楚,但是在经过助教的讲解后,就有了比较清楚的逻辑。最后在操作中还是遇到了很多问题,因为对linux指令了解还不深入,所以在解决问题时会浪费很多时间。所以我体会到了这门课要学好还需要做好基础功,多了解和掌握linux相关的指令和知识,同时多加练习,才能为以后打好基础。

第二篇:嵌入式实验总结

如今,嵌入式系统已经在众多电气电子产品上应用,有人预测今后5年发展形势看好。嵌入式是典型的交叉学科,电信、电子、电气、计算机、通信等等都有涉及。

嵌入式理论、实践要求多、门槛高,只有理论、实践同步才能在积累中更好的渐次掌握,这学期我们针对嵌入式入门做了一些实验,通过自己动手和实验箱、实验软件打交道,对嵌入式编程形成初步了解,为今后进一步发展打基础。

实验环境:

武汉创维特公司JXARM9-2410开发板、PC;

Linux、windows操作平台;

DNW、VMwareWorkstation应用软件;

《ARM9嵌入式技术及Linux高级实践教程》、实验参考资料等;

实验内容及目标:

阅读样例程序,进行:

1.熟悉JXARM9-2410开发板、相关应用软件的使用,能成功运行示例实验程序(demo-led);

2.使用VMware,修改demo-led源程序,使开发板上数码管按照demo-led显示方式显示;

3.使用VMware、DNW,修改相关源程序,实现开发板键盘输入的字符在DNW中显示;

4.使用VMware、DNW,修改相关源程序,实现对直流电机转动状态的控制;

观看教学视频,进行交叉编译:

1.加载linux内核;

2.配置、编译linux内核;

3.Windows、linux跨平台文件共享;

4.编译、运行linux程序(helloworld)

5.Linux下编译数码管显示驱动程序;

6.Linux下编译摄像头、GPRS驱动程序;

学习嵌入式是一个漫长的过程,学好它还是需要一番的功夫。通过嵌入式实验由浅入深的动手实践,我渐渐对嵌入式有了具体概念,也逐渐对其产生了兴致和好奇心。

对于初学者,还有一点小建议,不要好高骛远,要脚踏实地.

第三篇:嵌入式实验二

1.实验二:利用中断实现 OLED 动态显示实验

1.1 实验名称

1.2 实验目的

(1)深入学习、理解、掌握 OLED 字符显示方法

(2)深入学习、理解、掌握 OLED 图形显示方法(3)学习、理解、掌握中断使用方法

1.3 实验过程与分析

1.3.1 回答实验报告中的实验问题

(1)ISR是什么?简述一下中断的作用和使用方法

答:ISR是中断服务程序。作用是通过处理器执行事先编好的某个特定的程序。使用方法就是在main中写一个中断程序,然后在startup.s中进行注册。

(2)嵌入式系统中有哪些应用有定时性循环处理的要求?举几个例子

答:在各种网络的应用中,设计的一些部件,如计数器,时钟等。

(3)定时时间间隔如何修改?

(4)选作内容5-8的编程思路是什么?若做的话应该怎样实现? 答:编程思路:先画直线和竖线,组成一个正方形,将各个参数填写到函数答:通过改变SysTickPeriodSet(SysCtlClockGet()/100)后面的100这个参数。

RIT128x96x4ImageDraw(buf,,);

第6个选作:判断画的原点x,原点y,和画原点x+的长,画原点y+画宽的值要在0-128和0-96。

第7个选作:把RIT128x96x4StringDraw(“hello”,,);就是把画的灰度定义为一个变量x。最后就会出现由不同的亮度而形成的波浪。

第8个就是利用随机函数产生画的原点,随机的在屏幕上进行显示。

(5)拖影现象如何解决?计数值显示为什么没有拖影? 答:在程序结束后执行清屏语句:计数显示是每次重新赋值,所以不会出现拖影。

1.3.2 实验中遇到的问题及解决方法

(1)字符和下方横线,从左至右移动,无法同时到达

通过最大宽度128除以阀值,调整了字符和横线的速度,解决(2)附加字符循环移动,移动到一半,不见了

查看函数排错,得以解决

(3)基本问题做完时,字符显示完整,添加附加任务后,字符显示不全

未解决...1.4实验结果总结 实验结果(附照片)

总结(自己的收获)1.5心得体会

#include #include #include “rit128x96x4.h” int Event = 0;unsigned char buf1[] = {

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };unsigned char buf2[] = {

0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00 };unsigned char buf3[] = {

0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf4[] = {

0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf5[] = {

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };unsigned char buf6[] = {

0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf7[] = {

0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };unsigned char buf8[] = {

0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff };

unsigned char r1[] = {

0xff,0xff };unsigned char r2[] = {

0xf0,0x0f };unsigned char r3[] = {

0xf0,0x0f };unsigned char r4[] = {

0xff,0xff };

unsigned char c1[] = {

0x0f,0xf0 };unsigned char c2[] = {

0xf0,0x0f };unsigned char c3[] = {

0xf0,0x0f };unsigned char c4[] = {

0x0f,0xf0 };void SysTick_Handler(void){ Event = 1;} void printX(){ }

int main(){

int count = 0,i,Light=0,x=0,z=0,y=0,zz=0,yy=0,c=0,cc=0,a=0,aa=0;unsigned char buf[5];

//存(数字)字符串

unsigned char name[20] = “";unsigned char number[20] = ”“;SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN SYSCTL_XTAL_8MHZ);RIT128x96x4Init(1000000);RIT128x96x4Clear();

SysTickPeriodSet(SysCtlClockGet()/ 10);

//调频率

SysTickEnable();SysTickIntEnable();while(1){

if(Event){

RIT128x96x4Clear();

Event = 0;

sprintf(buf,”%3i“,count);

//通过sprintf将数字转换为字符

| if(Light >= 15)

{

Light=0;

} else {

Light++;} RIT128x96x4StringDraw(name, 50, 55, 15-Light);RIT128x96x4StringDraw(number, 50, 65, Light);sprintf(buf,”%d",count);;RIT128x96x4StringDraw(buf, 50, 75, 12);

count++;if(count>=200){

count=0;} RIT128x96x4ImageDraw(buf2,(int)(x*0.50), 5, 20, 1);RIT128x96x4ImageDraw(buf3,(int)(x*0.50), 7, 20, 1);RIT128x96x4ImageDraw(buf4,(int)(x*0.50), 9, 20, 1);RIT128x96x4ImageDraw(buf5,(int)(x*0.50), 11,20, 1);RIT128x96x4ImageDraw(buf6,(int)(x*0.50), 13, 20, 1);RIT128x96x4ImageDraw(buf7,(int)(x*0.50), 15, 20, 1);RIT128x96x4ImageDraw(buf8,(int)(x*0.50), 17, 20, 1);RIT128x96x4ImageDraw(buf1, 0, 20,(int)(x*0.60), 1);RIT128x96x4ImageDraw(c1,(int)(60+c*1.20),(int)(5+a*0.85), 4, 1);RIT128x96x4ImageDraw(c2,(int)(60+c*1.20),(int)(7+a*0.85), 4, 1);RIT128x96x4ImageDraw(c3,(int)(60+c*1.20),(int)(9+a*0.85), 4, 1);RIT128x96x4ImageDraw(c4,(int)(60+c*1.20),(int)(11+a*0.85), 4, 1);RIT128x96x4ImageDraw(r1,(int)(z*0.30),(int)(50+y*0.20), 4, 1);RIT128x96x4ImageDraw(r2,(int)(z*0.30),(int)(52+y*0.20), 4, 1);RIT128x96x4ImageDraw(r3,(int)(z*0.30),(int)(54+y*0.20), 4, 1);RIT128x96x4ImageDraw(r4,(int)(z*0.30),(int)(56+y*0.20), 4, 1);if(x<=200&&x>=0)

//直线 {

x++;} if(x>=200){

x=0;} if(c<=50&&c>=-50)

//圆形循环 {

if(cc==0)c++;

if(cc==1)c--;} if(c>=50){

cc=1;} if(c<=-50){

cc=0;} if(a<=100&&a>=0){

if(aa==0)a++;

if(aa==1)a--;} if(a>=100){

aa=1;} if(x<=0){

aa=0;} if(y<=200&&y>=0){

if(yy==0)y++;

if(yy==1)y--;} if(y>=200){

yy=1;} if(y<=-200){

yy=0;} if(z<=400&&z>=0){

if(zz==0)z++;

if(zz==1)z--;} if(z>=400){

zz=1;} if(z<=0){

//矩形反弹

}

zz=0;

} } } return 0;

第四篇:嵌入式系统实验

南京信息工程大学 实验(实习)报告

实验(实习)名称

电机转动控制及中断实验 实验(实习)日期

2016.5 得分

指导教师 谢胜东

学院 计算机与软件 专业 计算机科学与技术 年级

2013 班次 3 姓名

叶正舟 学号

20131308072 实验名称

电机转动控制及中断实验 实验目的

(1)熟悉ARM本身自带的六路即三对PWM,掌握相应寄存器的配置

(2)编程实现 ARM系统的PWM 输出和I/O 输出,前者用于控制直流电机,后者用于控制步进电机。

(3)了解直流电机和步进电机的工作原理,学会用软件的方法实现步进电机的脉冲分配,即用软件的方法代替硬件的脉冲分配器。

(4)掌握带有PWM 和I/O 的CPU 编程实现其相应功能的主要方法。实验环境

(1)ADS1.2开发环境(2)PC(3)串口线 实验内容及要求

学习步进电机和直流电机的工作原理,了解实现两个电机转动对于系统的软件和硬件要求。学习ARM知识,掌握PWM 的生成方法,同时也要掌握I/O 的控制方法。

(1)编程实现ARM芯片的一对PWM 输出用于控制直流电机的转动,通过A/D 旋钮控制其正反转及转速

(2)编程实现ARM的四路I/O 通道实现环形脉冲分配用于控制步进电机的转动,通过A/D 旋钮转角控制步进电机的转角。

(3)通过超级终端来控制直流电机与步进电机的切换。实验设计与实验步骤

(1)新建工程,将“电机转动控制实验”中的文件添加到工程(2)编写直流电机初始化数(MotorCtrl.c)(3)控制直流电机与步进电机 实验过程与分析

(1)通过把从串口中得到控制信息的代码修改成从zlg7289芯片中读取小键盘信息,从而利用试验台的小键盘来控制步进电机和直流电机的切换

(2)A/D转换可以把电信号转换成数字信号来控制电机的转速。for(;;)

{ loop:

//if((rUTRSTAT0 & 0x1))//有输入,则返回

if(rPDATG&ZLG7289_KEY)//17键小键盘控制电机

{

*Revdata=RdURXH0();

goto begin;

}

Delay(10);ADData=GetADresult(0);

if(abs(lastADData-ADData)<20)

goto loop;Delay(10);count=-(ADData-lastADData)*3;

//(ADData-lastADData)*270/1024为ad旋钮转过的角度,360/512为步距角,//由于接了1/8减速器,两者之商再乘以8为步进电机相应转过的角度

if(count>=0)

{//转角大于零

for(j=0;j

{

for(i=0;i<=7;i++)

{

SETEXIOBITMASK(stepdata[i], 0xf0);

Delay(200);

}

}

}

lastADData=ADData;

} } 实验结果总结

利用A/D转换器实现了对直流电机和步进电机的控制,利用实验设备上自带的小键盘实现了A/D转换器对两个电机控制的切换。心得体会

通过本次实验,熟悉了ARM自带的六路(三对)PWM,并对直流电机和步进电机的工作原理有了进一步的了解。

第五篇:嵌入式实验2

南昌航空大学实验报告

二0一一 年 10月 16日

课程名称: 嵌入式系统 实验名称: 串行端口程序设计 班 级: 080611 学生姓名: 曹启斌 学号: 08061107 指导教师评定: 签名:

一、实验目的 了解在linux环境下串行程序设计的基本方法。掌握终端的主要属性及设置方法,熟悉终端IO函数的使用。3 学习使用多线程来完成串口的收发处理。

二、实验内容

读懂程序源代码,学习终端IO函数tcgetattr(), tcsetattr(),tcflush()的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。

三、预备知识

1、有C语言基础。

2、掌握在LINUX下常用编辑器的使用。

3、掌握Makefile 的编写和使用。

4、掌握Linux下的程序编译与交叉编译过程

四、实验设备及工具

硬件:UP-NETARM2410-S嵌入式实验仪,PC机pentumn500以上, 硬盘40G以上,内存大于128M。

软件:PC机操作系统REDHAT LINUX 9.0 +MINICOM + AMRLINUX开发环境

五、实验原理

Linux 操作系统从一开始就对串行口提供了很好的支持,为进行串行通讯提供了大量的函数,我们的实验主要是为掌握在LINUX中进行串行通讯编程的基本方法。

1.程序流程图

程序流程图如图2-3所示:

图2-3 程序流程图

2串口操作需要的头文件

#include /*标准输入输出定义*/ #include /*标准函数库定义*/ #include /*linux标准函数定义*/ #include #include #include /*文件控制定义*/ #include /*PPSIX 终端控制定义*/ #include /*错误号定义*/ #include

/*线程库定义*/ 3打开串口

在 Linux 下串口文件是位于 /dev 下,串口一为/dev/ttyS0,串口二为 /dev/ttyS1,打开串口是通过使用标准的文件打开函数操作:

int fd;/*以读写方式打开串口*/ fd = open(“/dev/ttyS0”, O_RDWR);if(-1 == fd){ perror(“ 提示错误!”);}

4设置串口

最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值。

struct termio { unsigned short c_iflag;/* 输入模式标志 */

unsigned short c_oflag;/* 输出模式标志 */

unsigned short c_cflag;/* 控制模式标志 */

unsigned short c_lflag;/* local mode flags */

unsigned char c_line;/* line discipline */

unsigned char c_cc[NCC];/* control characters */ };设置这个结构体很复杂,可以参考man手册或者由赵克佳、沈志宇编写的《UNIX程序编写教程》,我这里就只考虑常见的一些设置:

波特率设置:

下面是修改波特率的代码: struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200);/*设置为19200Bps*/ cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);校验位和停止位的设置: 无效验 8位

Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS8;奇效验(Odd)7位

Option.c_cflag |= ~PARENB;Option.c_cflag &= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;偶效验(Even)7位

Option.c_cflag &= ~PARENB;Option.c_cflag |= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;Space效验 7位

Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= &~CSIZE;Option.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*/ 5读写串口

设置好串口之后,读写串口就很容易了,把串口当作文件读写就可以了。发送数据:

char buffer[1024];int Length=1024;int nByte;nByte = write(fd, buffer ,Length)读取串口数据:

使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。

可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作。char buff[1024];int Len=1024;int readByte = read(fd, buff, Len);6关闭串口

关闭串口就是关闭文件。close(fd);7空MODEM通讯连接电缆

一般进行串口调试使用空MODEM连接电缆,其接线方式如下图2-4所示:

图2-4 实用RS-232C通讯连线

六、实验步骤

1.2.3.4.进入expbasic3_tty目录,使用vi编辑器或其他编辑器阅读理解源代码。运行make产生term可执行文件

切换到minicom终端窗口,使用NFS mount开发主机的/arm2410到/host目录。

进入expbasic3_tty目录,运行term,观察运行结果的正确性。由于内核已经将串口1 作为终端控制台,所以可以看到term发出的数据,却无法看到开发主机发来的数据,可以使用另外一台主机连接串口2进行收发测试。5.修改一些参数,再次运行调试,加深对串口编程的理解。6.参考源代码:

#include #include #include #include #include #include

#define BAUDRATE B115200 #define COM1 “/dev/ttyS0” #define COM2 “/dev/ttyS1” #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;}

/*-------------------------*/ void* keyboard(void * data){ int c;for(;;){

c=getchar();if(c== ENDMINITERM){ STOP=TRUE;break;} }

return NULL;} /*-------------------------*/ /* modem input handler */ void* receive(void * data){ int c;printf(“read modemn”);while(STOP==FALSE){ read(fd,&c,1);/* com port */ write(1,&c,1);/* stdout */ } printf(“exit from reading modemn”);return NULL;} /*-------------------------*/ void* send(void * data){ int c='0';printf(“send datan”);while(STOP==FALSE)/* modem input handler */ { c++;c %= 255;write(fd,&c,1);/* stdout */ usleep(100000);} return NULL;/* wait for child to die or it will become a zombie */ } /*-------------------------*/ int main(int argc,char** argv){

struct termios oldtio,newtio,oldstdtio,newstdtio;struct sigaction sa;int 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);

if(fd <0){ error(COM1);exit(-1);} tcgetattr(0,&oldstdtio);tcgetattr(fd,&oldtio);/* save current modem settings */ tcgetattr(fd,&newstdtio);/* get working stdtio */ newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;/*ctrol flag*/ newtio.c_iflag = IGNPAR;/*input flag*/ newtio.c_oflag = 0;/*output flag*/ newtio.c_lflag = 0;newtio.c_cc[VMIN]=1;newtio.c_cc[VTIME]=0;/* now clean the modem line and activate the settings for modem */ tcflush(fd, TCIFLUSH);tcsetattr(fd,TCSANOW,&newtio);/*set attrib*/

sa.sa_handler = child_handler;sa.sa_flags = 0;sigaction(SIGCHLD,&sa,NULL);/* handle dying child */ pthread_create(&th_a, NULL, keyboard, 0);pthread_create(&th_b, NULL, receive, 0);pthread_create(&th_c, NULL, send, 0);pthread_join(th_a, &retval);pthread_join(th_b, &retval);pthread_join(th_c, &retval);

tcsetattr(fd,TCSANOW,&oldtio);/* restore old modem setings */ tcsetattr(0,TCSANOW,&oldstdtio);/* restore old tty setings */ close(fd);exit(0);}

七、心得体会

通过本次实验,我了解在linux环境下串行程序设计的基本方法,对它的操作有了更深入的认识。我了解到了实践的重要性。概念固然重要,但是只有用软件真正地实践过,才能发现问题,分析问题,最终解决问题。

下载嵌入式实验6交叉编译及Linux简单程序设计实验word格式文档
下载嵌入式实验6交叉编译及Linux简单程序设计实验.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    2016嵌入式实验心得体会(合集)

    2016嵌入式实验心得体会 嵌入式实验心得体会是计算机专业应该具备的常用知识,以下这篇范文整理个人对嵌入式系统的认识,和进行操作之后的个人体会,对操作的疑难的反思。下面是......

    嵌入式linu学习心得(5篇范例)

    嵌入式Linux学习心得1、 Linux命令 ls:查看目录-l以列表方式查看;ls –l 与ll的功能一样 pwd: 查看当前的目录 cd:改变当前操作目录cd /直接跳到根目录 cd ..回到上一级目录......

    实验二 定时器程序设计121

    一、 实验目的学会使用单片机定时器产生定时中断,并利用定时中断产生更长时间延时。二、实验设备及器件 IBM PC机一台 DP-51PRO.NET单片机仿真器、编程器、实验仪三合一综......

    UML程序设计实验指导书

    《UML程序设计》 实验指导教程 适合专业:计算机类专业 浙江树人大学信息科技学院 2016.02 课程与实验综述 第一部分实验综述 一.课程简介及实践要求: 《UML程序设计》是以介绍......

    UML程序设计实验指导书

    《UML程序设计》 实验指导教程 适合专业:计算机科学技术09 浙江树人大学信息科技学院 2012.02 课程与实验综述 第一部分实验综述 一.课程简介及实践要求: 《UML程序设计》是以......

    vb程序设计实验心得(大全)

    vb程序设计实验心得 vb程序设计实验心得一:数据库VB课程设计心得体会 数据库课程设计大赛的尘嚣渐渐远去,怀着对这次大赛的些许不舍,怀着对当初课程设计开始时候的豪情万丈的......

    Java程序设计实验2

    学 生 实 验 报 告 册 课程名称: 学生学号: 所属院部: (理工类) 专业班级: 学生姓名: 指导教师: 20 ——20 学年 第 学期 金陵科技学院教务处制 实验报告书写要求 实验报告......

    Java程序设计实验5篇

    学 生 实 验 报 告 册 课程名称: 学生学号: 所属院部: (理工类) 专业班级: 学生姓名: 指导教师: 20 ——20 学年 第 学期 金陵科技学院教务处制 实验报告书写要求 实验报告......