嵌入式系统实验串行端口程序设计.docx
《嵌入式系统实验串行端口程序设计.docx》由会员分享,可在线阅读,更多相关《嵌入式系统实验串行端口程序设计.docx(7页珍藏版)》请在冰豆网上搜索。
![嵌入式系统实验串行端口程序设计.docx](https://file1.bdocx.com/fileroot1/2023-1/9/f267b49a-fee6-44c8-a029-836698f079a4/f267b49a-fee6-44c8-a029-836698f079a41.gif)
嵌入式系统实验串行端口程序设计
实验报告
(2011/2012学年第2学期)
课程名称
嵌入式系统B
实验名称
串行端口程序设计
实验时间
2012
年
6
月
18
日
指导单位
通信与信息工程学院
指导教师
王诚
学生姓名
班级学号
学院(系)
通信与信息工程学院
专业
电子信息工程
实验名称
串行端口程序设计
指导教师
王诚
实验类型
验证试验
实验学时
4
实验时间
2012.6.18
一、实验目的和要求
目的:
了解在linux环境下串行程序设计的基本方法,掌握终端的主要属性及设置方法,熟悉终端I/O函数的使用,学习使用多线程来完成串口的收发处理。
要求:
读懂程序源代码,学习终端I/O函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中
二、实验环境(实验设备)
硬件:
UP-NETARM2410-S嵌入式实验平台、PC机Pentium500以上,硬盘10G以上。
软件:
PC机操作系统REDHATLINUX9.0+MINICOM+ARM-LINUX开发环境
三、实验原理及内容
实验内容:
了解在linux环境下串行程序设计的基本方法。
掌握终端的主要属性及设置方法,熟悉终端I/O函数的使用。
学习使用多线程来完成串口的收发处理要求
实验步骤:
1、阅读理解源码
进入exp\basic\03_tty目录,使用vi编辑器阅读理解源代码。
源代码如下:
#include
#include
#include
#include
#include
#include
#defineBAUDRATEB115200
#defineCOM1"/dev/ttyS0"
#defineCOM2"/dev/ttyS1"
#defineENDMINITERM27/*ESCtoquitminiterm*/
#defineFALSE0
#defineTRUE1
volatileintSTOP=FALSE;
volatileintfd;
voidchild_handler(ints)
{
printf("stop!
!
!
\n");
STOP=TRUE;
}
/*--------------------------------------------------------*/
void*keyboard(void*data)
{
intc;
for(;;){
c=getchar();
if(c==ENDMINITERM){
STOP=TRUE;
break;
}
}
returnNULL;
}
/*--------------------------------------------------------*/
/*modeminputhandler*/
void*receive(void*data)
{
intc;
printf("readmodem\n");
while(STOP==FALSE)
{
read(fd,&c,1);/*comport*/
write(1,&c,1);/*stdout*/
}
printf("exitfromreadingmodem\n");
returnNULL;
}
/*--------------------------------------------------------*/
void*send(void*data)
{
intc='0';
printf("senddata\n");
while(STOP==FALSE)/*modeminputhandler*/
{
c++;
c%=255;
write(fd,&c,1);/*stdout*/
usleep(100000);
}
returnNULL;}
/*--------------------------------------------------------*/
intmain(intargc,char**argv)
{
structtermiosoldtio,newtio,oldstdtio,newstdtio;
structsigactionsa;
intok;
pthread_tth_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);/*savecurrentmodemsettings*/
tcgetattr(fd,&newstdtio);/*getworkingstdtio*/
newtio.c_cflag=BAUDRATE|CRTSCTS|CS8|CLOCAL|CREAD;/*ctrolflag*/
newtio.c_iflag=IGNPAR;/*inputflag*/
newtio.c_oflag=0;/*outputflag*/
newtio.c_lflag=0;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
/*nowcleanthemodemlineandactivatethesettingsformodem*/
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);/*setattrib*/
sa.sa_handler=child_handler;
sa.sa_flags=0;
sigaction(SIGCHLD,&sa,NULL);/*handledyingchild*/
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);/*restoreoldmodemsetings*/
tcsetattr(0,TCSANOW,&oldstdtio);/*restoreoldttysetings*/
close(fd);
exit(0);
}
2、编译应用程序
运行make产生term可执行文件
[root@zxtroot]#cd/arm2410s/exp/basic/03_tty/
[root@zxt03_tty]#make
armv4l-unknown-linux-gcc-c-oterm.oterm.c
armv4l-unknown-linux-gcc-o../bin/termterm.o-lpthread
armv4l-unknown-linux-gcc-otermterm.o-lpthread
[root@zxt03_tty]#ls
MakefileMakefile.baktermterm.cterm.otty.c
3、下载调试
切换到minicom终端窗口,使用NFSmount开发主机的/arm2410s到/host目录。
进入exp\basic\03_tty目录,运行term,观察运行结果的正确性。
[root@zxtroot]#minicom
[/mnt/yaffs]mount-tnfs-onolock192.168.0.56:
/arm2410s/host
[/mnt/yaffs]cd/host/exp/basic/03_tty/
[/host/exp/basic/03_tty]./term
readmodem
senddata
123456789:
;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWX
由于内核已经将串口1作为终端控制台,所以可以看到term发出的数据,却无法看到开发主机发来的数据,可以使用另外一台主机连接串口2进行收发测试。
Ctrl+c可使程序强行退出。
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
本次实验,对串行口在嵌入式系统中的应用有了初步的了解。
在源程序的阅读理解中有一定的困难,由于对嵌入式实验平台和Linux的不熟悉,具体操作步骤操作起来有些困难和不理解。
五、指导教师评语
成绩
批阅人
日期