LINUX实验报告.docx
- 文档编号:26804401
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:24
- 大小:20.02KB
LINUX实验报告.docx
《LINUX实验报告.docx》由会员分享,可在线阅读,更多相关《LINUX实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
LINUX实验报告
(此文档为word格式,下载后您可任意编辑修改!
)
本科生实验报告
实验课程多传感器信息融合技术
学院名称信息科学与技术学院
专业名称物联网工程
学生姓名何月明
学生学号
指导教师赖武刚
实验地点6B607
实验成绩
二〇14年11月二〇14年12月
题目1.按键控制蜂鸣器增减
一、实验要求。
(1)按键1:
启动/停止蜂鸣器。
按键2:
增加频率10Hz按键3:
减小频率10Hz
按键8:
退出程序。
(2)程序初始化完成后,蜂鸣器的默认状态是停止。
2、实验流程图。
3、实验步骤。
首先明白实验的要求,从按键,数据采集去考虑程序的写法。
则程序可如下:
#include
#include
#include
#include
#include
#include
#include
#include
#definePWM_IOCTL_SET_FREQ1
#definePWM_IOCTL_STOP0
#defineESC_KEY0x1b
staticintgetch(void){
structtermiosoldt,newt;
intch;
if(!
isatty(STDIN_FILENO)){
fprintf(stderr,"thisproblemshouldberunataterminal\n");
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("/dev/pwm",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("/dev/buttons",0);
if(buttons_fd<0)
{
printf("opendevicebuttons");
exit
(1);
}
fd=open("/dev/pwm",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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#definePWM_IOCTL_SET_FREQ1
#definePWM_IOCTL_STOP0
#defineBUFFER_SIZE1024
#defineESC_KEY0x1b
#defineADCWR_FILE_NAME"adcdata.dat"
staticintfd=-1;
staticvoidclose_buzzer(void);
staticvoidopen_buzzer(void)
{
fd=open("/dev/pwm",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("/dev/adc",0);
if(adc_fd<0){
perror("openADCdevice:
");
return1;
}
intbuttons_fd=open("/dev/buttons",O_NONBLOCK);
if(buttons_fd<0)
{
printf("opendevicebuttons");
exit
(1);
}
intpwm_fd=open("/dev/pwm",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
#include
#include
#include
#include
#include
#include"uart_api.h"
#defineADCWR_FILE_NAME"adcdata2.dat"
intmain(void)
{
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
#include
#include
#include
#include
#include
#include"uart_api.h"
intmain(void)
{
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
#include
#include
#include
#include
#include
#include
#include
#include
#definePORT4321
#defineBUFFER_SIZE1024
intmain(intargc,char*argv[])
{
intsockfd,sendbytes;
charbuf[BUFFER_SIZE];
chars1[300];
chars2[20];
structhostent*host;
structsockaddr_inserv_addr;
charbuffer[30];
inti;
intk=0;
if(argc<3)
{
fprintf(stderr,"USAGE:
./clientHostname(oripaddress)Text\n");
exit
(1);
}
/*地址解析函数*/
if((host=gethostbyname(argv[1]))==NULL)
{
perror("gethostbyname");
exit
(1);
}
memset(buf,0,sizeof(buf));
memset(s1,0,300);
memset(s2,0,20);
/*sprintf(buf,"%s",argv[2]);*/
/*创建socket*/
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit
(1);
}
/*设置sockaddr_in结构体中相关参数*/
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
serv_addr.sin_addr=*((structin_addr*)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
/*调用connect函数主动发起对服务器端的连接*/
if(connect(sockfd,(structsockaddr*)&serv_addr,sizeof(structsockaddr))==-1)
{
perror("connect");
exit
(1);
}
intadc_fd=open("/dev/adc",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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINUX 实验 报告