江苏大学嵌入式课程设计报告

     嵌入式系统课程设计报告

学院名称:       电气学院            

专业班级:       电科1102            

学生姓名:        胡志文             

学    号:       3110504039         

Linux下的SOCKET通信实验

摘要1)掌握Linux SOCEKT编程的常用函数:

---编写服务器程序server

---编写客户端程序client

---编写聊天程序的服务器程序listener

---编写聊天程序的客户端程序talker

(2)下载调试上述程序

一.1.socket概念:所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。以J2SDK-1.3为例,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

  2.socket基本应用:Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。在应用开发中就像使用文件 句柄一样,可以对 Socket句柄进行读、写操作。套接字是网络的基本构件。它是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连进程。套接字存在通信区域(通信区域又称地址簇)中。套接字只与同一区域中的套接字交换数据(跨区域时,需要执行某和转换进程才能实现)。WINDOWS 中的套接字只支持一个域——网际域。套接字具有类型。我们将 Socket翻译为套接字.

  3.socket发展现状:七十年代中,美国国防部高研署(DARPA)将TCP/IP的软件提供给加利福尼亚大学Berkeley分校后,TCP/IP很快被集成到Unix中,同时出现了许多成熟的TCP/IP应用程序接口(API)。这个API称为Socket接口。今天,SOCKET接口是TCP/IP网络最为 通用的API,也是在INTERNET上进行应用开发最为通用的API。

二.1.程序原理:

  2.程序流程图:

客户端流程图:                    服务端流程图:

3、程序代码及相关代码注释:

(1)客户端程序:

下面是一个简单的TCP客户端程序client.c,在这个程序中你必须提供一个命令行参数:服务端所在机器主机名。当然,服务端还必须在客户端运行以前就已经正常运行。

#include <stdio.h>   

#include <stdlib.h> 

#include <unistd.h> 

#include <errno.h> 

#include <string.h> 

#include <netdb.h> 

#include <sys/types.h> 

#include <netinet/in.h> 

#include <sys/socket.h>

#define PORT 3490                                 // 连接时使用的端口号

#define MAXDATASIZE 100                         // 一次所能接收的最长字符数  

int main(int argc, char *argv[]) { 

int sockfd, numbytes;   

char buf[MAXDATASIZE]; 

struct hostent *he; 

struct sockaddr_in their_addr;                     // 客户端信息  

if (argc != 2) { 

fprintf(stderr,"usage: client hostname\n"); 

exit(1); 

}  

if ((he=gethostbyname(argv[1]))== NULL) {        // 域名解析   

perror("gethostbyname"); 

exit(1); 

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

                                                                             //创建套接字,返回文件描述符

perror("socket"); 

exit(1); 

their_addr.sin_family = AF_INET;                // 采用ipv4   

their_addr.sin_port = htons(PORT);               // 将主机号转换成网络号  

their_addr.sin_addr = *((struct in_addr *)he->h_addr); 

memset(&(their_addr.sin_zero), '\0', 8);            // 制作成字符串  

if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {

                                                     //请求连接

perror("connect"); 

exit(1); 

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

                                                                             //接收数据 

perror("recv"); 

exit(1); 

buf[numbytes] = '\0'; 

printf("Received: %s",buf); 

close(sockfd);                                 //关闭套接字

return 0; 

(2)服务端程序:

TCP 服务器端通过如下步骤建立: 

a) 通过函数 socket()建立一个套接口。 

b) 通过函数 bind()绑定一个地址(IP 地址和端口地址)。这一步确定了服务器的位置,使客户端知道如何访问。 

c) 通过函数 listen()监听(listen)端口的新的连接请求。 

d) 通过函数 accept()接受新的连接。 

下面是一个简单的TCP服务器程序server.c,该程序对于每一个连接的客户端直接发送 Hello, world!\n”字符串:

#include <stdio.h> 

#include <stdlib.h> 

#include <unistd.h> 

#include <errno.h>

#include <string.h> 

#include <sys/types.h> 

#include <sys/socket.h> 

#include <netinet/in.h> 

#include <arpa/inet.h> 

#include <sys/wait.h> 

#include <signal.h> 

#define MYPORT 3490                              //设置端口号

#define BACKLOG 10              //可以同时连接的最大客户端数

void sigchld_handler(int s) { 

while(wait(NULL) > 0); 

}                                                                           //信号处理函数,防止出现僵尸进程

int main(void) { 

int sockfd, new_fd;                                         //sockfd是监听描述符,new_fd是连接描述符

struct sockaddr_in my_addr;                  //服务端信息    

struct sockaddr_in their_addr;                  //客户端信息

int sin_size; 

struct sigaction sa; 

int yes=1; 

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

                                                               //创建服务端文件描述符

perror("socket"); 

exit(1);

if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int))==-1) {

                                                               //

perror("setsockopt"); 

exit(1); 

my_addr.sin_family = AF_INET;         //ipv4

my_addr.sin_port = htons(MYPORT);     //将主机号转换成网络号

my_addr.sin_addr.s_addr = INADDR_ANY;   //可以和任何主机通信

memset(&(my_addr.sin_zero), '\0', 8);

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1){

                                                //绑定套接字

perror("bind"); 

exit(1); 

if (listen(sockfd, BACKLOG) == -1) {   

//监听是否有客户端请求连接

perror("listen"); 

exit(1); 

sa.sa_handler = sigchld_handler;                //设置接收到信号时所调用的函数

sigemptyset(&sa.sa_mask);                //设置处理该信号时暂时将指定信号搁置

sa.sa_flags = SA_RESTART;                     //设置信号处理的相关操作

if (sigaction(SIGCHLD, &sa, NULL) == -1) {

                                                               //判断是否有子进程退出

perror("sigaction"); 

exit(1); 

while(1) {   

sin_size = sizeof(struct sockaddr_in); 

if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size))==-1){

    //处理客户端的连接请求  

perror("accept");

continue; 

printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr));

//打印出连接的客户端IP地址

if (!fork()) {                             //创建的子进程,用来发送Hello,world!

close(sockfd);                             //子进程不需要监听

if (send(new_fd, "Hello, world!\n", 14, 0)== -1) { 

//发送信息

perror("send"); 

close(new_fd);                    //关闭发送信息的描述符

exit(0); 

close(new_fd);                           // 父进程不需要发送信息

return 0; 

4、调试结果:

<1>.正

(1).输出“Hello, world!”

(2).输入过程:

(3).结果截图:

<2>.反.

(1). 输出“Hello, world!”

(2).输入过程:

(3).结果截图:

5.参考文献

1) (美)Rober Love  《Linux Kernel Development》(Third Edition)     机械工业出版社 20##年6月

2) 杨进才,沈显军,刘蓉.C++语言程序.清华大学出版社,2006,9 3) 龚沛曾,杨志强.C/C++程序设计教程.北京:高等教育出版社,2005

 

第二篇:江苏大学电力电子课程设计报告

电力电子技术
课程设计

  班级:电气0904

  学号:3090501086

  姓名:李娜

 20##年6月15号


一、.设计要求

o  根据给定指标,设计BOOST电路参数

o  根据给定指标,设计CUK电路参数

o  利用Simulink软件,对上述电路进行验证

o  在实验平台上,进行实验,观察重要参数

o  撰写课程设计报告

二、BOOST电路设计

     BOOST 电路又称为升压型电路, 是一种直流- 直流变换电路, 其电路结构如图1 所示。此电路在开关电源领域内占有非常重要的地位, 长期以来广泛的应用于各种电源设备的设计中。

 【BOOST电路工作原理】在电路中IGBT导通时,电流由E经升压电感L和V形成回路,电感L储能;当IGBT关断时,电感产生的反电动势和直流电源电压方向相同互相叠加,从而在负载侧得到高于电源的电压,二极管的作用是阻断IGBT导通是,电容的放电回路。调节开关器件V的通断周期,可以调整负载侧输出电流和电压的大小。负载侧输出电压的平均值为:

                    

                                        (3-1)            

式(3-1)中T为开关周期, 为导通时间, 为关断时间。

  

图1 BOO ST 电路的结构 

【matlab仿真分析】

  图二 BOO ST 电路的仿真模型

在模型中给定参数:

    INPUT VOLTAGE:80V
OUTPUT VOLTAGE:91-128V
DUTY:13.6-41%
LOAD RESISTANT:1K

     SWITCH PERIOD: 2.2 ×10-5s

 设计要求

o   根据公式计算两个电路中的电感、电容值

o  计算电路中功率器件的额定电流、电压,进行选型

o  通过仿真实验,验证电路参数是否正确

o  观察电路中主要波形,并记录(仿真、实验)

BOOST电路计算公式

 

根据公式计算以及仿真电路调整得:电感L=0.045H,电容C=15*10-8F

【实验数据】

由于当取得最大占空比时,输出电压为135.59V>128V超出输出电压范围,故不能取最大占空比,要根据最大输出电压整定最大占空比。由公式3-1可得,当U0=128V时,占空比α=37.5% 。

      输出电压U0=127.9V时,二极管的有效值为IvT=0.3128A,承受的最大反向电压为UVT=132V;IGBT开关元件的有效电流为IV=0.4902A,承受最大电压为UV=139V。

【器件选择】二极管的额定参数(按两倍余量整定)

           IN=2IVT/1.57=2*0.3128/1.57=0.3984A,    UN=2UVT=2*132=264V

IGBT开关元件的额定参数(按两倍余量整定)

           IN=2IV/1.57=2*0.4902/1.57=0.6245A,     UN=2UV=2*139=278V

当取得最小占空比和最大输出电压时的仿真波形图:

                             a图

b图

图三   最小占空比时的波形图

a图

             b图

图四   最大电压时的波形图

升压斩波电路之所以能使输出电压高于电源电压,关键有两个原因:一是L储能之后具有使电压泵升的作用,二是电容C可将输出电压保持住。在以上分析中,认为开关处于通态期间因电容C的作用使得输出电压不变,但实际上C值不可能为无穷大,在此阶段其向负载放电,必然会有所下降,故实际输出电压会略低于理论所得结果,不过,在电容C值足够大时,误差很小,基本可以忽略。

三、CUK电路设计

 

                       CUK斩波电路及其等效电路图

Cuk斩波电路

    ◆工作原理

        ?V导通时,E—L1—V回路和R—L2—C—V回路分别流过电流。

        ?V关断时,E—L1—C—VD回路和R—L2—VD回路分别流过电流。

        ?输出电压的极性与电源电压极性相反。 

Cuk变换器中有两个电感,这两个电感之间可以没有耦合,也可以由耦合,耦合电感可进一步减少电流脉动量。

基本的数量关系

        ?C的电流在一周期内的平均值应为零,即

                                                                         (5-45)

 ?由(5-45)得

   

                                                                

                                                                      (5-46)

从而可得

                    

                                                                 (5-47)

由L1和L2的电压平均值为零,可得出输出电压Uo与电源电压E的关系


                                                                      (5-48)

【matlab仿真分析】

CUK电路的仿真模型

在模拟电路中给定参数

    INPUT VOLTAGE:80V
    OUTPUT VOLTAGE:50-105V
    DUTY:27-58.9%
    LOAD RESISTANT:1K

    SWITCH PERIOD: 2.2 ×10-5s

CUK电路计算公式


根据公式计算以及仿真电路调整得:电感L1=L2=0.11H,电容C1=11*10-8F,C2=4*10-9F

【实验数据】

  由于当占空比为27%时,输出电压为29.59V<50V, 当占空比为58.9%时,输出电压为114V>105V,不满足电压要求,故根据电压来整定占空比。

    输出电压U0=106.3V时,二极管的有效值为IvT=0.4891A,承受的最大反向电压为UVT=200V;IGBT开关元件的有效电流为IV=0.6804A,承受最大电压为UV=201V。

【器件选择】二极管的额定参数(按两倍余量整定)

           IN=2IVT/1.57=2*0.4891/1.57=0.6230A,    UN=2UVT=2*200=400V

IGBT开关元件的额定参数(按两倍余量整定)

           IN=2IV/1.57=2*0.6804/1.57=0.8667A,     UN=2UV=2*201=402V

当取得最大最小输出电压时的波形图:

最小输出电压时的波形图

最大输出电压时的波形图

     与升降压斩波电路相比,Cuk斩波电路有一个明显的优点,其输入电源电流和输出负载电流都是连续的,且脉动很小,有利于对输入、输出进行滤波。

四、实验对比

1、测量输入电压和输出电压范围

2、用示波器交流档观测输出电压纹波

   峰-峰值为5.08V

3、用示波器测量相应电压、MOSFET管、功率二极管、PWM波形(用打印机打印出波形)

  波形图分别见附录1、附录2

4、通过PWM波计算占空比和开关频率 

5、通过波形,BOOST电路画出流过功率二极管的电流波形,CUK画出输出电感波形

    波形详见附录3

6、比较实际测得的波形与仿真波形的差别,分析原因。

  ①实际输出电压会略低于理论所得结果,是因为在以上分析中,认为开关处于通态期间因电容C的作用使得输出电压U不变,但实际上C值不可能为无穷大,在此阶段其向负载放电,U必然会有所下降,故实际输出电压会略低于理论所得结果,不过,在电容C值足够大时,误差很小,基本可以忽略。

   ②实际波形中存在各种干扰,波形不是太稳定,而且会出现毛刺,没有模拟图波形清晰稳定。

  ③模拟电路中的二极管两端并接一个电阻,而且阻值不够大,使流过二极管的电流有正负,与实际波形有出入。

五、实验总结

 在做课程设计的这段时间里,我对升压斩波(BOOST)电路和CUK电路有了进一步的理解,并且学习和使用了matlab仿真软件,模拟出实验波形。

DC-DC的功能是将直流电变为另一固定电压或可调电压的直流电,包括直接直流变流电路和间接直流变电电路。直接直流变电电路又称为斩波电路。BOOST 电路和CUK电路, 是直流- 直流变换电路, 它们在开关电源领域内占有非常重要的地位, 长期以来广泛的应用于各种电源设备的设计中。对它们工作过程的理解掌握关系到对整个开关电源领域各种电路工作过程的理解, 而从书本上学到的知识是有限的,采用matlab仿真分析方法, 可直观、详细的描述这些电路并对其中各种现象进行细致深入的分析, 便于我们真正掌握这些电路的工作特性。

经过这段实习,我认识到自己还有很多东西需要进一步加强学习,而且要把理论联系实践来学习,用实践来解释理论知识。

相关推荐