ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:271.08KB ,
资源ID:5140473      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5140473.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(嵌入式课程设计报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

嵌入式课程设计报告.docx

1、嵌入式课程设计报告通信与信息工程学院嵌入式开发技术课程设计报告班 级:姓 名:学 号:指导教师:设计时间:2016年1月11日2016年1月14日成 绩:评 语:通信与信息工程学院二一六年 嵌入式课程设计1 设计要求1.1 基本题型(1)嵌入式开发环境配置采用vmware+linux配置开发主机系统,要求构建linux系统,配置nfs,samba;掌握minicom、samba及NFS使用,能利用其实现windows、linux开发主机与嵌入式实验系统间的通信;利用NFS服务实现主机与实验系统间文件共享;利用提供的工具构建交叉编译环境;要求:在下图时间上面一行显示小组成员姓名Armv4l-un

2、known-linux-gcc 是 否 在/opt/host/armv4l/bin/,如果不是这个路径,请使用 vi 修改/root/.bash_profile 文件中 。ATH变 量 为 PATH=$PATH:$HOME/bin:/opt/host/armv4l/bin/ , 存 盘 后 执 行 : source /root/.bash_profile(2)熟悉VI、GCC、GDB及MAKE文件使用;(3)在开发系统中编写一个程序,实现打印“通信工程13级第3小组嵌入式开发技术课程设计基础内容”功能,编写makefile文件,并通过NFS下载到实验箱中,验证交叉编译环境配置。1.2 综合题型

3、基于socket编程的简单聊天室程序设计:(1)掌握linux下socket编程方法;(2)基于C语言设计一个简单的聊天室程序,PC运行客户端程序,嵌入式系统运行服务器端程序,服务器随时侦听客户端请求并将其接入,要求至少实现2个客户端接入服务器并进行通信的功能;(3)编写Makefile文件;(4)利用NFS将程序下载到实验箱中,编译执行。(5)课程设计报告中应包含服务器端socket创建、绑定、监听、允许接入及接收数据等关键代码及其说明,客户端请求及数据发送等关键代码及说明;2 开发环境、开发工具(1)安装VWware软件 开始安装加载文件.双击该文件的图标,进入加载安装文件的界面。 设置安

4、装类型。安装文件加载完毕后进入开始安装界面。单击next按钮后,进入安装类型选择界面,选择tyical选项。 执行软件包的安装选项,依据所做的选择,把对应的软件组件安装到系统中,输入正确的序列号。 (2)配置VMware 打开桌面上VMware图形,双击打开 再打开原来的文件夹,把汉化包打开 执行软件的安装选项,依据所做的选择,确认安装。确认完后,即配置完成。 点击打开虚拟机,选择标准,下一步,执行软件的安装选项。接下是密钥,填写老师所给的密码。安装完成。(3)安装驱动 点击安装包,根据软件的安装选项,点击next按钮,即可安装完成。注:在电脑上安装好虚拟机之后配置相关参数 配置NFS:点击菜

5、单运行系统设置-点击服务器设置-NFS服务器,点击增加,在目录中选择共享目录的路径,在主机(host)中填入主机IP地址(192.168.1.12),并选择客户对共享目录的操作位读写(Read/write);在常规选项中选择允许来自高于1024的端口的连接,点击确定后即可配置好NFS。配置完成后,可以简单测试一下NFS是否配置好了: 在虚拟机上自己 mount 自己,看是否成功就可以判断NFS是否配好了。mount 192.168.1.12:/arm2410cl /host之后ls命令查看arm2410cl之下的文件目录,如果文件目录在,那么说明NFS配置成功。端口配置 用串口线连接好笔记本电

6、脑和 2410 经典版平台。 计算机,属性,设备管理器,端口高级设置下端口号COM1进入虚拟机设置,串行端口 3设计过程及结果3.1 实现交叉编译环境结果:3.2第几小组成员步骤(1)创建工作目录【rootvm-dev】# mkdir winter【rootvm-dev winter】# cd winter(2)编写winter.c文件 【rootvm-dev】# vi winter.c(3)编写Makefile文件 CC =armv4l-unknown-linux-gccEXEC=client serverOBJS=client.o server.oCFLAGS+=LDFLAGS+=-sta

7、ticall:$(EXEC)$(EXEC):$(OBJS)$(CC) $(LDFLAGS) o $ $(OBJS)clean:-rm f *.elf *.gdb *.o 其中,CC 指明编译器EXEC 表示编译后生成的执行文件名称OBJS 目标文件列表CFLAGS 编译参数LDFLAGS 连接参数all: 编译主入口clean: 清除编译结果(4)运行make编译程序【rootvm-dev】# make clean【rootvm-dev winter】# make(5)源程序 #include int main(void) printf(“ 通信工程13级第三小组嵌入式开发技术课程设计基础内容

8、“);6)结果由于电脑与开发板不匹配,结果没有办法出来3.3实现Linux系统下的简易聊天室(1)程序流程图(2)程序工作过程服务端处于监听状态,客户端发送请求,连接成功并通信。首先服务端调用socket()函数创建一个套接字,然后把协议,端口号,ip信息通过bind()进行绑定。以上操作完后服务端就开始监听客户端的请求,并设置监听的最大数目。当客户端发送链接请求时,服务端就调用accept()函数接受客户端的请求。然后对于客户端来说,也是要先调用socket()函数创建客户端的套接字,这里是用的TCP协议,所以可以不用bind()函数。接着调用connect()函数与服务端建立连接。当服务端

9、和客户端建立连接时,可以通过彼此之间的套接字描述符来进行数据传输。其中一方通过send函数把数据写入数据缓冲区,另一方通过recv()函数从缓冲区内读出数据,这样就完成了服务端与客户端之间的数据传输。当双方数据传输完成后,函数close()关闭各自的 套接字,使客户端和服务端通信中断。(3)socket编程方案设计一个简单的聊天室程序,PC运行客户端程序,嵌入式系统运行服务器端程序,服务器随时侦听客户端请求并将其接入,要求至少实现2个客户端接入服务器并进行通信的功能;Makefile文件NFS将程序下载到实验箱中,编译执行。注:程序里的函数解释(1)Socket() 作用:socket函数为客

10、户机或服务器创建一个sokcet格式:int socket(int family,int type,int protocol);参数说明: Family:表示地址族,可以去AF_UNLX和AF_INT。其中,AF_UNLX只能够用于单一的UNIX系统进程间通信;AF_INT是针对Internet的,因而可以允许在远程主机之间通信,实验中使用AF_INT。 Type:网络程序所采用的通信协议,可以取SOCK_STREAM或SOCK_DGRAM。其中,SOCK_STREAM表明使用的是TCP协议,这样提供按顺序的、可靠的、双向、面向连接的比特流;SOCKE_DGRAM表明使用的是UDP协议,这样只

11、会提供定长、不可靠、无连接的通信。(2)bind( )格式: int bind(int sockfd,struct sockaddr *addr,int addrlen); 参数说明: Sockfd:socket的文件描述符号。 Sockaddr:表示名字所用的一个数据结构,用来保存地址(包括IP地址和端口) Addrlen:设置结构大小长度。(3)listen()格式: int listen(int sockfd, int backlog); 作用:监听连接信号,和accepted函数合同。 参数说明: Sockfd:表示socket调用返回的文件描述符。 Backlog:表示接入队列允许的

12、连接数目,大多数系统允许20个,也可以子定义510个。(4)accept() 格式: Int accept (int sockfd, void *addr, int *addrlen); 作用:与listen函数合用,监听信息、接收客户端请求。 参数说明: Sockfd:表示socket的文件描述符。 Addr:表示指向局部的数据结构struct sockaddr-in的指针。 Addrlen:表示地址的长度。(5)connect()格式: int connect( int sockfd , struct sockaddr *serv_addr , int addrlen); 作用:在面向连接

13、的系统中客户及连接服务器时使用,connect必须在bind后使用。 参数作用: Sockfd:表示socket的文件描述符。 Serv-addr:表示村访目的端口和ip地址(套接字)的数据结构。(6)send() 和 recv() 格式1: Int send (int sockfd, const vod *msg,int len, int flags); 功能:发送信息。 格式2: Int recv (int sockfd , void *buf,int len, usigned int flags); 作用:用于流式socket、数据报socket内部之间的通信。(7)close( ) 和

14、 shutdown ( )格式: Close( int sockfd)或 Int shutdown(int sockfd , int f); 参数说明: f的值为下面一种: 0-不允许继续接收; 1-不允许继续发送; 2-不允许继续发送和接收。(8)有关线程的系统调用函数pthread_create()、pthread_join()实验过程说明(使用TCP/IP)(1)监听连接 利用socket、bind、listen建立连接,步骤是:1) 先用socket函数初始化socket,创建新的sockfd。Sockfd = socket(AF_INT,SOCK_STREAM,0)2) 此步骤涉及到

15、IP地址及其处理过程。参数说明: inet_addr 函数 INADDR_ANY该函数把由小数点分开的十进制IP地址转为unsinged long 类型,而在实验中所使用的为INADDR_ANY,使用利用自已的IP地址自动填充。a)利用bind函数绑定端口和IP地址。My_addr.sin_family=AF_INET; /*将地址族类型设定好 */My_addr.sin_port=htons(MYPORT; /* 将端口给其赋值*/My_addr.sin_addr.s_addr=INADDR_ANY; /*用连接地址自动填充ip*/Bind(sockfd,(stuct sockaddr*)&

16、my_addr,sizeof(stuct sockaddr);/*sockfd 是分配的socket名字,my-addr则便是分配好的端口与IP,用bind绑定*/b)利用listen监听请求(2)发送请求1)利用gethostbyname获取主机信息。2)初始化socket端口。3)利用connect函数将自己的IP地址等信息发送到主机,等待主机调用accept函数来接受请求。(3)主机接收请求,进行数据通信1)主机利用accept接收请求。2)创建子进程,显示欢迎信息;3)接收返回信息,显示连接成功,并推出连接;4)关闭客户端口socket;5)关闭服务端socket,结束子线程。(4)实

17、现步骤建立工作目录【rootvm-dev】# mkdir server【rootvm-dev server】# cd server【rootvm-dev server】# vi server.c【rootvm-dev】# mkdir client【rootvm-dev client】# cd client【rootvm-dev client】# vi client.c 编写程序源代码 程序附后 编译实现过程.在编写完TCP服务端程序server.c后,用 armv4l-unknown-linux-gcc lpthread o server.c server 生成程序server。.在编写完TC

18、P客户端程序client.c后,用armv4l-unknown-linux-gcc o client.c client 生成程序client.在嵌入式系统上运行server。在主机上打开一个窗口,运行client,输入服务器的IP地址,并检查器结果的正确性。.输入:# ./server# ./client 192.168.1.12 (192.168.1.12为本机的ip地址) .输出:#server:got connection from 192.168.1.12 .客户端发送信息服务器端接收信息。客户端通过键盘输入消息内容平回车,以发送消息给服务器端;.结果:服务端:客户端:注 :源程序 c

19、lient.c程序:#include#include#include#include#include#include#include#include#include#define EHCO_PORT 8888 /端口号#define MAX_COMMAND 5 /最大发送消息的次数int main() int sock_fd; struct sockaddr_in s_addr; char buff100; /缓冲区的大小 char tmp_buf100; int n,i; sock_fd=socket(AF_INET,SOCK_STREAM,0); /创建socket套接字,协议为IPV4协

20、议,并且为字节流套接字 if(sock_fd=-1) perror(create socket fail!); return 0; else printf(create socket %dn,sock_fd); /*设置server 地址结构*/ bzero(&s_addr,sizeof(s_addr); /初始化结构占用的内存 s_addr.sin_family=AF_INET; /IPV4协议 s_addr.sin_port=htons(EHCO_PORT); /设置监听的端口 s_addr.sin_addr.s_addr=inet_addr(192.168.0.121); /设置服务器的

21、地址 bzero(&(s_addr.sin_zero),8); if(-1=connect(sock_fd,(struct sockaddr*)&s_addr,sizeof(s_addr) perror(connect() fail!n); close(sock_fd); return 0; printf(connect to server ok !n); for(i=0;iMAX_COMMAND;i+) printf(请输入要发送信息:n); scanf(%s,buff); printf(发送信息:%sn,buff); send(sock_fd,buff,100,0); /发送数据给服务器

22、n=recv(sock_fd,tmp_buf,100,0); /从服务器接收数据 tmp_bufn=0; / 给字符串添加结束标志 printf(接收的数据: %sn,tmp_buf); /打印接收的字符串 if(0=strncmp(tmp_buf,quit,4) /判断是否退出命令 break; close(sock_fd); /关闭套接字 return 0;Server.c:#include#include #include#include#include#include#include#include#include#define EHCO_PORT 8888 /定义端口号#define

23、 MAX_CLIENT_NUM 5 /最大监听客户端数int main() int sock_fd; struct sockaddr_in s_addr; int clientfd; struct sockaddr_in clientAdd; char buff101; /设置缓冲区的大小 socklen_t len; int n; /*创建socket*/ sock_fd=socket(AF_INET,SOCK_STREAM,0);/协议设置为IPV4协议,并设置为字节流套接字 if(sock_fd=-1) perror(create socket fail!); return 0; els

24、e printf( create socket ok %dn,sock_fd); bzero(&s_addr,sizeof(s_addr); /初始化结构体占用的内存 s_addr.sin_family=AF_INET; /客户端协议为IPV4 s_addr.sin_port=htons(EHCO_PORT); /把16位值的端口号从主机字节转换为网络字节 s_addr.sin_addr.s_addr=inet_addr(192.168.0.121); /设置服务器地址 bzero(&(s_addr.sin_zero),8);/将内存块的前8个字节清零 if(bind(sock_fd,(str

25、uct sockaddr*)&s_addr,sizeof(s_addr)!=0) /将服务器地址和套接字绑定 printf(bind fail! %dn,errno); close(sock_fd); return 0; else printf( bind ok!n); if(-1=listen(sock_fd,MAX_CLIENT_NUM) /设置套接字监听 perror(listen fail!n); close(sock_fd); return 0; else printf(listen okn); len=sizeof(clientAdd); clientfd=accept(sock_

26、fd,(struct sockaddr*)&clientAdd,&len); /创建新连接对应的套接字 if(clientfd0) buffn=0; /给字符串加入结束符 printf(the data of receive: %sn,buff);/打印字符串的内容 fflush(stdout); /清除文件缓冲区 printf(put the data of send:n); scanf(%s,buff); send(clientfd,buff,n,0); /发送内容给客户端 printf(the message of send:%sn,buff); if(strncmp(buff,quit

27、,4)=0) /判断是否退出命令 break; close(clientfd); /关闭新建的连接 close(sock_fd); /关闭服务端监听的socket return 0; 4 设计总结在本学期的最后一周,我们被要求完成嵌入式的设计总结,虽然只有不到一周的时间,但是大家都感觉收获颇丰。把课堂上遗忘的、遗落的知识都捡了起来,旧的知识新的知识都掌握了很多,并且切实的体会到软件开发的困难与乐趣,认识到了自己的不足,并且慢慢摸索,不耻下问,在老师和小组成员的共同努力下,结束了这次的实践。此次课程设计老师要求我们完成两道基础题目,以及一道三选一的综合题目。前面的基础题目大家有在课堂上接触过,并

28、且通过查找资料,大家分工合作一个上午就有了很大的进展,但是在下午的完善工作中还是被卡住了,一个小的程序调试不出来,不能出现要求的结果,最后在其他组一个同学的帮助下完成了基础题目。第二天大家开始做综合题,经过商量选择了基于socket编程的简单聊天室程序设计,其实三道题目大家都没有把握能完成,对这道题比较有兴趣就敲定了。开始就是大量的查找资料,因为大家在课堂上学习的知识都太浅,并且大都停留在理论上,没有开发经验,所以大量工作都依靠互联网,不过因为我们组成员的C的能力都挺好,所以能够对代码程序理解并修改以及调试,最终还是尽我们最大努力完成了这次设计。 下面整理一下这次课程设计中个人的总结。齐秀:搜集资料,写论文 这次的实践中,我负责搜集资料以及论文编撰。在刚拿到题目的时候,因为大家都比较束手无策,所以就必须要借用别人的东西,加以修改整理变成自己的东西。我查找了很多论文和书籍,然后根据设计要求将可用的东西整理打包给其他人,包括一些代码和思想,在程序调试成功后进行了总结并参与撰写论文。在这中间,我认识到了我们的不足,需要学习的东西还有很多。许婷:编写、调试程序 在这次程序设计过程中,我主要参与了客户端代码的编写和数道是交叉编译环境的问题,还有就是串口速率不一致的问题。总

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1