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,b