LINUX实验报告.docx
- 文档编号:7057800
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:18
- 大小:19.35KB
LINUX实验报告.docx
《LINUX实验报告.docx》由会员分享,可在线阅读,更多相关《LINUX实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
LINUX实验报告
(此文档为word格式,下载后您可任意编辑修改!
)
本科生实验报告
实验课程多传感器信息融合技术
学院名称信息科学与技术学院
专业名称物联网工程
学生姓名何月明
学生学号
指导教师赖武刚
实验地点6B607
实验成绩
二〇14年11月二〇14年12月
题目1.按键控制蜂鸣器增减
一、实验要求。
(1)按键1:
启动停止蜂鸣器。
按键2:
增加频率10Hz按键3:
减小频率10Hz
按键8:
退出程序。
(2)程序初始化完成后,蜂鸣器的默认状态是停止。
2、实验流程图。
3、实验步骤。
首先明白实验的要求,从按键,数据采集去考虑程序的写法。
则程序可如下:
#include exit (1); } saveterminalsetting if(tcgetattr(STDIN_FILENO,&oldt)<0){ perror("savetheterminalsetting"); exit (1);} setterminalasneed newt=oldt; newt.c_lflag&=~(ICANON|ECHO); if(tcsetattr(STDIN_FILENO,TCSANOW,&newt)<0){ perror("setterminal"); exit (1);} ch=getchar(); open_buzzer(); restoretermialsetting if(tcsetattr(STDIN_FILENO,TCSANOW,&oldt)<0){ perror("restorethetermialsetting"); exit (1);} returnch; } staticintfd=-1; staticvoidclose_buzzer(void); staticvoidopen_buzzer(void) { fd=open("devpwm",0); if(fd<0){ perror("openpwm_buzzerdevice"); exit (1); } anyfunctionexitcallwillstopthebuzzer atexit(close_buzzer); } staticvoidclose_buzzer(void) { if(fd>=0){ ioctl(fd,PWM_IOCTL_STOP); if(ioctl(fd,2)<0){ perror("ioctl2: "); } close(fd); fd=-1; } } staticvoidset_buzzer_freq(intfreq) { thisIOCTLcommandisthekeytosetfrequency intret=ioctl(fd,PWM_IOCTL_SET_FREQ,freq); if(ret<0){ perror("setthefrequencyofthebuzzer"); exit (1); } } staticvoidstop_buzzer(void) { intret=ioctl(fd,PWM_IOCTL_STOP); if(ret<0){ perror("stopthebuzzer"); exit (1); } if(ioctl(fd,2)<0){ perror("ioctl2: "); } } intmain(intargc,char**argv) { intfreq=1000; intbuttons_fd; inti; intkey; charbutons[8]={'0','0','0','0','0','0','0','0'}; charcurrent_buttons[8]; intcount_of_changed_key; buttons_fd=open("devbuttons",0); if(buttons_fd<0) { printf("opendevicebuttons"); exit (1); } fd=open("devpwm",0); if(fd<0) { perror("openpwm_buzzerdevice"); exit (1); } while (1) { printf("\tFreq=%d\n",freq); if(read(buttons_fd,current_buttons,sizeofcurrent_buttons)! =sizofcurrent_buttons) { perror("readbutons: "); exit (1); } for(i=0;i<8;i++) { if(buttons[i]! =current_buttons[i]) { buttons[i]=current_buttons[i]; if(buttons[i]=='1') key=i+1; } } switch(key) { case1: set_buzzer_freq(freq); break; case2: if(freq<20000) freq+=10; set_buzzer_freq(freq); break; case3: if(freq>11) freq-=10; set_buzzer_freq(freq); break; case8: stop_buzzer(); exit(0); default: break;c} } } 题目2.模拟电压采集报警 一、实验要求。 功能: (1)按键1: 启动停止ADC,按键8: 退出程序。 (2)程序初始化完成后,ADC的默认状态是停止。 (3)ADC工作时,每秒采样一次电压,采集的数据写入文件adcdata.dat文件保存。 (4)当ADC采样值超过1.5V的时候,蜂鸣器报警。 二、流程图。 三、实验步骤。 #include { fd=open("devpwm",0); if(fd<0){ perror("openpwm_buzzerdevice"); exit (1); } anyfunctionexitcallwillstopthebuzzer atexit(close_buzzer); } staticvoidclose_buzzer(void) { if(fd>=0){ ioctl(fd,PWM_IOCTL_STOP); if(ioctl(fd,2)<0){ perror("ioctl2: "); } close(fd); fd=-1; } } staticvoidset_buzzer_freq(intfreq) { thisIOCTLcommandisthekeytosetfrequency intret=ioctl(fd,PWM_IOCTL_SET_FREQ,freq); if(ret<0){ perror("setthefrequencyofthebuzzer"); exit (1); } } staticvoidstop_buzzer(void) { intret=ioctl(fd,PWM_IOCTL_STOP); if(ret<0){ perror("stopthebuzzer"); exit (1); } } intmain(void) {intkey=0; intfreq=1000; charbuttons[8]={'0','0','0','0','0','0','0','0'}; charcurrent_buttons[8]; intcount_of_changed_key; inti; intlen; charbuffer[30]; intadc_wr; intflag1; intflag2; unsignedcharbuff[BUFFER_SIZE]; fprintf(stderr,"pressCtrl-Ctostop\n"); intadc_fd=open("devadc",0); if(adc_fd<0){ perror("openADCdevice: "); return1; } intbuttons_fd=open("devbuttons",O_NONBLOCK); if(buttons_fd<0) { printf("opendevicebuttons"); exit (1); } intpwm_fd=open("devpwm",0); if(pwm_fd<0) { perror("openpwm_buzzerdevice"); exit (1); } while (1) { printf("\tFreq=! ! %d\n",key); intlen=read(buttons_fd,current_buttons,sizeofcurrent_buttons); printf("len: %d",len); for(flag2=0;flag2<10;flag2++) { for(i=0;i<8;i++) { if(buttons[i]! =current_buttons[i]) { buttons[i]=current_buttons[i]; if(buttons[i]=='1') key=i+1; } usleep(10*1000); } } switch(key) { case1: if(flag1==0) { flag1=1; } else { flag1=0; } break; case8: close(adc_fd); exit(0); break; } key=0; } if(flag1==1) { printf("\tFreq=! ! ! %d\n",key); len=read(adc_fd,buffer,sizeofbuffer-1); adc_wr=open(ADCWR_FILE_NAME,O_WRONLY|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); if(len>0) { if(len>1500) { set_buzzer_freq(freq); } else { buffer[len]='\0'; intvalue=-1; sscanf(buffer,"%d",&value); printf("ADCValue: %d\n",value); write(adc_wr,buffer,len); } } else { perror("readADCdevice: "); return1; } } } 题目3.串口数据保存 1、实验要求。 (1)PC(ubuntu)串口(COM2)定时(0.1s)通过发送字符串¡°COMData: num\n”,其中num是指的是序号,每次发送序号加1,共计发送100次。 (2)ARM(实验板)串口COM2接收PC(ubuntu)发过来的数据,将数据写入到comdata.dat的文件保存。 2、实验流程图。 3、实验步骤。 Read可读文件: #include { intfd; intadc_wr; charbuff[BUFFER_SIZE]; if((fd=open_port(TARGET_COM_PORT))<0){ perror("open_port"); return1; } if(set_com_config(fd,8,'N',1)<0) { perror("set_com_config"); return1; } do { memset(buff,0,BUFFER_SIZE); if(read(fd,buff,BUFFER_SIZE)>0) { adc_wr=open(ADCWR_FILE_NAME,O_WRONLY|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);); write(adc_wr,buff,sizeof(buff)); } }while(strncmp(buff,"quit",4)); close(fd); return0; } Write可写文件: #include { intfd; charbuff[BUFFER_SIZE]; chars[20]; inti; if((fd=open_port(HOST_COM_PORT))<0) { perror("open_port"); return1; } if(set_com_config(fd,8,'N',1)<0) { perror("set_com_config"); return1; } for(i=0;i<100;i++) { memset(buff,0,BUFFER_SIZE); memset(s,0,20); sprintf(s,"%d",i); *memcpy(buff,"COMData: ",BUFFER_SIZE);* strcpy(buff,"COMData: "); strcat(buff,s); *if(fgets(buff,BUFFER_SIZE,stdin)==NULL) { perror("fgets"); break; }* write(fd,buff,strlen(buff)); usleep(100*1000); } memset(buff,0,BUFFER_SIZE); strcpy(buff,"quit"); write(fd,buff,strlen(buff)); close(fd); return0; } 编程设计题: ADC数据网络传输程序 1、实验要求。 (1)读取ADC频率为50次每秒. (2)当读取了50次数据再通过TCP发送数据。 (3)PC和ARM程序需要做网络传输包的计数器。 (每次传输的数据(50字节)叫一个网络包。 ) (4)PC服务端需要将接收的网络包数和数据打印出来,并保存到文件名为adc_tcp文件中。 2、实验流程图。 3、实验步骤。 在pc建立tcpserver端,接收arm实验板发送的数据。 在arm实验板上采集adc数据,在通过tcp将adc采集的数据发送到pc。 则client端: #include { intsockfd,sendbytes; charbuf[BUFFER_SIZE]; chars1[300]; chars2[20]; structserv_addr; charbuffer[30]; inti; intk=0; if(argc<3) { fprintf(stderr,"USAGE: .clientHostname(oripaddress)Text\n"); exit (1); } *地址解析函数* if((结构体中相关参数* serv_addr.sin_family=AF_INET; serv_addr.sin_port=_addr=*((structin_addr*)_zero),8); *调用connect函数主动发起对服务器端的连接* if(connect(sockfd,(structsockaddr*)&serv_addr,sizeof(structsockaddr))==-1) { perror("connect"); exit (1); } intadc_fd=open("devadc",0); if(adc_fd<0){ perror("openADCdevice: "); return1; } while (1) { k++; sprintf(s2,"thenumber%-2d",k); strcat(buf,s2); for(i=0;i<50;i++) { intlen=read(adc_fd,buffer,sizeofbuffer-1); buffer[len]='\0'; intvalue=-1; sscanf(buffer,"%d",&value); printf("ADCValue: %d\n",value); sprintf(s1,"%4d",value); strcat(buf,s1); usleep(20*1000); } *发送消息给服务器端* if((sendbytes=send(sockfd,buf,strlen(buf),0))==-1) { perror("send"); exit (1); } memset(s1,0,300); memset(buf,0,sizeof(buf)); } close(sockfd); exit(0); } Server端: #include { structsockaddr_inserver_sockaddr,client_sockaddr; intsin_size,recvbytes; intsockfd,client_fd; charbuf[BUFFER_SIZE]; intadc_wr; *建立socket连接* if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); exit (1); } printf("Socketid=%d\n",sockfd); *设置sockaddr_in结构体中相关参数* server_sockaddr.sin_family=AF_INET; server_sockaddr.sin_port=_addr.s_addr=INADDR_ANY; bzero(&(server_sockaddr.sin_zero),8); inti=1;*使得重复使用本地地址与套接字进行绑定* setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i)); *绑定函数bind* if(bind(sockfd,(structsockaddr*)&server_sockaddr,sizeof(structsockaddr))==-1) { perror("bind"); exit (1); } printf("Bindsuccess! \n"); *调用listen函数* if(listen(sockfd,MAX_QUE_CONN_NM)==-1) { perror("listen"); exit (1); } printf("Listening....\n"); *调用accept函数,等待客户端的连接* if((client_fd=accept(sockfd,(structsockaddr*)&client_sockaddr,&sin_size))==-1) { perror("accept"); exit (1); } printf("ClientSocketid=%d\n",client_fd); while (1) {*调用recv函数接收客户端的请求* memset(buf,0,sizeof(buf)); if((recvbytes=recv(client_fd,buf,BUFFER_SIZE,0))==-1) { perror("recv"); exit (1); } printf("Receivedamessage: %s\n",buf); printf("! ! ! %d\n",recvbytes); adc_wr=open(ADCWR_FILE_NAME,O_WRONLY|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); write(adc_wr,buf,rec
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINUX 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)