当前位置:
文档之家› 嵌入式Linux系统串口和以太网编程
嵌入式Linux系统串口和以太网编程
#define #define
SERVER_PORT 20000
//
define the defualt connect port id // define the defualt client port as a
CLIENT_PORT ((20001+rand())%65536)
random port #define #define BUFFER_SIZE 256 LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server
1 / 15
开始监听已经绑定的端口,创建监听队列accept(),返回一个新的 socket,阻塞 等待客户端 client 的连接 send(),recv()发送和接收数据close(), 关闭服务器。 客户端: 创建一个 socket connect() ,建立与服务器的连接 send(),recv() 发送和接收数据close(),关闭客户端。 2、 掌握 linux 系统中线程的使用方法: 在 linux 中创建新的线程可以使用两种方式:pthread_create()函数和 fork()函数。 pthread_create()使用: int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg); 参数:thread 输出线程 id,attr 线程属性, 默认 NULL,start_routine 线程执行函 数,arg 线程执行参数 。函数成功时返回 0, 否则返回错误码。 fork()函数的使用: 一个现有进程可以调用 fork 函数创建一个新进程。由 fork 创建的新进程被称为子 进程(child process) 。fork 函数被调用一次但返回两次。两次返回的唯一区别是 子进程中返回 0 值而父进程中返回子进程 ID。这样,对于程序,只要判断 fork 函 数的返回值,就知道自己是处于父进程还是子进程中。
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 {
close(clifd); return 0; }
服务器端代码: #include #include #include #include #include #include #include #include #include #include <stdio.h> <sys/types.h> <sys/socket.h> <unistd.h> <netinet/in.h> <arpa/inet.h> <stdlib.h> <time.h> <string.h> <strings.h>
sockaddr *)&servaddr, socklen) < 0)
printf( "can't connect to %s!\n", argv[1]); exit(1); }
runflag=1; pth=pthread_create(&tidp,NULL,Thread1,NULL); if(pth!=0) {printf("error!");return -1;}
#define WELCOME_MESSAGE "welcome to connect the server."
void usage(char* name) { printf( "usage: %s IpAddr\n " ,name); } struct int sockaddr_in servaddr,cliaddr;
五、实验结果
客户端运行 client 与服务器端运行 server 建立通信
2 / 15
服务器端:
客户端:
按下$中断通信 服务器端:
客户端:
六、心得体会
在这一次的实验中,我们先建立硬件实验平台,又建立主机软件开发环境,接着为实验 进行各项配置,最后完成了各个实验中的多种功能。很重要的一点,前期的硬件、软件准备
servfd,clifd,length = 0;
4 / 15
struct
sockaddr_in servaddr,cliaddr;
socklen_t socklen = sizeof (servaddr); char buf[BUFFER_SIZE],buf2[BUFFER_SIZE]; pthread_t tidp,tidp2; int pth;int runflag=0;
中国地质大学(北京)
实 验 报 告
课程名称:嵌入式系统 实验名称:嵌入式 Linux 系统串口和以太网编程 姓 学 班 名: 号: 级:
指导教师:曾 卫 华 评 分:
实验时间: 2013.5
实验题目:嵌入式Linux系统串口和以太网编程
一、实验目的
1、 熟悉 Linux 环境 2、 掌握嵌入式开发的基本流程,培养解决问题的能力 3、 掌握 Linux 串口及以太网 socket 的应用程序开发 4、 自学嵌入式 Linux 中多线程编程基础
pth=pthread_create(&tidp2,NULL,Thread2,NULL); if(pth!=0) {printf("error!");return -1;} pthread_detach(tidp); pthread_detach(tidp2);
6 / 15
whil知识
1、 掌握 linux 串口和以太网 socket 应用程序开发方法: 串口配置:打开串口,获得串口的使用句柄 fd 获取原先配置参数并进行保 存设置波特率 设置奇偶校验位 设置 设置停止位 设置最少接受 字符和等待时间设置数据位、 无流控等相关参数激活最新配置结束时还 原串口原先配置。 网络 socket 编程: 服务器端: 创建一个 socketbind(), 给 socket 注册服务器端口地址listen(),
四、实现过程
1、 4.4.3 交叉编译工具的 PATH 已经生效,在任意目录下能够执行 arm-linux-gcc –v 2、 在开发板上进行内核以及根文件系统的移植,构建嵌入式 linux 系统 3、 nfs 网络文件系统的配置: 1.打开 nfs1175.exe 2.配置板子 ip,使其和电脑 ip 在同一个网段 3 .挂载:在板子上运行 #mount -t nfs -o nolock 202.204.100.66:/f/aaa/LINUX/Share /mnt/nfs 4.使用 cd /mnt/nfs/0522 进入 nfs 共享目录下,ls 显示共享目录下的文件; 4、 仔细阅读提供的代码 server.c 和 client.c Target 为服务器,Ubuntu 为客户端。修改和 完善代码,在原代码的基础上实现新的功能 5、 交叉编译 server.c(# arm-linux-gcc -lpthread -o server server.c) 6、 本地编译 client.c(# gcc -o client client.c -lpthread) 7、 在板子上运行 server 可执行文件: #chmod 777 server,运行 server: #./server 8、 在 ubuntu 上运行 client 程序:# ./client 202.204.100.67;
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 端不用绑定
附录(程序源码)
客户端代码: #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 <string.h>
二、实验内容
本次实验通过编写服务器(开发板)与客户端(虚拟机 ubuntu)上的应用程序,来实 现服务器与客户端之间信息的透明转发, 构成类似于聊天的功能。 该功能实现包括两个 方面。 其一:服务器通过串口从终端(电脑键盘)上读取(read)数据,再通过网络(clifd) 把读取到的数据发送到客户端,客户端在接收到数据后在显示器上打印出来; 其二: 客户端把数据通过网络发送到主机上, 主机接收到数据后通过串口写到电脑终端 软件(SecureCRT)进行显示。实验流程图如下:
5 / 15
} srand(time(NULL)); // initialize random generator
bzero( & cliaddr, sizeof (cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons(CLIENT_PORT);