LINUX实验报告

                                                                                                                            

本科生实验报告

实验课程        多传感器信息融合技术                      

学院名称        信息科学与技术学院               

专业名称        物联网工程                

学生姓名        何月明                         

学生学号        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);

}