嵌入式开发技术课程设计报告毕业设计Word文档格式.docx

上传人:b****3 文档编号:18436112 上传时间:2022-12-16 格式:DOCX 页数:21 大小:263.74KB
下载 相关 举报
嵌入式开发技术课程设计报告毕业设计Word文档格式.docx_第1页
第1页 / 共21页
嵌入式开发技术课程设计报告毕业设计Word文档格式.docx_第2页
第2页 / 共21页
嵌入式开发技术课程设计报告毕业设计Word文档格式.docx_第3页
第3页 / 共21页
嵌入式开发技术课程设计报告毕业设计Word文档格式.docx_第4页
第4页 / 共21页
嵌入式开发技术课程设计报告毕业设计Word文档格式.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

嵌入式开发技术课程设计报告毕业设计Word文档格式.docx

《嵌入式开发技术课程设计报告毕业设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《嵌入式开发技术课程设计报告毕业设计Word文档格式.docx(21页珍藏版)》请在冰豆网上搜索。

嵌入式开发技术课程设计报告毕业设计Word文档格式.docx

(2)熟悉VI、GCC、GDB及MAKE文件使用;

(3)在开发系统中编写一个程序,实现打印“通信工程13级第3小组嵌入式开发技术课程设计基础内容”功能,编写makefile文件,并通过NFS下载到实验箱中,验证交叉编译环境配置。

1.2综合题型

基于socket编程的简单聊天室程序设计:

(1)掌握linux下socket编程方法;

(2)基于C语言设计一个简单的聊天室程序,PC运行客户端程序,嵌入式系统运行服务器端程序,服务器随时侦听客户端请求并将其接入,要求至少实现2个客户端接入服务器并进行通信的功能;

(3)编写Makefile文件;

(4)利用NFS将程序下载到实验箱中,编译执行。

(5)课程设计报告中应包含服务器端socket创建、绑定、监听、允许接入及接收数据等关键代码及其说明,客户端请求及数据发送等关键代码及说明;

2开发环境、开发工具

(1)安装VWware软件

①开始安装加载文件.双击该文件的图标,进入加载安装文件的界面。

②设置安装类型。

安装文件加载完毕后进入开始安装界面。

单击next按钮后,进入安装类型选择界面,选择tyical选项。

③执行软件包的安装选项,依据所做的选择,把对应的软件组件安装到系统中,输入正确的序列号。

(2)配置VMware

①打开桌面上VMware图形,双击打开

②再打开原来的文件夹,把汉化包打开

③执行软件的安装选项,依据所做的选择,确认安装。

确认完后,即配置完成。

④点击打开虚拟机,选择标准,下一步,执行软件的安装选项。

接下是密钥,填写老师所给的密码。

安装完成。

(3)安装驱动

点击安装包,根据软件的安装选项,点击next按钮,即可安装完成。

注:

在电脑上安装好虚拟机之后配置相关参数

①配置NFS:

点击菜单运行系统设置->

点击服务器设置->

NFS服务器,点击增加,在目录中选择共享目录的路径,在主机(host)中填入主机IP地址(192.168.1.12),并选择客户对共享目录的操作位读写(Read/write);

在常规选项中选择允许来自高于1024的端口的连接,点击确定后即可配置好NFS。

配置完成后,可以简单测试一下NFS是否配置好了:

在虚拟机上自己mount自己,看是否成功就可以判断NFS是否配好了。

mount192.168.1.12:

/arm2410cl/host

之后ls命令查看arm2410cl之下的文件目录,如果文件目录在,那么说明NFS配置成功。

②端口配置

用串口线连接好笔记本电脑和2410经典版平台。

计算机,属性,设备管理器,端口

高级设置下端口号COM1

进入虚拟机设置,串行端口

3设计过程及结果

3.1实现交叉编译环境

结果:

3.2第几小组成员步骤

(1)创建工作目录

【root@vm-dev~】#mkdirwinter

【root@vm-devwinter】#cdwinter

(2)编写winter.c文件

【root@vm-dev~】#viwinter.c

(3)编写Makefile文件

CC=armv4l-unknown-linux-gcc

EXEC=clientserver

OBJS=client.oserver.o

CFLAGS+=

LDFLAGS+=-static

all:

$(EXEC)

$(EXEC):

$(OBJS)

$(CC)$(LDFLAGS)–o$@$(OBJS)

clean:

-rm–f*.elf*.gdb*.o

其中,

CC指明编译器

EXEC表示编译后生成的执行文件名称

OBJS目标文件列表

CFLAGS编译参数

LDFLAGS连接参数

编译主入口

clean:

清除编译结果

(4)运行make编译程序

【root@vm-dev~】#makeclean

【root@vm-devwinter】#make

(5)源程序

#include<

stdio.h>

intmain(void)

{

printf(“通信工程13级第三小组嵌入式开发技术课程设计基础内容“);

}

6)结果

由于电脑与开发板不匹配,结果没有办法出来

3.3实现Linux系统下的简易聊天室

(1)程序流程图

(2)程序工作过程

服务端处于监听状态,客户端发送请求,连接成功并通信。

首先服务端调用socket()函数创建一个套接字,然后把协议,端口号,ip信息通过bind()进行绑定。

以上操作完后服务端就开始监听客户端的请求,并设置监听的最大数目。

当客户端发送链接请求时,服务端就调用accept()函数接受客户端的请求。

然后对于客户端来说,也是要先调用socket()函数创建客户端的套接字,这里是用的TCP协议,所以可以不用bind()函数。

接着调用connect()函数与服务端建立连接。

当服务端和客户端建立连接时,可以通过彼此之间的套接字描述符来进行数据传输。

其中一方通过send函数把数据写入数据缓冲区,另一方通过recv()函数从缓冲区内读出数据,这样就完成了服务端与客户端之间的数据传输。

当双方数据传输完成后,函数close()关闭各自的套接字,使客户端和服务端通信中断。

(3)socket编程方案

①设计一个简单的聊天室程序,PC运行客户端程序,嵌入式系统运行服务器端程序,服务器随时侦听客户端请求并将其接入,要求至少实现2个客户端接入服务器并进行通信的功能;

②Makefile文件

③NFS将程序下载到实验箱中,编译执行。

程序里的函数解释

(1)Socket()

作用:

socket函数为客户机或服务器创建一个sokcet

格式:

intsocket(intfamily,inttype,intprotocol);

参数说明:

Family:

表示地址族,可以去AF_UNLX和AF_INT。

其中,AF_UNLX只能够用于单一的UNIX系统进程间通信;

AF_INT是针对Internet的,因而可以允许在远程主机之间通信,实验中使用AF_INT。

Type:

网络程序所采用的通信协议,可以取SOCK_STREAM或SOCK_DGRAM。

其中,SOCK_STREAM表明使用的是TCP协议,这样提供按顺序的、可靠的、双向、面向连接的比特流;

SOCKE_DGRAM表明使用的是UDP协议,这样只会提供定长、不可靠、无连接的通信。

(2)bind()

intbind(intsockfd,structsockaddr*addr,intaddrlen);

参数说明:

Sockfd:

socket的文件描述符号。

Sockaddr:

表示名字所用的一个数据结构,用来保存地址(包括IP地址和端口)

Addrlen:

设置结构大小长度。

(3)listen()

intlisten(intsockfd,intbacklog);

监听连接信号,和accepted函数合同。

表示socket调用返回的文件描述符。

Backlog:

表示接入队列允许的连接数目,大多数系统允许20个,也可以子定义5~10个。

(4)accept()

格式:

Intaccept(intsockfd,void*addr,int*addrlen);

与listen函数合用,监听信息、接收客户端请求。

表示socket的文件描述符。

Addr:

表示指向局部的数据结构structsockaddr-in的指针。

Addrlen:

表示地址的长度。

(5)connect()

intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen);

在面向连接的系统中客户及连接服务器时使用,connect必须在bind后使用。

参数作用:

Serv-addr:

表示村访目的端口和ip地址(套接字)的数据结构。

(6)send()和recv()

格式1:

Intsend(intsockfd,constvod*msg,intlen,intflags);

功能:

发送信息。

格式2:

Intrecv(intsockfd,void*buf,intlen,usignedintflags);

用于流式socket、数据报socket内部之间的通信。

(7)close()和shutdown()

Close(intsockfd)

Intshutdown(intsockfd,intf);

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)此步骤涉及到IP地址及其处理过程。

inet_addr函数INADDR_ANY

该函数把由小数点分开的十进制IP地址转为unsingedlong类型,而在实验中所使用的为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,(stuctsockaddr*)&

my_addr,sizeof(stuctsockaddr));

/*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)实现步骤

①建立工作目录

【root@vm-dev~】#mkdirserver

【root@vm-devserver】#cdserver

【root@vm-devserver】#viserver.c

【root@vm-dev~】#mkdirclient

【root@vm-devclient】#cdclient

【root@vm-devclient】#viclient.c

②编写程序源代码

程序附后

③编译实现过程

ⅰ.在编写完TCP服务端程序server.c后,用armv4l-unknown-

linux-gcc–lpthread–oserver.cserver生成程序server。

ⅱ.在编写完TCP客户端程序client.c后,用armv4l-unknown-linux-gcc–oclient.cclient生成程序client

ⅲ.在嵌入式系统上运行server。

在主机上打开一个窗口,运行client,输入服务器的IP地址,并检查器结果的正确性。

ⅳ.输入:

#./server

#./client192.168.1.12(192.168.1.12为本机的ip地址)

ⅴ.输出:

#server:

gotconnectionfrom192.168.1.12

ⅵ.客户端发送信息服务器端接收信息。

客户端通过键盘输入消息内容平回车,以发送消息给服务器端;

ⅶ.结果:

服务端:

客户端:

注:

源程序

客户端代码

#include<

stdlib.h>

errno.h>

string.h>

sys/types.h>

//数据类型定义

netinet/in.h>

//定义数据结构

sys/socket.h>

sys/wait.h>

#include<

unistd.h>

arpa/inet.h>

//AF_INET相关操作函数

#defineSERVER_PORT8887/*客户机连接远程主机的端口*/

#defineMAXDATASIZE100/*每次可以接收的最大字节*/

#defineSERVER_IP"

192.168.1.13"

/*服务器的IP地址*/

//#defineWELCOME“******WELCOMETOTHECHATROOM*****”

intmain()

{

intsockfd,numbytes;

charbuf[MAXDATASIZE];

structsockaddr_inserver_addr;

printf("

\n======================clientinitialization======================\n"

);

if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)

{

perror("

socket"

exit

(1);

}

//结构体的定义与初始化

server_addr.sin_family=AF_INET;

//使用IPv4的协议

server_addr.sin_port=htons(SERVER_PORT);

//端口号,htons()把16位值从主机字节序转换成网络字节序

server_addr.sin_addr.s_addr=inet_addr(SERVER_IP);

ip地址

bzero(&

(server_addr.sin_zero),sizeof(server_addr.sin_zero));

//将第一个参数所指的内存区域前sizeof(第二个参数)个字符清零

if(connect(sockfd,(structsockaddr*)&

server_addr,sizeof(structsockaddr_in))==-1)//)&

server_addr服务器端地址

connect"

}

//循环输入文字

while

(1)

bzero(buf,MAXDATASIZE);

\nBeginreceive...\n"

if((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1)

//buf接收数据缓冲区,numbytes接收的字节数

recv"

elseif(numbytes>

0)

{

intlen,bytes_sent;

buf[numbytes]='

\0'

;

Received:

%s\n"

buf);

Send:

"

charmsg[MAXDATASIZE];

scanf("

%s"

msg);

len=strlen(msg);

//发送至服务器

if(send(sockfd,msg,len,0)==-1)

//msg要发送的数据指针

senderror"

else

//numbytes=0,表示socket已断开

soketend!

\n"

close(sockfd);

return0;

服务器端代码

//包含套接字函数库

//包含AF_INET相关结构

//包含AF_INET相关操作的函数

fcntl.h>

sys/shm.h>

#defineMYPORT8887

#defineMYKEY12345

#defineSIZE10240

charbuf[100];

memset(buf,0,100);

intserver_sockfd,client_sockfd;

socklen_tserver_len,client_len;

//?

structsockaddr_inserver_sockaddr,client_sockaddr;

\n======================serverinitialization======================\n"

server_sockfd=socket(AF_INET,SOCK_STREAM,0);

//定义套接字类型

server_sockaddr.sin_family=AF_INET;

server_sockaddr.sin_port=htons(MYPORT);

server_sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);

server_len=sizeof(server_sockaddr);

//允许重复使用本地地址和套接字绑定

inton=1;

setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&

on,sizeof(on));

//绑定端口

if(bind(server_sockfd,(structsockaddr*)&

server_sockaddr,server_len)==-1)

bind"

}

//监听端口

if(listen(server_sockfd,5)==-1)

listen"

client_len=sizeof(client_sockaddr);

pid_tppid,pid;

if((client_sockfd=accept(server_sockfd,(structsockaddr*)&

client_sockaddr,&

client_len))==-1)

accepterror"

send(client_sockfd,"

YouhaveconnectServer!

strlen("

),0);

\n%s:

%dLoginserver!

\n\n"

inet_ntoa(client_sockaddr.sin_addr),ntohs(client_sockaddr.sin_port));

//,inet_ntoa将32位二进制形式的IP地址转换为数字点形式的IP地址

ppid=fork();

//创建子进程

if(ppid==-1)

fork1failed:

elseif(ppid==0)//子进程用于接收客户端信息并发送

intrecvbytes;

pid=fork();

//再次创建子进程

if(pid==-1)

fork2failed:

elseif(pid==0)//子进程的子进程用于接收消息

bzero(buf,100);

if((recvbytes=recv(client_sockfd,buf,100,0))==-1)

readclient_sockfdfailed:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 企业管理

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

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