当前位置首页 > 计算机 > 嵌入式开发
搜柄,搜必应! 快速导航 | 使用教程

讲稿(嵌入式设计与实现)

文档格式:DOC| 26 页|大小 848.13KB|2025-03-16 发布|举报 | 版权申诉
第1页
第2页
第3页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 26
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 目 录第1章 嵌入式硬件开发环境 21.1 嵌入式系统的概念 21.2 熟悉OURS PXA270RP实验箱的硬件环境 2第2章 Linux常用命令 2第3章 搭建嵌入式Linux开发环境 43.1 vwaretools的安装与共享设置 43.2 tslib-1.4的编译安装 43.3 qtX11和qtE4的编译安装 53.4 PATH与LD_LIBRARY_PATH的设置 63.5 配置交叉编译器 63.6 配置minicom、tftp和NFS 7第4章bootloader、Linux内核及文件系统制作与移植 124.1 bootloader 124.2 Linux内核编译与移植 124.3文件系统制作与移植 13第5章 Qt图形编程 145.1 嵌入式GUI简介 145.2 Qt/Embedded开发入门 145.2.1 Qt/Embedded介绍 145.2.2 Qt/Embedded图形界面 155.2.3 Qt/Embedded信号和槽机制 175.2.4 Qt/Embedded网络编程 18第6章 聊天系统设计与实现 186.1 聊天软件需求分析 186.2 界面设计 186.3 网络相关部分的实现 186.4 项目运行 24第7章 系统移植与调试 24 第1章 嵌入式硬件开发环境1.1 嵌入式系统的概念以应用为中心,以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

    开发机称为宿主机,应用机称为目标机1.2 熟悉OURS PXA270RP实验箱的硬件环境1、认识核心板和扩展板2、认识nor flash、nand flash、sdram、ARM处理器3、熟悉电源接口、并口、JTAG接口、串口、网口、USB接口4、熟练掌握将PC机与开发实验箱的连接第2章 Linux常用命令Shell与用户间的关系如图 2.1 所示用户在提示符下输入的命令都由Shell 先解释然后传给 Linux 内核图 2.1 内核、Shell 和用户的关系小知识:命令的使用可以通过man 命令名或命令名 -–help的方式获得帮助1、ls: 列出目录的内容,常用参数有-l(长文件名显示格式)和-a(显示所有文件), 显示格式为:文件类型与权限 链接数 文件属主 文件属组 文件大小 修改的时间 名字2、find: 在指定目录中搜索文件,常用参数为-name,如find /usr/qpe/pic/ -name *.png3、cd: 改变工作目录可使用“cd –”回到前次工作目录/”代表当前目录,“../”代表上级目录4、mkdir: 创建一个目录,可以一次建立多个目录,常用参数有-p(自动创建指定路径中不存在的目录),如mkdir /home/lny/myfile5、rm: 删除一个目录中的一个或多个文件或目录,常用参数-f(删除已存在的目标文件而不提示),-i(在覆盖目标文件前要求用户确认),-r(递归地删除该目录及其子目录下的所有内容)6、cp: 将给出的文件或目录复制到另一文件或目录中,常用参数有-a(保留链接、文件属性、并复制其子目录),-f(同rm),-i(同rm)7、mv: 为文件或目录改名或将文件由一个目录移入另一个目录中,常用参数-f(同rm),-i(同rm)8、ln: 为某一个文件在另外一个位置建立一个符号链接,常用参数-s(建立符号链接),如在当前目录下创建/usr/qpe/lib/fonts的软链接可以用命令ln -s /usr/qpe/lib/fonts/ ./fonts9、fdisk: 可以查看硬盘分区情况,并可对硬盘进行分区管理,如fdisk -l10、mount:磁盘挂载命令。

    如挂载根目录mount –o soft,timeo=100,rsize=1024 192.168.0.100:/ /mnt; 挂载U盘mount –t vfat /dev/sdb1 /mnt/usb 挂载windows目录为mount -o username=administrator,password=pldy123,iocharset=utf8 //172.21.28.71/c /mnt/c 若想设置在开机时自动挂载,可在文件“/etc/fstab”中加入相应的设置行即可11、echo: 显示字符串12、export: 设置新的环境变量,如export QTDIR=/usr/local/Trolltech/Qt-4.4.3export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH13、chmod: 改变文件的访问权限. 文件的访问权限可表示成:- rwx rwx rwx在此设有三种不同的访问权限:读(r)、写(w)和运行(x);三个不同的用户级别:文件拥有者(u)、所属的用户组(g)和系统里的其他用户(o)可增加一个用户级别 a(all)来表示所有这三个不同的用户级别。

    ① 对于第一种符号连接方式的 chmod 命令中,用加号“+”代表增加权限,用减号“−”删除权限,等于号“=”设置权限,如chmod a+rx,u+w /home/lny/myfile② 对于第二种八进制数指定的方式,将文件权限字符代表的有效位设为“1”,即“rw-”、“rw-”和“r--”的八进制表示为“110”、“110”、“100”,把这个 2 进制串转换成对应的 8 进制数就是 6、6、4,也就是说该文件的权限为 664(三位八进制数),如chmod 765 /home/lny/myfile14、tar: 对文件目录进行打包或解包,常用参数有-c(建立新的打包文件),-f(对普通文件操作),-x(从打包文件中解出文件),-v(处理过程中输出相关信息),-z(调用gzip来压缩打包文件,与-x联用时调用gzip完成解压缩),-j(调用bzip2来压缩打包文件,与-x联用时调用bzip2完成解压缩)如tar -zcvf lny.tar.gz /home/lny; tar -jxvf linux-2.6.11.tar.bz2第3章 搭建嵌入式Linux开发环境3.1 vwaretools的安装与共享设置1、安装VMware tools,以方便鼠标内外移动(确保“虚拟化”不选),步骤如下: VM菜单→VMware tools install→“是”→将光驱(linux中的光驱)的VMware tools 中的Vmwaretools-6.0.2-59824.tar.gz复制到目录root下→在终端对Vmwaretools-6.0.2-59824.tar.gz进行解压tar –zxvf Vmwaretools-6.0.2-59824.tar.gz→cd vmware-tools-distrib→./vmware-install.pl(全部选yes,注意有一个默认为[no]的选项改为yes)2、设置windows与linux相互共享:Windows下访问linux的内容:确保网线正确连接;确保网络端口激活(系统→管理→网络→设置静态IP并激活);确保samba服务安装并启动(系统→管理→服务器设置→services中勾选smb选项);添加samba用户(必须是存在的用户,如果冲突,则注释/etc/samba/smbusers中对应的用户名)(“首选项”→samba用户→添加用户);添加共享(选择共享目录和设置共享对象权限等)。

    通过\\192.168.11.7即“\\虚拟机ip”的形式访问3、Linux下访问windows的内容:确保安装时没有选择“虚拟化”选项;菜单VM→settings→options→shared folds→add在linux系统下通过/mnt/hgfs目录访问windows中共享文件夹3.2 tslib-1.4的编译安装假设源码解压目录为: /home/tslib-1.41、cd /home/tslib-1.4 ./autogen.sh //生成congigure2、./configure --host=arm-linux --cache-file=arm-linux.cache//加上参数--prefix=/home/tslib-1.4可以看到头文件3、make出现错误:undefined reference 'rpl_malloc'解决:将config.h.in中的 #undef malloc 行注释掉重新执行make,OK!4、make install生成的库文件分别在目录./src、./plugins的.lib目录中,其中./lib为隐藏目录,src/.lib中包含libts-0.0.so.0.1.1,libts-0.0.so.0、libts.la、libts.lai、libts.so,plugins/.lib中包含ucb1x00.so、pthres.so、linear.so、input.so、variance.so、dejitter.so等,库文件版本为libts-0.0.so.0.1.15、拷贝mkdir tslib-1.4cd tslib-1.4mkdir lib etc plugins include tests目录lib:将src/.lib/中的libts-0.0.so.0,libts-0.0.so.0.1.1,libts.so拷到其中。

    目录etc: 将etc/中的ts.conf拷到其中//结合自己的触摸屏型号进行相应的修改目录plugins: 将plugins/.libs/中的*.so拷到其中//结合自己的触摸屏型号,删除部分库文件目录tests: 将tests/中的ts_*拷到其中//只需要保留ts_calibrate和ts_test目录include:将src/tslib.h拷到其中6、测试执行测试程序ts_calibrate时一直出现错误:ts_open:no such device通过查找ts_calibrate.c发现,编译时如果没有加参数--enable-inputapi=no,则应将环境变量定义如下:export TSLIB_TSDEVICE=/dev/input/event0(出错时为TSLIB_TSDEVICE=/dev/touchscreen/ucb1x00,因为我的触摸屏型号为 ucb1x00)export TSLIBDIR=/home/tslib-1.4export TSLIB_CONFFILE=$TSLIBDIR/etc/ts.confexport TSLIB_PLUGINDIR=$TSLIBDIR/pluginsexport TSLIB_FBDEVICE=/dev/fb0export TSLIB_CONSOLEDEVICE=noneexport POINTERCAL_FILE=/etc/pointercal //生成校准文件export LD_LIBRARY_PATH=$TSLIBDIR/libexport QWS_MOUSE_PROTO=TPanel:/dev/touchscreen/ucb1x00export TSLIB_CALIBFILE=/etc/pointercal //应用校准文件[ -f /etc/pointercal ] || /home/tslib-1.4/tests/ts_calibrate //检查是否存在校准文件另外,还要注意的是,ts.conf内容如下:module_raw input#module_raw ucb1x00 //如果注释前一句而保留该句,则会出现意想不到的问题。

    module pthres pmin=1module variance delta=30module dejitter delta=100module linear执行ts_calibrate顺利通过3.3 qtX11和qtE4的编译安装一、QT-X11环境的配置1、解压qt-x11-4.4.3.tar.gz2、cd 解压了的目录 QT-X113、 #./configure //生成Makefile #make //要好几个小时(约3个半小时) #make install //安装完后会生成目录/usr/local/Trolltech/QT-4.4.3 ,这时刚才解压完得到的QT-X11可以不要了 4、设置环境变量(实际上是设置编译环境):在/etc/profile 加入: #for QT-X11-4.4.3export QTDIR=/usr/local/Trolltech/Qt-4.4.3export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATHexport PATH=$QTDIR/bin:$PATHexport QMAKESPEC=$QTDIR/mkspecs/linux-g++5、#source /etc/profile 使环境变量生效,确保要用的编译器摆在首位,以屏蔽系统自带的编译器。

    二、QT-embed环境的配置1、把arm-linux-gcc版本:3.3.2 放目录/usr/local/arm并在环境变量PATH中指明 #export PATH=/usr/local/arm/3.3.2/bin:$PATH 2、解压qt-embedded-linux-4.4.3.tar.gz 得qt-embed3、配置支持触摸屏的参数配置:./configure -release -shared -fast -no-largefile -qt-sql-sqlite -no-qt3support -no-xmlpatterns -no-mmx -no-3dnow -no-sse -no-sse2 -no-svg -no-webkit -qt-zlib -qt-gif -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -make libs -nomake tools -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-openssl -xplatform qws/linux-arm-g++ -embedded arm -little-endian -qt-freetype -depths 16,18 -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-kbd-usb -no-glib -qt-mouse-tslib -I/home/tslib-1.4/include -L/home/tslib-1.4/lib4、#make 5、#make install3.4 PATH与LD_LIBRARY_PATH的设置参考3.3节内容。

    3.5 配置交叉编译器修改/etc/profile,在有“pathmunge”命令语句处加上如下命令语句:Pathmunge /usr/local/arm-linux/bin3.6 配置minicom、tftp和NFS1、配置minicom开发板上的信息显示给开发人员最常用的就是通过串口线输出到宿主机的显示器上,这样,开发人员就可以看到系统的运行情况了Minicom 是 Linux 下串口通信的软件,它的使用完全依靠键盘的操作,虽然没有“超级终端”那么易用,但是使用习惯之后读者将会体会到它的高效与便利下面主要讲解如何对Minicom 进行串口参数的配置首先在命令行中键入“minicom”,这就启动了 minicom 软件Minicom 在启动时默认会进行初始化配置,如图 3.1 所示图 3.1 minicom 启动注意 在 Minicom 的使用中,经常会遇到三个键的操作,如“CTRL-A Z”,这表示先同时按下 CTRL和“A”(大写),然后松开此二键再按下“Z”正如图 3.1 中的提示,接下来可键入 CTRL+A Z,来查看 minicom 的帮助,如图 3.2所示按照帮助所示,可键入“O”(代表 Configure Minicom)来配置 minicom 的串口参数,当然也可以直接键入“CTRL-A O”来进行配置,如图 3.3 所示。

    图3.2 minicom 帮助图 3.3 minicom 配置界面在这个配置框中选择“Serial port setup”子项,进入如图 3.4 所示配置界面上面列出的配置是 minicom 启动是的默认配置,用户可以通过键入每一项前的大写字母,分别对每一项进行更改图 3.5 所示为在“Change which setting 中”键入了“A”,此时光标转移到第 A 项的对应处注意 在 minicom 中“ttyS0”对应“COM1”,“ttyS1”对应“COM2”图3.4 minicom 串口属性配置界面图 3.5 minicom 串口号配置接下来,要对波特率、数据位和停止位进行配置,键入“E”,进入如图 3.6 所示的配置界面在该配置界面中,可以键入相应波特率、停止位等对应的字母,即可实现配置,配置完成后按回车键就退出了该配置界面,在上层界面中显示如图 3.7 所示配置信息,要注意与图3.4 进行对比,确定相应参数是否已被重新配置图 3.6 minicom 波特率等配置界面图 3.7 minicom 配置完成后界面到此为止,读者已经能将开发板的系统情况通过串口打印到宿主机上了,这样,就能很好地了解硬件的运行状况。

    小知识 通过串口打印信息是一个很常见的手段,很多其他情况如路由器等也是通过配置串口的波特率这些参数来显示对应信息的2、tftptftp 协议是简单文件传输协议,它可以看作是一个 FTP 协议的简化版本,与 FTP 协议相比,它的最大区别在于没有用户管理的功能它的传输速度快,可以通过防火墙,使用方便快捷,因此在嵌入式的文件传输中广泛使用tftp 分为客户端和服务器端两种通常,首先在宿主机上开启 tftp 服务器端服务,设置好 tftp 的根目录内容(也就是供客户端下载的文件),接着,在目标板上开启 tftp的客户端程序(现在很多开发板都已经提供了该项功能)这样,把目标板和宿主机用直连线相连之后,就可以通过 tftp 协议传输可执行文件了Linux 下 tftp 的服务器服务是由 xinetd 所设定的,默认情况下是处于关闭状态首先,要修改 tftp 的配置文件,开启 tftp 服务,如下所示:[root@ateng tftpboot]# vi /etc/xinetd.d/tftp# default: off# description: The tftp server serves files using the trivial file transfer \# protocol. The tftp protocol is often used to boot diskless \# workstations, download configuration files to network-aware printers, \# and to start the installation process for some operating systems.service tftp{socket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /tftpbootdisable = noper_source = 11cps = 100 2flags = IPv4}在这里,主要要将“disable=yes”改为“no”,另外,从“server_args”可以看出,tftp服务器端的默认根目录为“/tftpboot”,用户若需要可以更改为其他目录。

    接下来,重启 xinetd 服务,使刚才的更改生效,如下所示:[root@ateng tftpboot]# service xinetd restart关闭 xinetd: [ 确定 ]启动 xinetd: [ 确定 ]接着,使用命令“netstat -au”以确认 tftp 服务是否已经开启,如下所示:[root@ateng tftpboot]# netstat -auActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address Stateudp 0 0 *:32768 *:*udp 0 0 *:831 *:*udp 0 0 *:tftp *:*udp 0 0 *:sunrpc *:*udp 0 0 *:ipp *:*这时,用户就可以把所需要的传输文件放到“/tftpboot”目录下,这样,主机上的 tftp 服务就可以建立起来了。

    接下来,用直连线(注意:不可以使用网线)把目标板和宿主机连起来,并且将其配置成一个网段的地址,再在目标板上启动 tftp 客户端程序(注意:不同的开发板所使用的命令可能会不同,读者可以查看帮助来获得确切的命令名及格式),如下所示:=>tftpboot 0x30200000 zImageTFTP from server 192.168.1.1; our IP address is 192.168.1.100Filename 'zImage'.Load address: 0x30200000Loading: ################################################################# ############################################################### #############################################doneBytes transferred = 881988 (d7544 hex)可以看到,此处目标板使用的 IP 为“192.168.1.100”,宿主机使用的 IP 为“192.168.1.1”,下载到目标板的地址为 0x30200000,文件名为“zImage”。

    小知识 tftp 是一个很好的文件传输协议,它的简单易用吸引了广大用户但它同时也存在着较大的安全隐患由于 tftp 不需要用户的身份认证,因此给了黑客的可乘之机因此在使用 tftp 时一定要设置一个单独的目录作为 tftp 服务的根目录,如上文所述的“/tftpboot”等 3、NFS在/etc/exports中加入语句:/ 192.168.0.* (rw,inscure,no_root_squash,no_all_squash)第4章bootloader、Linux内核及文件系统制作与移植4.1 bootloader1、编译cd /pxa270_linux/blob_ours/blob-xscalemake –f Makefile.cvs./configure –host=arm-linux –with-board=mainstone –with-linux-prefix=/pxa270_linux/linux/ --enable-xli –enable-networkmake(保存在/pxa270_linux/blob_ours/blob-xscale/src/blob下)2、移植(确保开发板上电)cd /pxa270_linux/tools./Jflashmm-linux PXA270 blob p(该命令是寻找PXA270.dat文件所指定的CPU,把blob文件烧写到这个CPU使用的flash中,要求blob,PXA270.dat与Jflashmm-linux在同一个文件夹中,.dat文件不可以加后缀。

    4.2 Linux内核编译与移植1、编译内核的编译根据不同的情况会有不同的步骤,但其中最主要分别为3 个步骤:内核配置、建立依存关系、建立内核,其他的为一些辅助功能,如清除文件等1)内核配置cd /pxa270_linux/linuxmake menuconfig (菜单式配制)在menuconfig 的配置界面是图形化的内核裁减界面通过此部分,读者可以方便地选择,决定哪些部分被加载并编译入Linux内核,哪些部分被编译为模块,哪些部分不用,如图 4.1 所示Load an Alternate Configuration File”选项表示装载一个已经保存好的设置也可以选择“Save Configuration to an Alternate File”选项保存自己的配置文件图 4.1 make menuconfig 配置界面此外,要注意 2.6 和 2.4 内核在串口命名上的一个重要区别,在 2.4 内核中“COM1”对应的是“ttyS0”,而在 2.6 内核中“COM1”对应“ttySAC0”,因此在启动参数的子项要格外注意,如图4.3 所示,否则串口打印不出信息2)建立依赖关系make dep由于内核源码树中的大多数文件都与一些头文件有依赖关系,因此要顺利建立内核,内核源码树中的每个 Makefile 就必须知道这些依赖关系。

    建立依赖关系往往发生在第一次编译内核的时候,它会在内核源码树中每个子目录产生一个“.depend”文件3)建立内核make cleanmake zImage这里建立的为压缩的内核映像,名为zImage,位于/pxa270_linux/linux/arch/arm/boot目录中2、移植cp zImage /tftpboot –rf (虚拟机终端)以下命令在minicom中完成:blob>tftp zImage –kernel (下载到内存0xa0008000处)blob>fwrite 0xa0008000 0x00040000 0x00200000表示从内存0xa0008000处取出长度为0x00200000的数据,写入flash中0x00040000开始的地址中4.3文件系统制作与移植1、制作文件系统:cd /pxa270_linux/fs./mkfs.jffs2 –r rootfs270 –o xscale_fs.jffs2 –e 0x40000 –pad=0x01000000(根文件系统)./mkfs.jffs2 –r junk –o junk.jffs2 –e 0x40000 –pad=0x0dc0000(扩展文件系统)其中,-r后面是指令要做成image的文件夹,默认为当前文件夹;-o后面是指令输出的文件名,-e表擦除块的大小,默认为64KB,--pad表输出文件的大小,为了不浪费flash空间,这个值最好符合flash driver所规划的区块大小,如果不足,则使用0xff来填充补满。

    2、文件系统移植:cp xscale_fs.jffs2 /tftpboot –rf (虚拟机终端)cp junk.jffs2 /tftpboot –rf (虚拟机终端)以下命令在minicom中完成:blob>tftp xscale_fs.jffs2blob>fwrite 0xa1000000 0x00240000 0x01000000blob>tftp junk .jffs2blob>fwrite 0xa1000000 0x01240000 0x0dc0000表示从内存0xa1000000处取出长度为0x0dc0000的数据,写入flash中0x01240000开始的地址中第5章 Qt图形编程5.1 嵌入式GUI简介GUI( 图形用户界面)是指计算机与其使用者之间的对话接口,它的存在为使用者提供了友好便利的界面,并大大方便了非专业用户的使用,使得人们从烦琐的命令中解脱出来,可以通过窗口、菜单方便地进行操作 Qt/Embedded是Trolltech(奇趣)公司为嵌入式系统开发的Qt版本从Qt 4.1版本开始,Qt/Embedded改名为Qtopia Core,又从Qt 4.4.1版本开始,又改名为Qt for Embedded Linux。

    其优点是:1、以开发包的形式提供,包括了图形设计器、Makefile制作工具、字体国际化工具、Qt的C++类库等2、支持跨平台(如Microsoft Windows、MacOS X、Linux、Solaris等)3、类库支持跨平台(封装了适应不同操作系统的访问细节)4、模块化,可任意裁减(最小可裁减到几百KB,但这时已基本失去了使用价值)缺点是:结构过于复杂臃肿,很难进行底层的扩充、定制和移植5.2 Qt/Embedded开发入门5.2.1 Qt/Embedded介绍1、架构如下图所示应用程序源代码Qt APIQt/EmbeddedQt/X11Qt/XLibX Windows Server帧缓冲Linux内核Qt/Embedded与Qt/X11的Linux版本的比较2、Qt的开发环境Qt桌面版本:Qt/X11或Qt/Windows,结合大家熟知的Visual C++或Borland C++就可以进行开发了`3、Qt的支撑工具 Qmake和Qt designer(图形设计器)5.2.2 Qt/Embedded图形界面Qt提供了一整套的窗口部件,它们组合起来可用于创建用户界面的可视元素窗口部件是QWidget或其子类的实例,用户自定义的窗口通过子类化得到,如下图所示。

    QObjectQTimerQWidgetQDialogQFrameQSpinBoxQLabelQLineEdit对于初学者来说,使用designer工具设计程序界面非常方便快捷,如秒表程序stopwatch的界面文件digclock.ui效果如下图所示播放器程序mediaplayer界面文件videoface.ui效果如下图所示对应的.h文件代码自动生成,但比较复杂,为了熟悉代码,完全可以用代码的形式生成用户界面,如通讯录程序addressbook中的部分代码如下:addressBook::addressBook(QWidget *parent){ setWindowTitle(tr("this is addressbook.")); setFixedSize(lcdWidth,lcdHeight); contacts=new QMap; saveBt=new QPushButton(tr("save")) ; cancelBt=new QPushButton(tr("cancel")); findBt=new QPushButton(tr("find")); contactName=new QLabel(tr("name")); contactTele=new QLabel(tr("telephone")); nameDetail=new QLineEdit; teleNo=new QTextEdit ; QHBoxLayout *hlayout=new QHBoxLayout; hlayout->addWidget(saveBt,Qt::AlignCenter); hlayout->addWidget(cancelBt,Qt::AlignJustify); hlayout->addWidget(findBt,Qt::AlignCenter); QGridLayout *layout=new QGridLayout; layout->addWidget(contactName,0,0,Qt::AlignRight); layout->addWidget(nameDetail,0,1); layout->addWidget(contactTele,1,0,Qt::AlignTop); layout->addWidget(teleNo,1,1,Qt::AlignLeft); layout->addLayout(hlayout,2,1); setLayout(layout); connect(saveBt,SIGNAL(clicked()),this,SLOT(saveInform())); connect(cancelBt,SIGNAL(clicked()),this,SLOT(cancelInform())); connect(findBt,SIGNAL(clicked()),this,SLOT(findName()));}5.2.3 Qt/Embedded信号和槽机制1、机制概述 信号(signals)和槽机制是Qt的核心机制,是Qt自行定义的一种通信机制,独立于标准的C/C++语言。

    所有从QObject或其子类(如QWidget)派生的类都能够包含信号和槽当对象改变状态时,信号就由该对象发射(Emit)出去了,它不知道另一端是是谁在接收这个信号槽函数用于接收信号,它们是普通的对象成员函数,一个槽函数并不知道是否有任何信号与自己相连接对象间信号与插槽的关系 用户可以将多个信号与单个槽函数连接,也可以将单个信号与多个槽函数连接,甚至将一个信号与另外一个信号相连接其间的关系如下图所示对象2信号1槽1槽2对象1信号1信号2对象3槽1槽22、信号与插槽实现信号的定义:signals:void mySignal();void mySignal(int x);void mySignalParam(int x,int y);槽函数的定义:public slots:void mySlot();void mySlot(int x);void mySlotParam(int x,int y);信号与插槽关联(通过QObject对象的connect()函数实现)QLabel *label=new QLabel;QScrollBar *scroll=new QScrollBar;QObject::connect(scroll,SIGNAL(valueChanged(int)),label,SLOT(setNum(int)));5.2.4 Qt/Embedded网络编程QTcpSocket和QTcpServer类,具体查看Qt的帮助文档。

    第6章 聊天系统设计与实现6.1 聊天系统需求分析1、使用对象:09计嵌2、系统说明:以宿舍为单位,主界面中的成员为全班同学,聊天包括私聊、群聊(信息仅限于本宿成员)和广播(全班同学都能看到);ID为各自的学号,禁止非本班同学登录3、功能分析:注册、登录、下线、加入群、退出群、添加和修改个人信息、聊天、提供对用户信息和聊天信息的保存等6.2 界面设计 服务器端创建聊天室 客户端登录界面6.3 网络相关部分的实现服务器端程序部分代码:TcpServer::TcpServer(QWidget *parent,Qt::WindowFlags f) :QDialog(parent,f){ setWindowTitle(tr("TCP Server")); QVBoxLayout *vbMain=new QVBoxLayout(this); ListWidgetContent=new QListWidget(this); vbMain->addWidget(ListWidgetContent); QHBoxLayout *hb=new QHBoxLayout(); LabelPort=new QLabel(this); LabelPort->setText(tr("Port")); hb->addWidget(LabelPort); LineEditPort=new QLineEdit(this); hb->addWidget(LineEditPort); vbMain->addLayout(hb); PushButtonCreate=new QPushButton(this); PushButtonCreate->setText(tr("create")); vbMain->addWidget(PushButtonCreate); connect(PushButtonCreate,SIGNAL(clicked()),this,SLOT(slotCreateServer())); port=8010; LineEditPort->setText(QString::number(port));}TcpServer::~TcpServer(){}void TcpServer::slotCreateServer(){ server=new Server(this,port); connect(server,SIGNAL(updateServer(QString,int)), this,SLOT(updateServer(QString,int))); PushButtonCreate->setEnabled(false);}void TcpServer::updateServer(QString msg,int length){ ListWidgetContent->addItem(msg.left(length));}TcpClientSocket::TcpClientSocket(QObject *parent){ connect(this,SIGNAL(readyRead()),this,SLOT(dataReceived())); connect(this,SIGNAL(disconnected()),this,SLOT(slotDisconnected()));}void TcpClientSocket::dataReceived(){ while(bytesAvailable()>0) { char buf[1024]; int length=bytesAvailable(); read(buf,length); QString msg=buf; emit updateClients(msg,length); }}TcpClientSocket::~TcpClientSocket(){}void TcpClientSocket::slotDisconnected(){ this->close(); emit disconnected(this->socketDescriptor());}Server::Server(QObject *parent,int port) :QTcpServer(parent){ listen(QHostAddress::Any,port);}void Server::incomingConnection(int socketDescriptor){ TcpClientSocket *tcpClientSocket=new TcpClientSocket(this); connect(tcpClientSocket,SIGNAL(updateClients(QString,int)), this,SLOT(updateClients(QString,int))); connect(tcpClientSocket,SIGNAL(disconnected(int)), this,SLOT(slotDisconnected(int))); tcpClientSocket->setSocketDescriptor(socketDescriptor); tcpClientSocketList.append(tcpClientSocket);}void Server::updateClients(QString msg,int length){ emit updateServer(msg,length); for(int i=0;iwrite(msg.toLatin1(),length)!=length) continue; }}void Server::slotDisconnected(int descriptor){ for(int i=0;isocketDescriptor()==descriptor) { tcpClientSocketList.removeAt(i); return; } } return;}客户端程序部分代码:TcpClient::TcpClient(QDialog *parent,Qt::WindowFlags f) :QDialog(parent,f),status(false),port(8010){ setWindowTitle(tr("TCP client")); ListWidgetContent=new QListWidget; LineEditMsg=new QLineEdit; PushButtonSend=new QPushButton(tr("send")); PushButtonSend->setEnabled(false); QHBoxLayout *msgLayout=new QHBoxLayout; msgLayout->addWidget(LineEditMsg); msgLayout->addWidget(PushButtonSend); QHBoxLayout *userLayout=new QHBoxLayout; userNameLabel=new QLabel(tr("user name:")); LineEditUser=new QLineEdit; userLayout->addWidget(userNameLabel); userLayout->addWidget(LineEditUser); QHBoxLayout *serverIPLayout=new QHBoxLayout; serverIPLabel=new QLabel(tr("server IP:")); LineEditServerIP=new QLineEdit; serverIPLayout->addWidget(serverIPLabel); serverIPLayout->addWidget(LineEditServerIP); QHBoxLayout *portLayout=new QHBoxLayout; portLabel=new QLabel(tr("port Num:")); LineEditPort=new QLineEdit; LineEditPort->setText(QString::number(port)); portLayout->addWidget(portLabel); portLayout->addWidget(LineEditPort); PushButtonEnter=new QPushButton(tr("enter")); QVBoxLayout *mainlayout=new QVBoxLayout; mainlayout->addWidget(ListWidgetContent); mainlayout->addLayo。

    点击阅读更多内容
    最新文档
    2025年作风建设学习教育开展情况的报告范文.docx
    在2025年民营企业座谈会上的主持讲话范文.docx
    在2025年全县教育领域群众身边不正之风和腐败问题集中整治调度会上的讲话范文.docx
    工委副书记在2025年机关DeepSeek应用专题辅导培训班开班仪式上的讲话范文.docx
    在2025年DeepSeek大模型政务应用培训会上的讲话范文.docx
    在青年干部培训结业典礼上的讲话文稿.docx
    2025年副书记防汛工作会议上的讲话范文.docx
    2025年主管商务部门党组书记在理论学习中心组会上研讨发言文稿.docx
    2025年国企党委关于干部职工思想政治工作情况的报告范文.docx
    在机关单位作风建设学习教育突出问题专项整治工作部署会议上的讲话范文.docx
    医院领导2025年党风廉政建设推进会上的讲话范文.docx
    2025年关于开展“以案促改”工作实施方案供参考.docx
    在2025年安全生产专项整治暨化工行业风险防控部署会上的讲话范文.docx
    领导干部在“十五五”发展规划编制启动会上的讲话文稿.docx
    2025年书记在慰问老干部暨情况通报会上的主持讲话提纲范文.docx
    2025年作风建设实施方案文稿.docx
    在2025年DeepSeek政务应用培训会上的讲话范文.docx
    2025年领导在DeepSeek政务应用培训会上的讲话参考范文.docx
    2025年国企党委关于干部职工思想政治工作情况的报告文稿.docx
    在青年干部培养工作座谈会上的讲话范文.docx
    卖家[上传人]:仙人指路
    资质:实名认证
    相关文档
    正为您匹配相似的精品文档