[err:数据源标签PE.DataSource id="cone" datasource="文章_内容页" itemid="4468" xslt="true" /返回数据错,原因:分析 EntityName 时出错。 行 4,位置 172。,源码:446814基于QTE的嵌入式Linux下可视化打印设计基于QTE的嵌入式Linux下可视化打印设计 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文主要介绍了利用QTE在嵌入式Linux下通过<a class="insidelink" href="http://home.cepark.com/space.php?do=mtag&tagid=108" target="_blank">USB</a>接口开发图像采集和打印,详细给出了在Samsung公司ARM9处理器S3C2410开发板上硬件、软件的设计和构建过程。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 并对如何控制摄像头和处理打印机信息,以及图形界面的编写、开发和移植进行了具体讨论。 <br /><b></b></p> <p><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1</b><b>引言</b></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 随着计算机与信息技术迅猛发展,嵌入式系统产品已经成为现在市场的热点。而在嵌入式操作系统方面,Linux同目前广泛的嵌入式系统如Vxwork、UC/OS、Palm OS和Windows CE等相比,具有可移植性好、网络性强、编译工具多、开放源码等优点,逐渐成为嵌入式系统的研究热点和广泛使用的平台。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Qt/Embedded 是著名的Qt 库开发商 Trolltech公司开发的面向嵌入式系统的Qt 版本,开发人员多为K D E 项目的核心开发人员。许多基于Qt 的X Window 程序可以非常方便地移植到Qt/Embedded 上,延续了在X 上的强大功能,在底层摒弃了X lib而采用了framebuffer 作为底层图形接口。Qt/Embedded 类库完全采用C++ 封装。丰富的控件资源和良好的可移植性是Qt/Embedded的优势,使用X 下的开发工具Qt Designer可以直接开发基于Qt/Embedded 的UI(用户操作接口)界面。本文便是在嵌入式Linux系统的s3c2410平台上,主要是基于QTE而通过控制<a class="insidelink" href="http://home.cepark.com/space.php?do=mtag&tagid=108" target="_blank">USB</a>设备,实现可视化图像图片处理和打印。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>2 可视化打印的硬件系统</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 硬件结构原理图如图1所示:</p> <p align=center><img alt="" src="/UploadFiles/Article/2008/7/200807102301201546.gif" border=0 /></p> <p align=center>图1硬件结构原理图&nbsp; </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本系统采用的嵌入式微处理器是Samsung公司的S3C2410是一种集成了ARM公司ARM920T处理器核的16/32位微控制器。Flash存储器采用Samsung公司的K9F1208U0M Nand Flash存储器,存储容量为64MB;SDRAM存储器采用HY57V561620CT,大小为32MB;USB集线器芯片采用ALCOR MICRO公司AU9254A21型号的USB集线器芯片;触摸屏采用Sharp公司的3.5寸LCD液晶屏, 320×240的分辨率。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>3 可视化打印的具体实现</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>3.1 可视化打印的图像采集实现</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在可视化视频采集QTE编程中,需要对内存进行读写,过程如下:首先打开视频设备,摄像头在系统中对应的设备文件为/dev/video0,采用系统调用函数video_fd =open("/dev/ov51l/video0", O_RDWR),video_fd是设备打开后返回的文件描述符(打开错误返回-1),以后的系统调用函数就可使用它来对设备文件进行操作了。利用ioctl (video_fd, VIDIOCGMBUF, &amp;vid_buf)函数读取有关摄像头的信息,该函数成功返回后,这些信息从内核空间拷贝到用户程序空间vid_buf各成员分量中。在这里我们采用mmap()系统调用使得进程之间通过映射同一文件实现共享内存,各进程可以像访问普通内存一样对文件进行访问,访问时只需要使用指针而不用调用文件操作函数。最后通过使用QTE的时间函数QTimerEvent()和点操作函数QPoint()来进行实时显示,相关代码如下:<b></b></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Void Video::timerEvent( QTimerEvent * ){</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . . . . . . . . . .</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int X_off;//定义屏幕上的横坐标</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int Y_off;//定义屏幕上的纵坐标</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FrameBuffer *fb;Video *v;QFrame frame;//定义需要的参数</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QPoint p = frame-&gt;mapToGlobal(QPoint(X_off, Y_off));//找到屏幕的相应点</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char *Map = v-&gt;Getmap24(width, height); //获得视频信息</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;fb-&gt;Drawmap(Map, p.x(), p.y(), width, height);//视频显示</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . . . . . . . . . .}</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <table cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td> <div v:shape="_x0000_s1060"> <p>打印请求</p></div></td></tr></tbody></table>这样在我们的LCD显示器的相应位置便可以看到摄像头的显示了,如果想要对图片进行存储,同样地可直接对内存数据进行读取。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>3.2 可视化的打印实现&nbsp;&nbsp; </strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先给出控制打印机的流程图,如图2所示框图这里我们使用的是HP Deskjet系列喷墨打印机,此打印机驱动程序具有良好的通用性和可移植性,源代码可从惠普公司官方网站获得,我们选用的是GNU Ghostscript7.05版本,与打印相关的具体实现可参见我们前期的工作<sup>[1]</sup>。</p> <p> <table cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td> <div v:shape="_x0000_s1051"> <p><font size=1>判断文件格式</font></p></div></td></tr></tbody></table>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有了相应的打印机系统,下面需里主要解决的是用QTE控制并且传递打印的信息,即打印需要的参数,主要包括图片的宽,高,纸张大小,图片位置和名字。用QTE直接与外面进行传递比较困难,这里我们可采用环境变量的方式来进行信息传递。由于在上面我们已经获得了想要的图片,我们可以用QPixmap()这个类来获取图片的信息,用QDir()和QString()两个类来获得图片位置和名字,打印机的执行我们可以通过QTE中的系统执行程序来执行shell脚本来对打印机具体操作,相关代码如下:</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Void Widget::PictureAndPrint(){&nbsp;&nbsp;</p> <p align=center><img alt="" src="/UploadFiles/Article/2008/7/200807102301203602.gif" border=0 /></p> <p> <table cellSpacing=0 cellPadding=0 width="100%"> <tbody> <tr> <td> <div v:shape="_x0000_s1074"> <p align=center>图2打印任务管理程序流图<sup>[1]</sup></p> <p>&nbsp;</p></div></td></tr></tbody></table>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int w,h;//定义图片的长和高</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QDir dir;//定义文件位置&nbsp; </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QString string1;//保存文件位置</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QString string2;//定义文件名</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QPixmap Picture1=QPixmap(“图片位置”);//取图片</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w= Picture1.width();//获取宽度</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h= Picture1.height();//获取长度</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string1=dir.currentDirPath ();//获取图片地址</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string2=fn;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . . . . . . . </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char m11[8];//存放传送所需要的参数</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *can="W";</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setenv(can,m11,2);//把参数传给环境变量</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;. . . . . . . .</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; system("./print.sh");} //执行打印命令脚本</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 纸张的大小系统默认是A4,但可由用户直接在下面开发的图形界面里进行可视化调整,比如选择图片,对图片放大缩小,确定打印位置等等。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>3.3 可视化打印的QTE图形界面开发和移植</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面已经给出了底层可视化打印的构建,而这时就需要一个统一的可视化图形界面能够提供给用户方便,灵活,快捷的操作,起到对整个系统的统一调度和协调,使得对图片和打印的处理更加得心应手。这里为了方便开发,需要建立两套环境系统,一套在PC主机上,我们称之为宿主机,而另一套在开发板(S3C2410)上,称之为目标机。我们要做的就是先要在宿主机上开发出理想中的界面,再通过交叉编译生成在目标机上可执行的二进制代码,然后移植到目标机上进行调试,直到满意为止。而宿主机和目标机都已安装了Linux操作系统,在宿主机上建立开发环境这里不细谈,下面只说说图形界面的开发过程和移植。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们用qtdesigner设计器来设计完整的图形界面,qtdesigner是嵌入式公司Trolltech的Qt软件包的一个组成部分。如果用户使用的是KDE桌面,那么Qt已经自动安装上了,Qt Designer也很有可能已经被安装好。如果用户的系统没有安装,那么针对不同的版本,可以很方便地找到KDE Development Tools,并安装之。以Red Hat 9.0为例,用户可以从主选单→系统设置→添加/删除应用程序中选择KDE软件开发,即可完成Qt Designer的安装。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而详细的功能设计要在设计器所生成的.cpp文件里改,改的时候可以用Linux自身带的vi编辑器,也可以用Qt公司提供的自身带的编辑器。在设计过程中,我们的开发主要是用QWidget()类作为程序的主类,而用QApplication()类和、QPixmap()类和其它的类作为配套,进行图形的窗口、按钮和输入对话框设计,当然这些图形的选择可以直接在qtdesigner中拖拽,界面的颜色和图标也可以直接在里面加上,但是一些特殊功能的实现还是要在编辑其中改的。界面实现的主要功能是摄像头实时显示背景、对图片进行处理(包括放大、缩小等)、打印定位、图片选择和编辑,摄像头和打印机的配置等。最后,我们在做一个上层和底层的接口程序,要求这个接口程序能够把打印机和摄像头与上层的可视化界面连接起来,形成真正意义上的“无缝”连接。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 低版本只能生成.ui文件,我们还需要进行一下转化。用交叉编译好的工具uic来进行转化,具体的转化形式是(假设生成的文件为1.ui)uic –o 1.h 1.ui;uic –o 1.cpp –impl 1.h 1.ui;以上两句语句就会生成1.h和1.cpp两个文件,当1.cpp生成以后,就可以直接把上面已经写好的关于摄像头和打印机的程序直接加到里面去,书写规则与c++相同。现在还需要main.cpp和1.pro文件,main.cpp文件格式比较固定,例如:</p> <p>#include &lt;QApplication.h&gt; </p> <p>#include &lt;1.h&gt; </p> <p>//主程序开始</p> <p>int main(int argc, char *argv[]){</p> <p>QApplication app(argc, argv);</p> <p>Form1 w;//Form1是主程序的名字</p> <p>w.show();</p> <p>return app.exec();}</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后,我们用qmake的功能来自动生成.pro文件,命令如下:qmake –project,生成一个.pro文件,我们用vi编译器来修改它,加入CONFIG +=qt warn_on release,为的是让qt编译器认识这些文件。 接下来用qmake生成Makefile文件,最后再make一下,这样便在宿主机上生成了可执行文件。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后我们可以在pc主机进行试验和修改,再移植到目标机上。而只需要修改Makefile文件里的环境变量,让其进行交叉编译,生成arm下可执行文件,最后烧到板子上就可以了。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>4.结束语</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当前嵌入式产品正向着功能强的,操作简单,体积小等方向发展,随着功能的不断强大,提供一体化服务成为一种必然和需求。本文设计了通过S3C2410来实现基于QTE的嵌入式Linux的可视化打印设备,脱离了庞大的PC机的预览、控制、使得可视化打印更加方便、快捷,具有很高的灵活性,这样既获得了优越的性能又节省了开支,具有比较高的实用价值。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文作者创新点:可视化打印往往需要pc机的支持,这给用户造成了很大的不便。本文设计的可视化打印系统,使得可视化打印机完全脱离了pc机工作,且自带液晶显示屏,可以预览文本,处理图像图片,而且可外接各种存储设备,增大了存储容量,使打印机具有了独立性和便携性。而它可驱动不同型号的打印机,故能够节省了开支。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>参考文献:</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [1] 王乾,基于嵌入式Linux的打印控制系统的设计与实现,微计算机信息,2007,第1期<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [2] TROLLECH主页:<u>http://www.trolltech.com/<br /></u>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [3] Xteam(中国)软件技术有限公司 著,Qt程序设计,清华大学出版社,2005<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [4] Alessandro Rubini等著,魏永明等译,Linux设备驱动程序(第二版),中国电力出版2002 </p> <h5>本文来源:微计算机信息 &nbsp;&nbsp;&nbsp;&nbsp;作者:刘嘉欣</h5> 2008年07月10日 color: font-weight:normal ;font-style:normal; oncontextmenu='return false' ondragstart='return false' onselectstart ='return false' onselect='document.selection.empty()' oncopy='document.selection.empty()' onbeforecopy='return false' <script language="JavaScript" type="text/JavaScript" src="/Common/GetHits.aspx?id=4468"></script> 112] {PE.Field id="cone" fieldname="Title" /}-电子园
热门关键词:

{PE.Field id="cone" fieldname="TitleIntact" /}

    {PE.Field id="cone" fieldname="Content" charge="true" showerr="true" /}
    上一篇:没有了
    下一篇:没有了
声明:CEPARK已尽力确保内容的准确性,但因业务发展和技术服务的需要,有关内容可能会根据实际情况随时更新或者修改,恕不另行通知,不便之处敬请谅解!
    社区指南
    电子园-电子工程师自己的网络社区家园!
      个人空间
      迷你博客,轻松完成日志发布,管理相册;展示个性自我
      小组话题
      兴趣小组,热点话题,加入您感兴趣的话题讨论小组,一起交流吧
      轻松分享
      最新资讯,热门话题与好友一起分享信息,他评论感兴趣的话题
      真实交友
      实名认证,真实交友,还可以轻松快捷的了解好友动态
      好友邀请
      邀请您身边的好友,朋友,同事一起加入欢乐圈