本科生实验报告实验课程嵌入式系统学院名称信息科学与技术学院专业名称软件工程学生姓名学生学号指导教师实验地点6A609实验成绩二〇年月二〇年月实验一键盘控制程序1.实验题目及要求1.1实验题及目的实验题目:本次实验题目为基于linux的键盘控制实验实验目的:学会编辑软件相关操作。熟悉交叉编译器的使用方法。了解linux文件的使用(键盘的操作)1.2实验要求要求:当按一个按键(0~9)时,把按键输入显示在数码管中最后一位(数码管其他位不显示)。2.实验流程图流程图如下:开始预定义设备文件名#defineDEVICE_NAME/dev/keypad#defineDEVICE_NAME2/dev/serial_led定义键盘设备描述符intfd定义接收键盘输入的数组unsignedcharbuf[2]定义无输入键盘返回值charpre_scancode=0xff定义数码管设备文件描述符intfd2定义数码管输入0-9数据数组intbuf2[10]定义输入文件临时存储数组intdata[10]打开键盘设备fd=open(DEVICE_NAME,O_RDWR);if(-1==fd)输出错误信息printf(err);读取键盘传输来的数据read(fd,buf,1);打开失败打开成功判断是否有输入if(buf[0]!=pre_scancode)初始化当前判定键盘值并等待5ms判断输入是回车否if(buf[0]!=0xff)打开数码管设备文件fd2=open(DEVICE_NAME2,O_RDWR);判断打开是否成功if(fd2==-1)得到输入数据并先写入3个0在写入输入数据使得仅在数码管最后一位显示数据data[0]=0x00;write(fd2,data,1);write(fd2,data,1);write(fd2,data,1);data[0]=buf2[buf[0]];write(fd2,data,1);关闭数码管设备文件ret=close(fd2);输出错误信息无输入有输入打开成功打开失败是回车不是回车结束使用ctrl+C3.实验步骤及结果1)在arm开发板上挂载虚拟机的文件夹2)建立nfs目录“keyboard”文件夹,创建并编辑keytest.c.输入源代码。3)在ubuntu上交叉编译keytest.c程序。arm-linux-gcckeytest.c-okeytest4)加载键盘和数码管驱动insmodpxa270_keyboard_drv.o5)运行程序并敲击按键观察结果./keytest实验结果如下:4.源代码#includestdio.h#includestring.h#includestdlib.h#includefcntl.h#includeunistd.h#includemath.h#defineDEVICE_NAME/dev/keypad#defineDEVICE_NAME2/dev/serial_ledintmain(void){intfd;intret;unsignedcharbuf[2];doublex;charpre_scancode=0xff;intret2;intfd2;inti,count;intbuf2[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0123456789intdata[10];fd=open(DEVICE_NAME,O_RDWR);if(fd==-1){printf(err);}else{buf[0]=0x22;while(1){read(fd,buf,1);if(buf[0]!=pre_scancode){if(buf[0]!=0xff){printf(key=%x\n,buf[0]);fd2=open(DEVICE_NAME2,O_RDWR);printf(fd=%d\n,fd2);if(fd2==-1){}else{data[0]=0x00;write(fd2,data,1);write(fd2,data,1);write(fd2,data,1);data[0]=buf2[buf[0]];write(fd2,data,1);}ret=close(fd2);}pre_scancode=buf[0];usleep(5000);}}ret=close(fd);printf(et=%d\n,ret);printf(closekeypad_drivertest\n);}}实验三网络数据传输实验1.实验题目及要求1.1实验题及目的实验题目:嵌入式linux网络编程实验目的:熟悉linux的TCP/IP操作函数;掌握linux的编程方法;1.2实验要求要求:实现上位机(PC,ubuntu)串口2与实验板(ARM,嵌入式linux)的TCP数据通信。该程序包括服务器端程序(sever)和客户端程序(client)。Ubuntu上运行服务器端程序(sever),ARM实验板上运行客户端程序(client)。传输模拟转数字信号并存入文件。编写makefile来编译sever和client。2.实验流程图(对于模拟转数字信号只需把输出的val0和val1传给buff即可)流程图如下:client端:开始预定义端口号和传输数据大小#definePORT4321#defineBUFFER_SIZE200定义sock设备fd传送的字节数传送数据缓存区服务器信息结构体等intsockfd,sendbytes;charbuf[BUFFER_SIZE];structhostent*host;structsockaddr_inserv_addr;判断参数个数是否小于2if(argc2)输出错误信息并结束fprintf(stderr,USAGE:./clientHostname(oripaddress)Text\n);exit(1);小于2大于2判断是否能够访问到目标服务器if((host=gethostbyname(argv[1]))==NULL)输出错误信息并结束:perror(socket);exit(1);值为NULL设置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);值不为NULL连接成功连接失败打开模拟数字转换配套硬件设备fd=open(DEVICE_NAME,O_RDWR);ioctl(fd);memset(buf,0,BUFFER_SIZE);i=0i50i50i++读取数字信号并对buff赋值(4个char表示一个int)val0=ioctl(fd,UCB_ADC_INP_AD0,0);memcpy(buf+i*sizeof(int),&val0,sizeof(int));i=50发送消息给服务器if((sendbytes=send(sockfd,buf,BUFFER_SIZE,0))==-1)关闭socketfdclose(sockfd);ret=close(fd);结束输出错误信息并结束:perror(send);exit(1);发送失败发送成功server端:开始预定义端口号最大连接队列型号量数据缓存区大小#definePORT4321#defineMAX_QUE_CONN_NM5#defineMAX_SOCK_FDFD_SETSIZE#defineBUFFER_SIZE200定义sockaddr_in结构体和一些临时变量设备fd以及数据缓存区structsockaddr_inserver_sockaddr,client_sockaddr;intsin_size,count;fd_setinset,tmp_inset;intsockfd,client_fd,fd;charbuf[BUFFER_SIZE];判断是否成功打开socketif((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)显示错误信息并退出perror(socket);exit(1);打开失败设置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);允许重复使用本地地址与套接字进行绑定代码........开始监听打开成功调用select函数if(!(select(MAX_SOCK_FD,&tmp_inset,NULL,NULL,NULL)0))打印错误perror(select);fd=0成功fdMAX_SOCK_FD失败如果fd在给定的fd集合中if(FD_ISSET(fd,&tmp_inset)0)fd++判断该fd是否为链接请求的fdif(fd==sockfd)fd=MAX_SOCK_FDfdMAX_SOCK_FD处理连接请求添加进入fd列表FD_SET(client_fd,&inset);是连接请求判断发送的数据量大小if((count=recv(client_fd,buf,BUFFER_SIZE,0))0)不是连接请求断开与目标的连接close(fd);FD_CLR(fd,&inset);数据量大于0数据量=0显示接收到的信息并打开文件printf(Receivedamessagefrom%d:%s\n,client_fd,buf);f=open(test.txt,O_CREAT|O_WRONLY);sprintf(ctemp,%d,temp);printf(ctemp);write(f,ctemp,4);lseek(f,0L,SEEK_END);write(f,\n,strlen(\n));}close(f);intj=0j50写入文件memcpy(&temp,buf+sizeof(int)*j,sizeof(int));lseek(f,0L,SEEK_END);sprintf(ctemp,%d,temp);write(f,ctemp,4);lseek(f,0L,SEEK_END);write(f,\n,strlen(\n));j++j50关闭文件close(f);j=503.实验步骤及结果1)在arm开发板上挂载虚拟机的文件夹记下arm板的ip2)建立nfs目录“test“文件夹,创建并编辑server.c和client.c输入源代码。3)编写Makefile文件编译使server在本机下运行client在arm板运行。4)makeall5)加载驱动insmodpxa_ad_drv.o6)分别在本机和arm运行server和client并改变模拟信号数据在server端观察结果./client192.168.0.100实验结果如下:4.源代码及Makefile文件server.c:#includesys/types.h#includesys/socket.h#includestdio.h#includestdlib.h#includestring.h#includesys/time.h#includefcntl.h#includesys/ioctl.h#includeunistd.h#inclu