嵌入式系统实验报告

《嵌 入 式 系 统》

实验报告

姓名:    

学号:   班级:       

湖南工业大学

电气与信息工程学院

20##年5月

实验一  ARM汇编指令实验1

一、实验目的

1.初步学会使用ADS1.2开发环境及ARM软件模拟器;

2.通过实验掌握简单ARM汇编指令的使用方法。

二.实验设备

1.硬件:PC机;

2.软件:ADS1.2。Windows98/2000/NT/XP。

三.实验内容

1.熟悉开发环境的使用,并使用LDR/STR和MOV等指令访问寄存器或存储单元。

2.使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。

四.实验原理

ARM处理器共有37个寄存器:31个通用寄存器,包括程序计数器(PC),这些寄存器都是32位;6个状态寄存器,这些寄存器也是32位,但只使用了其中的12位。

1.ARM通用寄存器

通用寄存器(R0~R15)可分为3类,即不分组寄存器R0~R7.分组寄存器R8~R14.程序计数器R15。

2. 存储器格式

ARM体系结构将存储器看作是从零地址开始的字节的线性组合。字节0~3存放第一个字,字节4~7存放第2个字,以此类推。

    ARM体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。

3. GNU基础知识

Embest IDE集成了GNU汇编器as、编译器gcc和链接器ld。因此,编写程序要符合CNU的语法和规则。关于as.gcc和ld的具体使用,请参照Embest IDE所带的电子文档ProgRef.chm。

实验程序

1. 实验A程序


area Int,code,readonly

 entry

x equ      45;                                        

y equ      64;                                 

stack_top equ     0x1000;              

 global  start

start                             

        MOV    sp, #stack_top

        MOV   r0, #x             

        STR     r0, [sp]              

        MOV   r0, #y             

        LDR    r1, [sp]              

            ADD       r0, r0, r1

            STR     r0, [sp]

stop

        B     stop

 end


2. 实验B程序


area Int|,code,readonly

 entry

x equ       45;                                   

y equ       64;                                   

z equ     87;                            

stack_top equ   0x1000;                   

 global  start

start                                    

        MOV     r0, #x                    

        MOV       r0, r0, lsl #8           

        MOV     r1, #y                   

        ADD      r2, r0, r1, lsr #1       

          MOV      sp, #0x1000

          STR         r2, [sp]

        MOV     r0, #z                   

        AND      r0, r0, #0xFF                                   

        ADD      r2, r0, r1, lsr #1      

          LDR       r0, [sp]                  

          MOV      r1, #0x01

          ORR      r0, r0, r1

        MOV     r1, R2                  

        ADD        r2, r0, r1, lsr #1    

stop

        B         stop               

 end


六.实验结果及分析


实验A:

这个程序实现了两数的相加。

实验B:

这个程序实现了基本的数学加法,逻辑或运算。


           实验二  ARM汇编指令实验2

一、实验目的

1.熟悉ARM ADS 1.2 for ARM 开发环境及ARM软件模拟器的使用。

2.通过实验掌握使用LDM/STM、B、BL等指令完成较为复杂的存储区访问和分支程序的方法,学习使用条件码,加强对CPSR的认识。

二.实验设备

1.硬件:PC机;

2.软件:ADS1.2集成开发环境。Windows98/2000/NT/XP。

三.实验内容

     设计并调试一个存储区数据块的传送程序,具体数据块的传送要求为:将数据从源数据区snum复制到目标数据区dnum,数据的个数num假定为20,复制时以8个字为单位进行,对于最后不足8个字的数据,以字为单位进行复制。

四.实验程序


Area Int,code,readonly

 entry

 global start

num equ  20;                                 

start

        LDR     r0, =src          

        LDR     r1, =dst        

        MOV     r2, #num        

        MOV     sp, #0x400       

ublockcopy      

        MOVS    r3,r2, LSR #3    

        BEQ     copywords          

        STMFD   sp!, {r4-r11}    

octcopy

        LDMIA   r0!, {r4-r11}    

        STMIA   r1!, {r4-r11}    

        SUBS    r3, r3, #1              

        BNE     octcopy         

        LDMFD   sp!, {r4-r11}    

copywords

        ANDS    r2, r2, #7     

        BEQ     stop           

wordcopy

        LDR     r3, [r0], #4     

        STR     r3, [r1], #4      

        SUBS    r2, r2, #1      

        BNE     wordcopy     

stop

        B            stop

src

     dcd     1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4

dst

     dcd     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

 end


五.实验结果及分析

这个程序实现了数据块的相互传送。

              实验三  汇编与C语言的相互调用实验

一、实验目的

1.阅读Embest S3CEV40启动代码,观察处理器启动过程。

2.学会使用Embest IDE辅助信息窗口来分析判断调试过程和结果

3.学会在Embest IDE环境中编写、编译与调试汇编和C语言相互调用的程序。

二、实验设备

1.硬件:PC机;

2.软件:ADS1.2集成开发环境。Windows98/2000/NT/XP。

三、实验内容

使用汇编完成一个随机数产生函数,通过C语言调用该函数,产生一系列随机数,存放到数组中。

四、实验原理

   1ARM过程调用ATPCS(ARM)

ATPCS是一系列规定应用程序之间相互调用的基本规则,包括:

l   支持数据栈限制检查;

l   支持只读段位置无关(ROPI);

l   支持可读/写段位置无关(RWPI);

l   支持ARM程序和Thumb程序的混合使用;

l   处理浮点运算。

使用以上规定的ATPCS规则是,应用程序必须遵守如下:

l   程序编写遵守ATPCS;

l   变量传递以中间寄存器和数据栈完成;

l   汇编器使用-apcs开关选项。

程序只要遵守ATPCS相应规则,就可以使用不同的源代码来编写程序。程序间的相互调用最主要的是解决参数传递问题。应用程序之间使用中间及数据栈来传递参数,其中,第1~4个参数使用R0~R3,多用4个参数数据栈进行传递。这样,接受参数的应用程序必须知道参数的个数。

但是,在应用程序被调用时,一般无从知道所传递参数的个数。用不同语言编写的应用程序在调用时可以自定义传递的约定。使用具有一定意义的形式来传递,可以很好地解决参数个数的问题。常用方法是把第1个或最后1个参数作为参数个数(包括个数本身)传递给应用程序。ATPCS中寄存器的相应关系如表3.1所列。

表3.1   ATPCS规则中寄存器列表

2main( )__gccmain( )函数

当应用程序中包含了main( )函数时,会引起对C运行时库的初始化。该初始化是通过函数__gccmain( )实现的,即在main( )函数入口处,编译器会首先调用__gccmain( )函数,然后才是执行编写的代码。__gccmain( )函数在GCC的标准库里实现。当应用程序中没有包含main( )函数时,不会引起对C运行时库的初始化。这时,C运行时库的很多功能在应用程序中是不能使用的。

如果使用main( )函数作为应用程序的主函数,那么可以在源代码中间加入一个空的__gccmain( )函数(用C语言或汇编语言即可)

五、实验操作步骤

1. 创建新的工程,工程名为explasm。

2. 按照参考程序,重新编写源代码文件,并分别保持为 randtest.c、init. s、random. s和ldscript,并把它们加入工程中。

3. 按照编译→汇编器设置→链接器设置→调试器设置来设置新工程,并编译、链接工程。

4.下载调试文件,打开Memrory/Register/Watch/Variable/Call Stack窗口,单步执行程序。通过以上窗口,跟踪程序运行,观察分析并记录运行结果,通过实验学会使用Embest IDE进行应用程序的开发与调试。

六、实验参考程序

1randtest.c参考源代码


#include <stdio.h>

/* this function prototype is needed because 'randomnumber' is external */

extern unsigned int randomnumber( void );

int main()

{

  int i;

  int nTemp;

  unsigned int random[10];

  for( i = 0; i < 10; i++ )

  {

      nTemp = randomnumber();

      random[i] = nTemp;

  }

  return( 0 );

}


2init.s参考源代码


global _start

       area qq,code,readonly

       entry

_start

;# --- Setup interrupt / exception vectors

           B       Reset_Handler

Undefined_Handler

           B       Undefined_Handler

SWI_Handler

           B       SWI_Handler

Prefetch_Handler

           B       Prefetch_Handler

Abort_Handler

           B       Abort_Handler

           NOP                                          ;/* Reserved vector */

IRQ_Handler

           B       IRQ_Handler

FIQ_Handler

           B       FIQ_Handler

          

Reset_Handler

              LDR sp, =0x00002000

;#------------------------------------------------------------------------------

;#- Branch on C code Main function (with interworking)

;#----------------------------------------------------

;#- Branch must be performed by an interworking call as either an ARM or Thumb

;#- main C function must be supported. This makes the code not position-

;#- independant. A Branch with link would generate errors

;#------------------------------------------------------------------------------

                extern     main

                ldr         r0, = main

                mov         lr, pc

                bx          r0

;#------------------------------------------------------------------------------

;#- Loop for ever

;#---------------

;#- End of application. Normally, never occur.

;#- Could jump on Software Reset ( B 0x0 ).

;#------------------------------------------------------------------------------

 

             

       

       global     __gccmain

__gccmain

              mov           pc, lr  

       end


3random.s参考源代码


AREA    |Random$$code|, CODE, READONLY

       entry

     GLOBAL randomnumber

randomnumber

;# on exit

;#       a1 = low 32-bits of pseudo-random number

;#       a2 = high bit (if you want to know it)

        LDR     ip, seedpointer

        LDMIA   ip, {a1, a2}

        TST     a2, a2, LSR#1          ; /* to bit into carry    */

        MOVS    a3, a1, RRX            ; /* 33-bit rotate right  */

        ADC     a2, a2, a2             ; /* carry into LSB of a2 */

        EOR     a3, a3, a1, LSL#12     ; /* (involved!)          */

        EOR     a1, a3, a3, LSR#20     ; /* (similarly involved!)*/

        STMIA   ip, {a1, a2}

        MOV     pc, lr

seedpointer

        dcd    seed

DATA

        GLOBAL  seed

seed

        dcq    0x55555555

        dcq    0x55555555

        END


4ldscript参考源代码

SECTIONS

{

       . = 0x0;

       .text : { *(.text) }

       .data : { *(.data) }

       .rodata : { *(.rodata) }

       .bss : { *(.bss) }

}

实验结果

               

实验感想

         有时候我们很怀疑实验存在的意义,可是谁又能预知明天会发生什么呢。所以只要虔心的去做每一件事,在未来的某一天总会发现它存在的意义。

 

第二篇:嵌入式系统及应用综合实验报告格式

安徽工业大学

电气信息学院

嵌入式系统及应用综合实验报告

Linux系统下TFTP 和QT下聊天程序设计

姓    名:      刘洪方                   

学    号:      109104069                

专    业:      工商管理                 

年    级:      1                       

指导教师:      马小陆                  

20##年     6月   30 日


一、课程设计项目介绍(含项目介绍及设计目的)

(四号宋体,页数不够可另加,排版要工整规范,如每个大标题应位于页首等等,以下类同)

1.项目介绍:

      TFTP:是一个服务器客户端网络程序,以提供简单文件共享服务器,支持下载,列出文件目录和上传文件功能。

      QT:是一个简单的服务器客户端聊天程序,以提供简单的数据通信。

2、设计目的:

   TFTP:是为提供一个可以为网络使用者提供文件共享简单的功能的使用。方便网络间文件的访问和使用。

   QT:是一个支持双方简单聊天功能的程序。

   两者都帮助我们锻炼理念知识和实践能力。

二、总体设计(含系统的总体结构、原理框图或各模块介绍等)

三、详细设计(含主要的数据结构、程序流程图、关键代码段及注释等)

(四号宋体,框图文字用小五宋体)

以下是各代码的解释,介绍,原理,流程图:

TFTP服务器:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <fcntl.h>

#include <dirent.h>

#include <sys/types.h>          /* See NOTES */

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <errno.h>

#define N 128

typedef struct sockaddr SA;

ProcessList过程:利用一个循环获得目录中所有的文件,并把文件名发送到客户端,最终把所有文件表发送到客户端。完成此列出文件目录功能

void ProcessList(int connfd)

{

        char buf[N];

        DIR *mydir;

        struct dirent *myitem;

        mydir = opendir(".");

        while ((myitem = readdir(mydir)) != NULL)

        {

               if ((strcmp(myitem->d_name, ".") == 0) || (strcmp(myitem->d_name, "..") == 0)) continue;

               strcpy(buf, myitem->d_name);

               send(connfd, buf, N, 0);

        }

        closedir(mydir);

        return;

}

ProcessGet过程:首先打开需要下载的客户端发来命令中的文件名文件,然后如果打开成功则向客户端发送Y,客户端准备接收,然后服务器以128为单位读取数据,发送数据,最终把一个文件所有内容发送给客户端。完成下载功能。

void ProcessGet(int connfd, char buf[])

{

        int fd, nbyte;

        if ((fd = open(buf+1, O_RDONLY)) < 0)

        {

               fprintf(stderr, "fail to open %s : %s\n", buf+1, strerror(errno));

               buf[0] = 'N';

               send(connfd, buf, N, 0);

               return;

        }

              

        buf[0] = 'Y';

        send(connfd, buf, N, 0);

        while ((nbyte = read(fd, buf, N)) > 0)

        {

               send(connfd, buf, nbyte, 0);

        }

        close(fd);

        return;

}

ProcessPut过程:首先创建客户端发来命令中的文件名文件,然后如果打开成功则向客户端发送Y,客户端准备发送,客户端以128为单位读取数据,发送数据,每发送一段,服务器写入这部分内容,最终把一个文件所有内容发送给服务器。完成上传功能。

void ProcessPut(int connfd, char buf[])

{

        int fd, nbyte;

        if ((fd = open(buf+1, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)

        {

               printf("fail to create %s on server\n", buf+1);

               return;

        }

        while ((nbyte = recv(connfd, buf, N, 0)) > 0)

        {

               write(fd, buf, nbyte);

        }

        close(fd);

        return;

}

Main过程:首先初始化所有网络参数等待客户端的连接,然后以一个循环来接收客户端发来的命令首字符,并跟据这个来执行对应的操作。

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

{

   int listenfd, connfd;

        char buf[N];

   struct sockaddr_in server_addr;

  // XXX:step 1  int socket(int domain, int type, int protocol);

   if ((listenfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)

   {

      fprintf(stderr, "fail to socket : %s\n", strerror(errno));

      exit(-1);

   }

#ifdef _DEBUG_

   printf("socket is %d\n", listenfd);

#endif 

  // XXX:step 2  int bind(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

   memset(&server_addr, 0, sizeof(server_addr));

   server_addr.sin_family = PF_INET;

  server_addr.sin_port = htons(8888);

   server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

        if (bind(listenfd, (SA *)&server_addr, sizeof(server_addr)) < 0)

        {

               perror("fail to bind");

               exit(-1);

        }

        listen(listenfd, 5);

 

   while ( 1 )

        {

               if ((connfd = accept(listenfd, NULL, NULL)) < 0)

               {

                       perror("fail to accept");

                       break;

               }

               recv(connfd, buf, N, 0);

               switch (buf[0])

               {

                       case 'L' :

                                                     ProcessList(connfd);

                                                     break;

                       case 'G' :

                                                     ProcessGet(connfd, buf);

                                                     break;

                       case 'P' :

                                                     ProcessPut(connfd, buf);

                                                     break;

               }

               close(connfd);

        }

   return 0;

}

TFTP客户端:

TFTP客户端:

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <fcntl.h>

#include <sys/types.h>          /* See NOTES */

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <errno.h>

#define N 128

typedef struct sockaddr SA;

Printhelp过程:打印所有的操作帮助。

void PrintHelp()

{

   printf("help : display help info\n");

   printf("list : get file list of server\n");

   printf("get  : get <file>\n");

   printf("put  : put <file>\n");

        printf("quit : quit the client\n");

        return;

}

ProcessList过程:首先利用配置好的网络参数连接服务器,然后向服务器发送“L”命令,最后利用一个循环接收目录中所有的文件名,并打印文件名,最终把所有文件表发送到客户端。完成此列出文件目录功能

void ProcessList(struct sockaddr_in server_addr)

{

        int sockfd, nbyte;

        char buf[N];

        if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)

        {

                printf("fail to list\n");

               return;

        }

        if (connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) < 0)

   {

      printf("fail to connect server\n");

               goto ERROR_1;

   }

        strcpy(buf, "L");

        send(sockfd, buf, N, 0);

   while ((nbyte = recv(sockfd, buf, N, 0)) != 0)

        {

               printf("%s\n", buf);

        }

ERROR_1:

        close(sockfd);

  

        return;

}

ProcessGet过程:首先利用配置好的网络参数连接服务器,然后向服务器发送“G”命令并附上需要处理的文件名,创建需要下载的命令中的文件名文件,客户端准备接收,然后服务器以128为单位读取数据,写入数据,最终把一个文件所有内容接收到客户端。完成下载功能。

void ProcessGet(struct sockaddr_in server_addr, char command[])

{

        int sockfd, nbyte, fd;

   char buf[N];

        if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)

        {

           printf("fail to get\n");

               return;

        }

        if (connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) < 0)

   {

      printf("fail to connect server\n");

               goto ERROR_2;

      

   }

        sprintf(buf, "G%s", command+4);

        send(sockfd, buf, N, 0);

   recv(sockfd, buf, N, 0);

        if (buf[0] == 'N') // no such file

        {

               printf("No such file on server\n");

               goto ERROR_2;

        }

   if ((fd = open(command+4, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0)

        {

           printf("fail to create local file %s\n", command+4);

               goto ERROR_2;

        }

         

        while ((nbyte = recv(sockfd, buf, N, 0)) > 0)

        {

               write(fd, buf, nbyte);

        }

        close(fd);

ERROR_2:

        close(sockfd);

        return;

}

ProcessGet过程:首先利用配置好的网络参数连接服务器,然后向服务器发送“P”命令并附上需要处理的文件名,打开需要上传的命令中的文件名文件,客户端准备发送,然后服务器以128为单位读取数据,发送数据,最终把一个文件所有内容发送到服务器上。完成上传功能。

void ProcessPut(struct sockaddr_in server_addr, char command[])

{

        int sockfd, fd, nbyte;

        char buf[N];

   if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)

        {

           printf("fail to get\n");

               return;

        }

        if (connect(sockfd, (SA *)&server_addr, sizeof(server_addr)) < 0)

   {

      printf("fail to connect server\n");

               goto ERROR_3;

      

   }

   if ((fd = open(command+4, O_RDONLY)) < 0)

        {

               printf("fail to open %s\n", command+4);

               goto ERROR_3;

        }        

        sprintf(buf, "P%s", command+4);

        send(sockfd, buf, N, 0);

        while ((nbyte = read(fd, buf, N)) > 0)

        {

               send(sockfd, buf, nbyte, 0);

        }

        close(fd);

ERROR_3:

        close(sockfd);

        return;

}

Main过程:首先初始化所有网络连接参数等待过程的使用,然后以一个循环来接收键盘的命令前四个字符,并跟据这个来执行对应的操作。并把键入的字符为参数传给过程函数。

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

{

   int sockfd, fd, nbyte;

   char command[32];

   struct sockaddr_in server_addr;

   if (argc < 3)

        {

               printf("Usage : %s <server_ip> : <port>\n", argv[0]);

               exit(-1);

        }      

 

  // XXX:step 1  int socket(int domain, int type, int protocol);

   if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)

   {

      fprintf(stderr, "fail to socket : %s\n", strerror(errno));

      exit(-1);

   }

#ifdef _DEBUG_

   printf("socket is %d\n", sockfd);

#endif 

  // XXX:step 2  int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);

   memset(&server_addr, 0, sizeof(server_addr));

   server_addr.sin_family = PF_INET;

   server_addr.sin_port = htons(atoi(argv[2]));

   server_addr.sin_addr.s_addr = inet_addr(argv[1]);

   //server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

 

       

 

   while ( 1 )

        {

      printf("<client> ");

               fgets(command, 32, stdin);

               command[strlen(command)-1] = '\0';  // overwrite the '\n'

               if (strcmp(command, "help") == 0)

               {

                  PrintHelp();

               }

               else if (strcmp(command, "list") == 0)

               {

                       ProcessList(server_addr);

               }

               else if (strncmp(command, "get ", 4) == 0)

               {

                       ProcessGet(server_addr, command);

               }

               else if (strncmp(command, "put ", 4) == 0)

               {

                       ProcessPut(server_addr, command);

               }

               else if (strcmp(command, "quit") == 0)

               {

                       printf("Bye\n");

                       break;

               }

               else

               {

                       printf("wrong command, 'help' for command list\n");

               }

        }

   return 0;

}

QT服务器:

on_pushButton_clicked过程:当pushButton按下去时,则启动服务器初始化网络并监听,等待客户端连接。

void Dialog::on_pushButton_clicked()

{

    server = new Server(port);

    connect(server,SIGNAL(updateServer(QString,int)),this,SLOT(Process_updateServer(QString,int)));

    ui->pushButton->setEnabled(false);

}

Process_updateServer过程:当接收到客户端发来的数据时,则把它显示在listWidget中。

void Dialog::Process_updateServer(QString msg,int length)

{

   ui->listWidget->addItem(msg.left(length));

}

QT客户端:

on_EnterChatRoomBtn_clicked过程:当EnterChatRoomBtn按下去时,则启动服务器连接参数初始化并连接SeverIP_lineEdit指的服务器。

void Dialog::on_EnterChatRoomBtn_clicked()

{

    if(!status)

    {

        QString ip= ui->SeverIP_lineEdit->text();

        if(!serverIP->setAddress(ip))

        {

            QMessageBox::information(this,"error","server IP address error!");

            return;

        }

        if(ui->User_lineEdit->text()=="")

        {

            QMessageBox::information(this,"error","user Name error!");

            return;

        }

        userName=ui->User_lineEdit->text();

       tcpSocket->connectToHost(ui->SeverIP_lineEdit->text(),port);

        //tcpSocket->connectToHost(*serverIP,port);

        //tcpSocket->connectToHost(QHostAddress::LocalHost,port);

        if (tcpSocket->waitForConnected(1000))

            qDebug("Connected!");

        status=true;

    }

    else

    {

        int length=0;

        QString msg=userName+":Leave Chat Room!";

        if((length=tcpSocket->write(msg.toLatin1(),msg.length())) != msg.length())

        {

            return;

        }

      tcpSocket->disconnectFromHost();

        status=false;

    }

}

process_connected过程:连接成功时,则发送“enter chat room”并附上用户名发送到服务器。

void Dialog::process_connected()

{

QMessageBox::information(this,"error","eeeeeeeeeeeeeeeee!");

ui->sendBtn->setEnabled(true);

ui->EnterChatRoomBtn->setText("leave");

int length=0;

QString msg=userName+"enter chat room!";

if((length=tcpSocket->write(msg.toLatin1(),msg.length())) != msg.length())

{

     return;

}

}

slotdisconnected过程:取消连接,使sendBtn有效

void Dialog::slotdisconnected()

{

   ui->sendBtn->setEnabled(false);

   ui->EnterChatRoomBtn->setText("EnterChatRoom");

}

dataReceived过程:当服务器数据来到时,把数据加入到Client_listWidget内。

void Dialog::dataReceived()

{

  while(tcpSocket->bytesAvailable()>0)

   {

     QByteArray datadram;

     datadram.resize(tcpSocket->bytesAvailable());

   //  QHostAddress sender;

     tcpSocket->read(datadram.data(),datadram.size());

     QString msg=datadram.data();

     ui->Client_listWidget->addItem(msg.left(datadram.size()));

   }

}

on_sendBtn_clicked过程:当按下sendBtn时,则把Send_lineEdit内容并附上用户名发送到服务器上,最后清空Send_lineEdit。

void Dialog::on_sendBtn_clicked()

{

   int length;

    if(ui->Send_lineEdit->text()=="")

    {

        QMessageBox::information(this,"error","send information error!");

        return;

    }

    QString msg=userName+":"+ui->Send_lineEdit->text();

    if((length=tcpSocket->write(msg.toLatin1(),msg.length())) != msg.length())

    {

        return;

    }

    ui->Send_lineEdit->clear();

}

四、运行结果(含运行及测试结果和用户使用说明书)

(四号宋体)

五、课程设计小结与心得体会(不小于300字)

(四号宋体)

经过这个实践我获得了很多东西

我学习了在书本上没有学习到的很多实际问题解决办法,也增加了自己在实践上的经验,为以后的开发和设计奠定一些基础。

在实践过程中我也遇到过很多的问题,但是我学会了自己动手动脑去发现发开拓知识,和同学一同讨论学习,大家互相进步。

也增加了自己的信心,坚信自已以后遇到什么问题都要努力去发展问题的关键所在,自己动手动脑去解决问题。

最后,在这个实践中我学会了和其他人合作的重要性,一个人的能力总是有限的,如果大家可以互相合作,就可以提高效率也可以增强一个团体的整体实力.

在以后的实践中我一定会更加的积极的去参于其中,和其他人相互合作,努力发现自己的不足,不断的发展自己的能力,提高自己的实际能力,进而在将来的工作中更好的适应公司要求和工作的任务!

六、成绩评定

                                                                                                                                                                                                                                    

相关推荐