实 验 报 告
( 2014/ 20## 学年 第一学期)
实 验 报 告
实 验 报 告
实 验 报 告
本科生实验报告
实验课程 多传感器信息融合技术
学院名称 信息科学与技术学院
专业名称 物联网工程
学生姓名 何月明
学生学号 201213060307
指导教师 赖武刚
实验地点 6B607
实验成绩
二〇 14 年 11月 二〇 14年12月
题目1.按键控制蜂鸣器增减
一、实验要求。
(1)按键1:启动/停止蜂鸣器。
按键2:增加频率10Hz 按键3:减小频率10Hz
按键8:退出程序。
(2)程序初始化完成后,蜂鸣器的默认状态是停止。
二、实验流程图。
三、实验步骤。
首先明白实验的要求,从按键,数据采集去考虑程序的写法。则程序可如下:
#include <termios.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define PWM_IOCTL_SET_FREQ 1
#define PWM_IOCTL_STOP 0
#define ESC_KEY 0x1b
static int getch(void){
struct termios oldt,newt;
int ch;
if (!isatty(STDIN_FILENO)) {
fprintf(stderr, "this problem should be run at a terminal\n");
exit(1);
}
// save terminal setting
if(tcgetattr(STDIN_FILENO, &oldt) < 0) {
perror("save the terminal setting");
exit(1); }
// set terminal as need
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
if(tcsetattr(STDIN_FILENO,TCSANOW, &newt) < 0) {
perror("set terminal");
exit(1);}
ch = getchar();
open_buzzer();
// restore termial setting
if(tcsetattr(STDIN_FILENO,TCSANOW,&oldt) < 0) {
perror("restore the termial setting");
exit(1);}
return ch;
}
static int fd = -1;
static void close_buzzer(void);
static void open_buzzer(void)
{
fd = open("/dev/pwm", 0);
if (fd < 0) {
perror("open pwm_buzzer device");
exit(1);
}
// any function exit call will stop the buzzer
atexit(close_buzzer);
}
static void close_buzzer(void)
{
if (fd >= 0) {
ioctl(fd, PWM_IOCTL_STOP);
if (ioctl(fd, 2) < 0) {
perror("ioctl 2:");
}
close(fd);
fd = -1;
}
}
static void set_buzzer_freq(int freq)
{
// this IOCTL command is the key to set frequency
int ret = ioctl(fd, PWM_IOCTL_SET_FREQ, freq);
if(ret < 0) {
perror("set the frequency of the buzzer");
exit(1);
}
}
static void stop_buzzer(void)
{
int ret = ioctl(fd, PWM_IOCTL_STOP);
if(ret < 0) {
perror("stop the buzzer");
exit(1);
}
if (ioctl(fd, 2) < 0) {
perror("ioctl 2:");
}
}
int main(int argc, char **argv)
{
int freq = 1000 ;
int buttons_fd;
int i;
int key;
char butons[8]={'0','0','0','0','0','0','0','0'};
char current_buttons[8];
int count_of_changed_key;
buttons_fd=open("/dev/buttons", 0);
if(buttons_fd<0)
{
printf("open device buttons");
exit(1);
}
fd = open("/dev/pwm", 0);
if (fd < 0)
{
perror("open pwm_buzzer device");
exit(1);
}
while( 1 )
{
printf( "\tFreq = %d\n", freq );
if(read(buttons_fd,current_buttons,size of current_buttons)!=sizof current_buttons)
{
perror("read butons:");
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)
{
case 1:
set_buzzer_freq(freq );
break;
case 2:
if( freq < 20000 )
freq += 10;
set_buzzer_freq(freq );
break;
case 3:
if( freq > 11 )
freq -= 10 ;
set_buzzer_freq(freq );
break;
case 8:
stop_buzzer();
exit(0);
default:
break;c}
}
}
题目2.模拟电压采集报警
一、实验要求。
功能:(1)按键1:启动/停止ADC,按键8:退出程序。
(2)程序初始化完成后,ADC的默认状态是停止。
(3)ADC工作时,每秒采样一次电压,采集的数据写入文件adcdata.dat文件保存。
(4)当ADC采样值超过1.5V的时候,蜂鸣器报警。
二、流程图。
三、实验步骤。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/fs.h>
#include <errno.h>
#include <string.h>
#define PWM_IOCTL_SET_FREQ 1
#define PWM_IOCTL_STOP 0
#define BUFFER_SIZE 1024
#define ESC_KEY 0x1b
#define ADCWR_FILE_NAME "adcdata.dat"
static int fd = -1;
static void close_buzzer(void);
static void open_buzzer(void)
{
fd = open("/dev/pwm", 0);
if (fd < 0) {
perror("open pwm_buzzer device");
exit(1);
}
// any function exit call will stop the buzzer
atexit(close_buzzer);
}
static void close_buzzer(void)
{
if (fd >= 0) {
ioctl(fd, PWM_IOCTL_STOP);
if (ioctl(fd, 2) < 0) {
perror("ioctl 2:");
}
close(fd);
fd = -1;
}
}
static void set_buzzer_freq(int freq)
{
// this IOCTL command is the key to set frequency
int ret = ioctl(fd, PWM_IOCTL_SET_FREQ, freq);
if(ret < 0) {
perror("set the frequency of the buzzer");
exit(1);
}
}
static void stop_buzzer(void)
{
int ret = ioctl(fd, PWM_IOCTL_STOP);
if(ret < 0) {
perror("stop the buzzer");
exit(1);
}
}
int main(void)
{ int key=0;
int freq = 1000 ;
char buttons[8]={'0','0','0','0','0','0','0','0'};
char current_buttons[8];
int count_of_changed_key;
int i;
int len;
char buffer[30];
int adc_wr;
int flag1;
int flag2;
unsigned char buff[BUFFER_SIZE];
fprintf(stderr, "press Ctrl-C to stop\n");
int adc_fd = open("/dev/adc", 0);
if (adc_fd < 0) {
perror("open ADC device:");
return 1;
}
int buttons_fd=open("/dev/buttons", O_NONBLOCK);
if(buttons_fd<0)
{
printf("open device buttons");
exit(1);
}
int pwm_fd = open("/dev/pwm", 0);
if (pwm_fd < 0)
{
perror("open pwm_buzzer device");
exit(1);
}
while( 1 )
{
printf( "\tFreq =!! %d\n", key );
int len =read(buttons_fd,current_buttons,sizeof current_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)
{
case 1:if(flag1==0)
{
flag1=1;
}
else
{
flag1=0;
}
break;
case 8:
close(adc_fd);
exit(0);
break;
}
key=0;
}
if(flag1==1)
{
printf( "\tFreq =!!! %d\n", key );
len = read(adc_fd, buffer, sizeof buffer -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';
int value = -1;
sscanf(buffer, "%d", &value);
printf("ADC Value: %d\n", value);
write(adc_wr,buffer,len);
}
}
else
{
perror("read ADC device:");
return 1;
}
}
}
题目3.串口数据保存
一、实验要求。
(1)PC(ubuntu)串口(COM2)定时(0.1s)通过发送字符串“COM Data:num\n”,其中num是指的是序号,每次发送序号加1,共计发送100次。
(2)ARM(实验板)串口COM2接收PC(ubuntu)发过来的数据,将数据写入到comdata.dat的文件保存。
二、实验流程图。
三、实验步骤。
Read可读文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "uart_api.h"
#define ADCWR_FILE_NAME "adcdata2.dat"
int main(void)
{
int fd;
int adc_wr;
char buff[BUFFER_SIZE];
if((fd = open_port(TARGET_COM_PORT)) < 0) {
perror("open_port");
return 1;
}
if(set_com_config(fd, 115200, 8, 'N', 1) < 0)
{
perror("set_com_config");
return 1;
}
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);
return 0;
}
Write 可写文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include "uart_api.h"
int main(void)
{
int fd;
char buff[BUFFER_SIZE];
char s[20];
int i;
if((fd = open_port(HOST_COM_PORT)) < 0)
{
perror("open_port");
return 1;
}
if(set_com_config(fd, 115200, 8, 'N', 1) < 0)
{
perror("set_com_config");
return 1;
}
for(i=0;i<100;i++)
{
memset(buff, 0, BUFFER_SIZE);
memset(s, 0, 20);
sprintf(s,"%d",i);
/*memcpy(buff, "COM Data:", BUFFER_SIZE);*/
strcpy(buff,"COM Data:");
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);
return 0;
}
编程设计题:ADC数据网络传输程序
一、实验要求。
(1) 读取ADC频率为50次每秒.
(2) 当读取了50次数据再通过TCP发送数据。
(3) PC和ARM程序需要做网络传输包的计数器。(每次传输的数据(50字节)叫一个网络包。)
(4) PC服务端需要将接收的网络包数和数据打印出来,并保存到文件名为adc_tcp文件中。
二、实验流程图。
三、实验步骤。
在pc建立tcp server端,接收arm实验板发送的数据。在arm实验板上采集adc数据,在通过tcp将adc采集的数据发送到pc。
则client 端:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#define PORT 4321
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int sockfd, sendbytes;
char buf[BUFFER_SIZE];
char s1[300];
char s2[20];
struct hostent *host;
struct sockaddr_in serv_addr;
char buffer[30];
int i;
int k=0;
if(argc < 3)
{
fprintf(stderr,"USAGE: ./client Hostname(or ip address) 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 = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero), 8);
/*调用connect函数主动发起对服务器端的连接*/
if(connect(sockfd,(struct sockaddr *)&serv_addr, sizeof(struct sockaddr))== -1)
{
perror("connect");
exit(1);
}
int adc_fd = open("/dev/adc", 0);
if (adc_fd < 0) {
perror("open ADC device:");
return 1;
}
while(1)
{
k++;
sprintf(s2,"the number%-2d",k);
strcat(buf,s2);
for(i=0;i<50;i++)
{
int len = read(adc_fd, buffer, sizeof buffer -1);
buffer[len] = '\0';
int value = -1;
sscanf(buffer, "%d", &value);
printf("ADC Value: %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 <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define PORT 4321
#define BUFFER_SIZE 1024
#define MAX_QUE_CONN_NM 5
#define ADCWR_FILE_NAME "adc_tcp.data"
int main()
{
struct sockaddr_in server_sockaddr, client_sockaddr;
int sin_size, recvbytes;
int sockfd, client_fd;
char buf[BUFFER_SIZE];
int adc_wr;
/*建立socket连接*/
if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)
{
perror("socket");
exit(1);
}
printf("Socket id = %d\n",sockfd);
/*设置sockaddr_in 结构体中相关参数*/
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(PORT);
server_sockaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_sockaddr.sin_zero), 8);
int i = 1;/* 使得重复使用本地地址与套接字进行绑定 */
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
/*绑定函数bind*/
if (bind(sockfd, (struct sockaddr *)&server_sockaddr, sizeof(struct sockaddr))== -1)
{
perror("bind");
exit(1);
}
printf("Bind success!\n");
/*调用listen函数*/
if (listen(sockfd, MAX_QUE_CONN_NM) == -1)
{
perror("listen");
exit(1);
}
printf("Listening....\n");
/*调用accept函数,等待客户端的连接*/
if ((client_fd = accept(sockfd, (struct sockaddr *)&client_sockaddr, &sin_size)) == -1)
{
perror("accept");
exit(1);
}
printf("Client Socket id = %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("Received a message: %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,recvbytes);
}
close(sockfd);
exit(0);
}
城关六小20xx年“12.4”全国法制宣传日活动工作总结为了进一步把我校法制教育工作推上一个新的台阶,结合20xx年“12.4”全…
20xx年PMC工作总结PMC:吴金华20xx年即将过去,现将PMC部门本年的工作总结一下,以便更好地制定来年的工作计划。工作总结…
一年来,在局党组的正确领导下,充分发挥岗位职能,不断改进工作方法,以“服从领导、团结同志、认真学习、扎实工作”为准则,始终坚持高标…
伴随着孩子们阳光般的笑脸,紧张而又充实的一个学期又要过去,小二班的孩子们也将要变成中二班的孩子,看着他们一点一滴的成长,我做为老师…
20xx年工作总结本年度即将结束,在这一年的工作中,我在公司及车间各级领导带领下,严格遵守各项规章制度,从各方面严格要求自己。一直…