当前位置:文档之家› 嵌入式实验报告

嵌入式实验报告

中国地质大学(北京) 实验报告课程名称:嵌入式系统实验名称:嵌入式 Linux Socket编程姓名:程维安学号: 1010122231班级: 10101222指导教师:曾卫华评分:实验时间:二零一六年四月实验题目:嵌入式Linux Socket编程一、实验目的通过实验熟悉Linux环境,掌握Linux串口和网络应用程序开发。

学会串口的设置,串口数据收发处理,阻塞型I/O和非阻塞型I/O,SOCKET套接字,多线程编程基础,Server和Client端程序设计。

二、实验内容和步骤1.4.4.3交叉编译工具的PATH已经生效,在任意目录下能够执行arm-linux-gcc –v;2.nfs网络文件系统的配置:○1打开nfs1175.exe;○2配置板子ip,使其和电脑ip在同一个网段(使用命令ifconfig eth0 115.25.74.176 netmask 255.255.255.0);○3挂载:在板子上运行 #mount -t nfs -o nolock 115.25.74.175:/d/share_vm /mnt/nfs ○4使用 cd /mnt/nfs 进入nfs共享目录,ls 显示共享目录下的文件;3.仔细阅读提供的代码server.c和client.c Target为服务器,Ubuntu为客户端;4.交叉编译server.c、本地编译client.c(因为用到多线程编程,在编译语句后面加上-lpthread);5.在板子上运行server可执行文件:#cd /mnt/nfs#ls -l server 看看前面的字串里面有没有“x”,如没有则表明没有可执行的权限,需要用命令加入server的执行权限:#chmod 777 server,运行server 代码 #./server;6.在ubuntu上运行client程序:#./client 115.25.74.176;7.观察服务器端和客户端的提示信息。

三、程序流程框图和源码1.流式套接字工作过程,如图1所示图1 流式套接字工作过程2.工作过程以太网○1用户从串口输入信息,将串口信息转发至以太网,在ubuntu 上编写client 端程序,将收到的网络数据打印出来;○2用户从ubuntu 中client 端输入信息,client 将位信息发送至以太网,嵌入式linux 收到以太网信息从串口输出该信息。

3.源码更改过的源码见附录。

四、 实验结果1.挂载成功后串口显示,如图2所示图2 挂载截图2.编译之后得到的目标代码,如图3所示图3 目标代码编译成功3.客户端与服务器连接,如图4,图5,图6所示图4 等待连接中图5 ubuntu中显示连接成功图6 串口中显示连接成功4.结果验证,如图7所示在串口中输入姓名(yangsen)和班级(10101021),在ubuntu中显示相应的结果;在ubuntu中输入姓名(yangsen)和班级(10101021),在串口中显示相应的结果。

图7 验证通讯结果五、实验体会本学期的所有实验都是在PC和AT91RM9200目标板上进行。

在实验中,我们先建立硬件实验平台,再建立主机软件开发环境,接着为实验进行各项配置,最后完成了各个实验中的多种功能。

值得重视的是,前期的硬件、软件准备必须完整无误地实现,这是后续实验能顺利进行的前提。

本实验中,前面已经给出了串口程序和socket编程的程序,但是需要我们来修改和完善原有的代码,在其基础上实现新的功能。

经过了一学期的学习,我发现学习嵌入式linux开发的关键在于实践。

刚开始接触嵌入式linux的时候,感觉非常麻烦。

经过一段时间的学习,我理解了开源的重要性以及发现了linux 操作系统的强大。

我已经较为熟练的掌握了linux的入门知识,完成了建立实验软件开发平台,搭建实验编译软件环境,在PC上编辑、编译一个应用程序,并且在嵌入式系统上运行和调试。

课堂的7个实验都成功地完成。

通过这学期的实验,我了解了一套完整的嵌入式系统简单的开发的全过程。

这对于以后嵌入式的学习和应用有非常大的帮助!感谢曾老师的辛勤指导!附录:1.server.c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/ioctl.h>#include <fcntl.h>#include <unistd.h>#include <termios.h>#include <stdlib.h>#include <errno.h>#include <time.h>#include <sys/time.h>#include <linux/rtc.h>#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>#include <pthread.h>#define SERVER_PORT 20000 //define the defualt connect port id #define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server #define BUFFER_SIZE 256#define WELCOME_MESSAGE "welcome to connect the server."#define COM0 0#define BLOCK_MODE 1#define NONBLK_MODE 0int fd;static struct termios g_newtio,g_oldtio;static int speed_arr[] ={B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300,B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300,};static int name_arr[] ={115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300,115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300,};int Init_COM(int Comm,int Baudrate,int Parity,int Stopbit,int Flagblock){int ret,i;char dev_buf[16];if(Comm > 3){printf("Com%d not exist\n",Comm);return -1;}memset(dev_buf,0x00,sizeof(dev_buf));sprintf(dev_buf,"/dev/ttyS%d",Comm);if(Flagblock){ret = open(dev_buf, O_RDWR | O_NOCTTY ); // 以默认阻塞方式打开;}else{ret = open(dev_buf, O_RDWR | O_NOCTTY | O_NONBLOCK); //以非阻塞方式打开;}if(ret < 0){printf("Open ttyS%d failed\n",Comm);return -1;}if( tcgetattr(ret, &g_oldtio) < 0 ){printf("Get Com Parameter Error.\n");return -1;}for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++){if(Baudrate == name_arr[i]){cfsetispeed(&g_newtio,speed_arr[i]);cfsetospeed(&g_newtio,speed_arr[i]);break;}}if(i>=sizeof(speed_arr) / sizeof(int)){printf("Unsupported Speed!\n");return -1;}switch (Parity){ // 设置奇偶校验位数case 'n':case 'N':g_newtio.c_cflag &= ~PARODD; //very important; zwhg_newtio.c_cflag &= ~PARENB; /* Clear parity enable */ break;case 'o':case 'O':g_newtio.c_cflag |= PARENB; /* Enable parity */ g_newtio.c_cflag |= PARODD; /* 设置为奇效验*/ break;case 'e':case 'E':g_newtio.c_cflag |= PARENB; /* Enable parity */g_newtio.c_cflag &= ~PARODD; /* 转换为偶效验*/ break;default:printf("Unsupported Parity\n");return -1;}/*stop bit */switch(Stopbit){case 1:g_newtio.c_cflag &= ~CSTOPB;break;case 2:g_newtio.c_cflag |= CSTOPB;break;default:printf("Unsupported Stopbit!\n");return -1;}g_newtio.c_iflag = 0; //输入无校验g_newtio.c_oflag = 0; //输出不处理g_newtio.c_lflag = 0; //RAW模式g_newtio.c_cc[VTIME] = 1; /* unit: 1/10 second. */g_newtio.c_cc[VMIN] = 1; /* minimal characters for reading */g_newtio.c_iflag &= ~INPCK; /* Disable parity checking */ g_newtio.c_cflag &= ~CRTSCTS; //NO flow controlg_newtio.c_cflag &= ~CSIZE;g_newtio.c_cflag |= CS8; //databit=8g_newtio.c_cflag |= CLOCAL; //本地连接g_newtio.c_cflag |= CREAD; //允许接收数据if( tcsetattr(ret, TCSANOW, &g_newtio) != 0 ) /*success*/{printf("Set Com Parameter Error!\n");return -1;}tcflush (ret, TCIOFLUSH); //清空输入输出队列return ret;}void RestoreComConfiguration(int fd,struct termios *ptios){if( tcsetattr(fd, TCSANOW, ptios) != 0 ) /*success*/{printf("Restore Com Parameter Error!\n");}}void pthread1(void *arg);void pthread2(void *arg);int main(int argc, char** argv){int ret;pthread_t id1,id2;fd = Init_COM(COM0,115200,'N',1,BLOCK_MODE);if(fd >= 0){write(fd,"Hello...\n",9);usleep(5000);RestoreComConfiguration(fd,&g_oldtio);}int servfd,clifd;struct sockaddr_in servaddr,cliaddr;if((servfd = socket(AF_INET,SOCK_STREAM, 0 )) < 0){printf("create socket error!\n");exit(1);}bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERVER_PORT);servaddr.sin_addr.s_addr = htons(INADDR_ANY);if(bind(servfd,(struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {printf( "bind to port %d failure!\n" ,SERVER_PORT);exit(1);}if(listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0){printf( "call listen failure!\n" );exit(1);}while(1){char buf[BUFFER_SIZE];long timestamp;socklen_t length = sizeof(cliaddr);printf("wait for connect...\n");clifd = accept(servfd,( struct sockaddr *) &cliaddr, &length);if (clifd < 0){printf( " error comes when call accept!\n " );exit(1);//break ;}strcpy(buf,WELCOME_MESSAGE);printf("from clientIP:%s,Port:%d\n" ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));timestamp = time(NULL);strcat(buf, "\ntimestamp in server:" );strcat(buf,ctime(&timestamp));send(clifd,buf,BUFFER_SIZE, 0);ret=pthread_create(&id1,NULL,(void *)pthread1, &clifd); if(ret!=0)perror("pthread cread1");ret=pthread_create(&id2,NULL,(void *)pthread2, &clifd);if(ret!=0)perror("pthread cread2");pthread_join(id1,NULL);pthread_join(id2,NULL);}close(servfd);return 0;}void pthread1(void *arg1){int length;int clifd=*(int *)arg1;char buf[BUFFER_SIZE];printf("pthread1 is wroking\n");while( 1 ){length = recv(clifd, buf,BUFFER_SIZE, 0);if(length < 0){printf("error comes when recieve data from server !");exit(1);}write(fd,"\nclient:",8);write(fd,buf,length);tcflush(fd,TCIFLUSH);write(fd,"\n",1);//close(clifd);} // exitclose(fd);}void pthread2(void *arg2){ int length;int clifd=*(int *)arg2;char buf[8];printf("pthread2 is wroking\n");while(1){length=read(fd,buf,8);send(clifd,buf,length, 0);tcflush(fd,TCIFLUSH);}close(fd);}2.client源码#include <stdio.h>#include <sys/socket.h>#include <unistd.h>#include <sys/types.h>#include <netinet/in.h>#include <stdlib.h>#include <strings.h>#include <pthread.h>#define SERVER_PORT 20000 // define the defualt connect port id#define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port #define BUFFER_SIZE 256void usage(char* name){printf( "usage: %s IpAddr\n " ,name);}void pthread1(void *arg);//void pthread2(void *arg);//int main(int argc, char** argv){ pthread_t id1,id2; //int ret;//int servfd,clifd,length = 0;char data[8];//struct sockaddr_in servaddr,cliaddr;socklen_t socklen = sizeof (servaddr);char buf[BUFFER_SIZE];if(argc < 2 ){usage(argv[0]);exit( 1 );}if((clifd = socket(AF_INET,SOCK_STREAM,0)) < 0 ) //tcp{printf( " create socket error!\n " );exit( 1 );}srand(time(NULL)); // initialize random generatorbzero( & cliaddr, sizeof (cliaddr));cliaddr.sin_family = AF_INET;cliaddr.sin_port = htons(CLIENT_PORT);cliaddr.sin_addr.s_addr = htons(INADDR_ANY);if(bind(clifd,(struct sockaddr* )&cliaddr,sizeof(cliaddr)) < 0 ){printf( "bind to port %d failure!\n " ,CLIENT_PORT);exit( 1 );}//绑定的目的是让其端口是随机的,否则端口是自增1 //一般情况下client端不用绑定bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;inet_aton(argv[1], &servaddr.sin_addr);servaddr.sin_port = htons(SERVER_PORT);if(connect(clifd,( struct sockaddr *)&servaddr, socklen) < 0){printf( "can't connect to %s!\n", argv[1]);exit(1);}length = recv(clifd, buf,BUFFER_SIZE, 0);if(length < 0){printf("error comes when recieve data from server %s!", argv[1]);exit(1);}printf("from server %s:\n%s", argv[1],buf);ret=pthread_create(&id1,NULL,(void *)pthread1, &clifd);if(ret!=0)perror("pthread cread1");ret=pthread_create(&id2,NULL,(void *)pthread2,&clifd);if(ret!=0)perror("pthread cread2");pthread_join(id1,NULL);pthread_join(id2,NULL);while(1){ // printf("please input a 8-bit data:");}close(clifd);return 0;}void pthread1(void *arg1){int clifd=*(int *)arg1;int length;char data[8];printf("pthread1 is working\n");while(1){scanf("%s",data);send(clifd,data,8, 0);}}void pthread2(void *arg2){int len;char data[8];int clifd=*(int *)arg2;printf("pthread2 is working\n");while(1){ len=recv(clifd,data,8, 0);if(len>=0){printf("server : %s\n",data);}}}。

相关主题