EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2006/11/26 16:14:35

3

关于投票

一声感叹!Linuxreiserfs文件系统即将陨落?

 Linux著名的高性能文件系统reiserfs向来是Linux fans眼中的挚爱,但是reiserfs即将陨落。

前段时间已经风传Linux Kernel拒绝将reiserfs4加入kernel source,随后SuSE,这个reiserfs最大的赞助商也准备在下一个版本的SuSE Linux中不再将reiserfs作为默认文件系统。

如果说由于政治原因导致reiserfs文件系统被排斥在Linux主流之外的话,Hans Reiser则亲手埋葬了自己和自己的作品:

最近Hans Reiser因为谋杀妻子的罪名被警方逮捕,而且警方拒绝辩护律师,估计证据已经确凿。Hans同学就算不是死刑,估计也得在监狱里面度过余生了。Reiserfs文件系统,即将陨落。

相关链接:http://blog.80s.net.cn/article.asp?id=357

                    http://www.idiom.com/~beverly/hans_resume.html
                    http://www.linuxeden.com/doc/24610.html

 

系统分类: 嵌入式  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(2314) | 回复(0)

发表于 2006/11/7 9:39:16

14

关于投票

linux下的X11图形系统介绍之Gtk图形库

注:如转载请注明本Blog的链接http://www.ednchina.com/blog/zxq914

 

GtkGIMP 工具箱,GIMP ToolKit)是一个功能强大而且快捷的开放源码图形库,用于 UNIX/Linux上的 XWindow系统,程序员可以用来创建按钮、菜单及其它图形对象,Gtk最初是GIMP的专用开发库,后来发展为Linux下开发基于X Window图形界面应用程序的主流开发工具之一,其本身就是自由软件,GNU工程的一部分,因此可以用Gtk+开发开放源码软件、自由软件,甚至商业的、非自由的软件,Gtk图形库使用一系列称为“构件(Widgets)”的对象来创建应用程序的图形用户接口。它提供了窗口、标签、命令按钮、开关按钮、检查按钮、无线按钮、框架、列表框、组合框、树、列表视图、笔记本、进度条等很多构件。使用C语言就可以用它们来构造丰富的用户界面程序。通常情况下,用Gtk代表软件包和共享库,用Gtk+代表Gtk的图形构件集,现在的Gtk+,相对以前的Gtk来说包含了更多的标准回调机制来替代信号机制,符号‘+’就是用于区别原先的版本和新版本。Linux下使用Gtk开发GUI程序用C语言完成,发展到后来可以使用绑定了C++语言的Gtkmm工具来开发GUI程序,有关Gtkmm的详细使用可参见相关书籍,此处不做详细的介绍。

Gtk是高层的库函数,它基本不使用Xlib库函数,而是使用更低层的函数库GDKGlib。这种结构使得Gtk可以更方便地移植到其它系统上,或使用与X Windows 系统无关的图形库。下图Gtk库函数的结构图:

Glib是一些与界面无关的函数构成的基本库,它定义了诸如基本类型、内存操作、定时器字符串操作等系列的函数以及一些宏定义,gdk是底层的图形函数库,它包含Gtk所使用的基本图形操作函数,比如基本图元、颜色、事件处理、图像和位图、窗口、拖放函数等。

Gtk具有以下的一些特性:

1.     动态类型系统。

2.     C语言编写的对象系统,可实现继承、类型检验,以及信号/回调函数的基础结构。

3.     类型和对象系统不是特别针对GUI的。

4.     GtkWidget对象使用对象系统,它定义了Gtk+的图形组件的使用接口。

5.     大量的Gtk Widget子类(构件)

要想用Gtk编程,首先要保证系统中已经安装了GtkGnome库。编译安装Gtk的过程很简单:

1.下载(ftp://ftp.gtk.orgGtk安装包文件到指定目录,并解压,生成源码目录。

2.进入源码目录,执行如下的操作。

./configure

该命令会生成编译时所需的makefile文件

make

使用make命令来建立库。

make install

使用make install命令来安装库。

Gnome的最新版本可以从http://www.gnome.org下载。取得新版本软件后,解压缩和安装的方法与Gtk类似。安装好Gtk及相关组件之后,就可以使用Gtk来设计用户界面程序了。一般来讲,编写Gtk程序主要有以下几个过程:

1.       初始化

2.       创建主窗口

3.       创建并加入子窗口

4.       设置组件回调

5.       显示窗口

6.       进入事件循环

 

系统分类: 嵌入式  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(2278) | 回复(0)

发表于 2006/11/7 9:26:49

15

关于投票

linux下的X11图形系统介绍之Tiny-x

注:如转载请注明本Blog的链接http://www.ednchina.com/blog/zxq914

 

Tiny-X是标准X-windows系统的简化版,去掉了许多对设备的检测过程,无需设置显示卡Driver,很容易对各种不同硬件进行移植。Tiny-X专为嵌入式开发,适合用作嵌入式linuxGUI系统。Tiny-X图形系统是由SuSE赞助的,开发人员是XFree86的核心成员Keith Packard。目前TinyXXFree86自带的编译模式之一,只要通过修改编译选项,就能编译生成Tiny-X

作为XFree86 4.0ftp://ftp.xfree86.org/pub/XFree86/4.0)的子集,性能和稳定性都非常好,适合内存资源比较少的系统的X系统,它是以 XFree86为基准,所以构置或设定的方式与 xfree86 是相同的。一般的X Server都太过于庞大,因此Keith Packard就以XFree86为基础,精简了不少东西而成Tiny X Server,它的体积可以小到几百Kb而已,非常适合应用于嵌入式环境。TinyXX Window系统一样采用标准的Client/Server体系结构,如下图所示:

点击看大图

1.X服务程序也称作显示管理器,是控制实际显示设备和输入设备的程序。它响应X客户程序的请求,直接与图形设备通信,负责打开和关闭窗口,控制字体和颜色等底层的具体操作。每一个显示设备只有一个惟一的X服务程序。

2.X客户程序是使用系统窗口功能的一些应用程序,无法直接影响窗口或显示,它们只能请求X服务程序,并通过X服务程序提供的服务在指定的窗口中完成特定的操作。

在嵌入式系统GUI开发中使用Tiny-X开发上层应用是比较方便的,在实际使用中, Tiny-X底层要用到的库之间的关系如下图所示:

l         Glib类库:Glib类库包括一些基本的数据类型和C语言需要的一些功能,与GUI无关,封装了一些常用的函数,如字符串相关函数、时间函数等。可以被GDK类库、GTK类库或直接被应用程序调用。

l         GDK类库:建立在Xlib上的针对图形图像类封装的底层图形库。可以被GTK类库或应用程序直接调用。

l         GTK类库:建立在XlibGDK之上的面向对象的类库。GTK提供了完善控件集,应用程序主要也是基于GTK类库来编写。

 

系统分类: 嵌入式  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(6116) | 回复(0)

发表于 2006/11/7 9:21:36

15

关于投票

linux下的X11图形系统介绍之XWindows

注:如转载请注明本Blog的链接http://www.ednchina.com/blog/zxq914

 

X Windows 系统1984年在麻省理工学院(MIT)电脑科学研究室开始开发的,当时Bob Scheifler正在发展分散式系统(distributed system),同一时间 DEC公司的 Jim Gettys 正在麻省理工学院做 Athena 计划的一部分。两个计划都需要一个相同的东西——一套在UNIX机器上运行优良的视窗系统。因此合作关系开始展开,他们从斯坦福(Stanford)大学得到了一套叫做W的实验性视窗系统。因为是根据W视窗系统的基础开始发展的,当发展到了足以和原先系统有明显区别时,他们把这个新系统叫做X。

X Windows 系统也是一个基于客户/服务器(Client/Server)结构的窗口系统,在诞生之初是UNIX系统上使用的图形用户界面,没有PC版,它允许在任一台UNIX主机(客户端)上运行程序,而在基于X的终端(服务器)上显示出来。X Windows 系统系统是目前最常用的免费图形系统,配置在大多数的UNIX系统、DECVAX/VMS操作系统以及Linux系统中,在后期又有了XFree86开发计划,其主要目的就是提供一个PC版的X窗口,主要移植到Intelx86体系架构的处理器上,所以也称作是XFree86计划,它虽然不是以GPL授权,但是也可以自由拷贝以及传播,也可以使用在商业用途上。

X Windows 系统版本11,也就是X11图形系统,产生与1987年,X11图形系统是X Windows 系统发展的一个重要里程碑.X11是一个对网络透明的客户/服务器架构的图形显示系统,它支持应用程序在你的屏幕上绘制象素,线条,文字,图象等等。X11还包括一些其它的辅助的函数库,使得它可以容易地绘制用户界面,例如:按钮,文本输入区等等,其组成主要有三部分:客户端;服务器和X协议。

严格地说,X Windows 系统并不是一个软件,而是一个协议(protocal),这个协议定义一个系统成品所必需具备的功能(就如同 TCP/IP, DECnetIBMSNA,这些也都是协议,定义软件所应具备的功能)。任何系统能满足此协议及符合X协会其他的规范,便可称为X。

X11Unix的图形系统标准(X Window System)。Linux、各种 BSD版本和多数的商用Unix都采用它。Linux下的桌面图形系统已经发展的相当完善了,其GUI由窗口系统,窗口管理器,工具包和风格等几个部分组成,目前的桌面环境主要有两种:

1.KDE(K Desktop Environment)

   2.GnomeGNU Network Object Model Environment)。

二者的界面非常相似。KDEQt作为其底层库,而Gnome采用的是GTK库,Qt最初并不遵从GPL协议,而GTK是完全遵守GPL宣言的,这也使得Gnome现在已经成为大多数Linux发行版本的首选,有关GTKQt会在后面的部分有详细的介绍。

系统分类: 嵌入式  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(3739) | 回复(2)

发表于 2006/11/4 15:33:38

17

关于投票

Linux下源码的编译安装方法

Linux如何编译安装源码包软件--(转)

一、什么是源码包软件;

顾名思义,源码包就是源代码的可见的软件包,基于LinuxBSD系统的软件最常见;在国内源可见的软件几乎绝迹;大多开源软件都是国外出品;在国内较为出名的开源软件有fcitx;lumaqq;Lumaqqscim等;

但软件的源代码可见并不等于软件是开源的,我们还要以软件的许可为准;比如有些软件是源码可见的,但他约定用户只能按他约定的内容来修改;比如vbb论坛程序;所以一个软件是否是开源软件,得具备两个条件;一是源代码可见;二是要有宽松的许可证书,比如GPL证书等;

GNU LinuxBSD社区中,开发人员在放出软件的二进制软件包的同时,也会为我们提供源代码软件包;

二、源代码有何用?

一个软件的如果有源码,是任何人都能看到他是怎么开发而来的,就像一个瓶子,比如瓶子制作的模具是什么;需要什么材料;具体的用途以及瓶子的详细说明书等等。软件的开放源码就是类似,开发者在给我们软件的同时,也会告诉我们软件是怎么开发出来的;只要我们的水平足够的高,所有的代码都在那里,我们就可以修改和定制软件,以适合我们的需要;如果Windows开放源代码,并以GPL发布,一样是有人能造出来N多的Windows发行版;遗憾的是Windows并不是开源系统;

所以软件的源代码的用处无非是以下两点;

1
、软件根据用户的需要加以定制;
2
、二次开发;注:要根据软件的许可证书约定为准,开发者许可二次开发才行;

三、怎样安装以源码包打包的软件;

1
、源码包的打包格式;

源代码一般以file.tar.gz file.tar.bz2file.src.rpm 打包;file.tar.gzfile.tar.bz2格式的解包命令如下;

[root@localhost beinan]# tar jxvf file.tar.bz2
[root@localhost beinan]# tar zxvf file.tar.gz


至于file.src.rpm 的用法,请参见:file.src.rpm 使用方法的简介》

2
、如何编译安装源码包;(大多数)

1
)解开软件包查看帮助文档;

我们解开一个包后,进入解压包,一般都能发现README(或reame)INSTALL( install);或doc(或DOC)目录;看名字就知道个差不多;

比如我们下载一个比较新的fcitx 的软件包,比如是 fcitx-3.2-050827.tar.bz2

我们在解开这个软件包会会发现如下的文件;

[root@localhost fcitx]# tar jxvf fcitx-3.2-050827.tar.bz2
[root@localhost fcitx]#cd fcitx
[root@localhost fcitx]# ls
aclocal.m4 config.guess configure debian INSTALL Makefile.in src xpm
AUTHORS config.h.in configure.in depcomp install-sh missing THANKS
autogen.sh config.rpath COPYING doc lib mkinstalldirs TODO
ChangeLog config.sub data fcitx.spec.in Makefile.am README tools

所以我们就可以看fcitxINSTALL doc目录的安装文档了;里面都告诉我们如何安装;

有时安装文档也会在开发者的主页上有详细的说明,及常见问题的处理等;比如 LumaQQ

2
)编译安装软件的条件;

首先我们在Linux系统中至少得把开发工具安装上,比如 gcc ;perl;python;glibc;gtk;make ;automake 等开发工具或基础包;还要安装一些相应的开发包,一般是文件名包括dev的,比如kernel-devel;还有一些开发库,比如以lib开头的;如果您在编译软件时,有时提示缺少什么东西之类的,大多少的是这些开发工具和开发库等;从光盘中找出安装就是了;有时光盘没有提供,请用google搜索相应的软件包,有时可能也会用到源码包编译安装所依赖的包;

有时本来系统中已经安装了所依赖的包,但系统提示找不到应该怎么办?这时需要我们设置一下PKG_CONFIG_PATH的环境变量就行了;

#export PKG_CONFIG_PATH=/usr/lib/pkgconfig

#export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
然后我们再来运行编译的./configure ;make ;make install ,尝试着来吧;

java开发的工具开发的程序,要用到 jre或者jdk jdk已经包括jre了,所以如果我们只是要求有一个java程序运行的环境,只需要安装jre就行了;安装好jre,配置一下java的环境变量就可以用了。如果是图形界面的程序,点点鼠标就OK了;

perl 开发的程序,是需要perl环境的,所以必须得把perl的包安装上,python 也同理;

3
)编译安装软件的方法;

大多以tar.gz tar.bz2打包软件,大多是通过 ./configure ;make ;make install 来安装的;有的软件是直接make;make install

我们可以通过./configure --help 来查看配置软件的功能;大多软件是提供./configure 配置软件的功能的;少数的也没有,如果没有的就不用./configure ;直接make;make install 就行了;

./configure 比较重要的一个参数是 --prefix ,用--prefix 参数,我们可以指定软件安装目录;当我们不需要这个软件时,直接删除软件的目录就行了;

比如我们可以指定fcitx 安装到 /opt/fcitx 目录中;

[root@localhost fcitx]#./configure --prefix=/opt/fcitx

如果我们不需要fcitx 时,可以直接删除 /opt/fcitx 目录;

所以我们举这个例子中,fcitx如果定制安装到 /opt/fcitx目录中,完整的安装方法应该是:

[root@localhost fcitx]# tar jxvf fcitx-3.2-050827.tar.bz2
[root@localhost fcitx]#cd fcitx
[root@localhost fcitx]# ./configure --prefix=/opt/fcitx
[root@localhost fcitx]# make
[root@localhost fcitx]# make install

调用fcitx ,应该是

[beinan@localhost ~]#/opt/fcitx/bin/fcitx

如果您想要让fcitx 只要执行fcitx ,就能调用,请配置环境变量,或者在/usr/bin 中做一个fcitx 的链接;

[root@localhost beinan]# ln -s /opt/fcitx/bin/fcitx /usr/bin/fcitx

一般的情况下都有说,但大多软件没有提供源码包的卸载方法;我们可以找到软件的安装点删除。主要看你把它安装在哪了。

设置环境变量PATH,请参见:《在Fedora Core 中,有些常用命令怎么没有?解决办法设置PATH

所以您的PATH可以设置成这样的;

export PATH=".:/bin:/usr/bin:/usr/local/bin:/usr/sbin:/usr/X11R6/bin:/sbin:/opt/fcitx/bin"

当然这只是举个例子,fcitx 可以进入桌面自动运行的,请参看 http://www.fcitx.org 官方站上的安装说明;举个例子只是让大家好理解一点;

再举一个例子,比如我想安装mlterm ;并指定安装目录为/opt/mlterm中; http://mlterm.sourceforge.net

#./configure --prefix=/opt/mlterm
#make
#make install


把源码包安装的软件,都指定安装在 /opt目录中,这样不就知道了软件安装在哪里了;也方便卸载;

3.
其它类型软件;

1
)基于perl python 的程序的安装;

一般情况下,用 #perl file.pl安装;比如:VMware Linux版本的安装;

[root@localhost vmware-distrib]# perl vmware-install.pl

基于python 开发,也得用 python file.py 来安装

一般软件包都有READMEINSTALL 或者 DOC 文档,看文档安装;

2
)有些安装程序是脚本型的调用;要用 #sh 文件名

比如NVdia驱动的安装就是这样的;

[beinan@localhost ~]# sh NFORCE-Linux-x86-1.0-0306-pkg1.run

当然也能通过 chmod 755 NFORCE-Linux-x86-1.0-0306-pkg1.run ,然后 ./NFORCE-Linux-x86-1.0-0306-pkg1.run 来安装;

也有一些是以file.bin 文件

[beinan@localhost ~]# chmod 755 file.bin
[beinan@localhost ~]# ./file.bin

大抵如此。。。。。。。。

后记: 源码包及特殊格式的软件安装就写这么多,写的再多也是写不完。我们主要还是以软件的安装文档为准;安装软件时,如果只是简单的应用,如果有rpm包,尽可能的用rpm包;主要是方便和易于管理;

附录:

安装软件时,最好用各自发行版所提供的系统软件包管理工具,对于Fedora/Redhat 您可以参考如下文章;

0RPM 基础 RPM 的介绍和应用》

1Fedora 系统管理软件包工具 system-config-packages,方便的添加和移除系统安装盘提供的软件包,详情请看 Fedora 软件包管理器system-config-packages

2Redhat 系统管理软件包工具,新一点的系统应该是 redhat-config-packages ,用法和 Fedora 软件包管理器system-config-packages 一样;

3apt + synaptic 软件包在线安装、移除、升级工具; 用法:《用apt+synaptic 在线安装或升级Fedora core 4.0 软件包》
4
yum 软件包在线安装、升级、移除工具;用法:Fedora/Redhat 在线安装更新软件包,yum 篇》

5file.src.rpm 使用方法的简介》

6《如何编译安装源码包软件》

目前 aptyum 已经极为成熟了,建议我们安装软件时采用 apt或者yum ;如果安装系统盘提供的软件包,可以用 system-config-packages redhat-config-packages

 

系统分类: 嵌入式  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1059) | 回复(0)

发表于 2006/11/4 15:02:41

15

关于投票

xshell使用

xshel的操作界面如下图:

点击看大图

需要注意的是:需要在远程linux终端开启ssh服务。

 

系统分类: 嵌入式  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(3425) | 回复(0)

发表于 2006/10/31 15:06:26

18

关于投票

Gnu-Gcc指导书(E版)

很经典的E版Gcc语法指导书,适合入门!推荐给大家

rar

系统分类: 嵌入式  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1356) | 回复(1)

发表于 2006/10/20 13:51:06

22

关于投票

资料上传-Linux下图形用户接口(GUI)编程技术(III)

第三部分:

 rar

系统分类: 资源共享  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1200) | 回复(0)

发表于 2006/10/19 13:08:43

26

关于投票

linux下的串口通讯源程序--(测试版)

根据前面文章讲到的内容,为了说明问题,下面给出测试程序来理解linux下的串口操作流程,例程receive.c用来接收从串口发来的数据,而例程send.c用来发送数据到串口。二者成功建立串口连接后,串口接收端会收到串口发送端发来的字符串数据“Hellothis is a Serial Port test!”。

1.      receive.c程序清单:

/*******************************************************

*ilenamereceive.c

* DescriptionReceive data from Serial_Port

* Date

*******************************************************/

/*********************头文件定义***********************/

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <termios.h>

#include "math.h"

#define max_buffer_size   100   /*定义缓冲区最大宽度*/

/*********************************************************/

int fds;

int open_serial(int k)

{

  if(k==0)       /*串口选择*/

   {

     fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY);  /*读写方式打开串口*/

     perror("open /dev/ttyS0");

   }

  else

   {

     fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY);

     perror("open /dev/ttyS1");

   }

  if(fd == -1)  /*打开失败*/

   return -1;

  else

   return 0;

}

/********************************************************************/

int main()

{

char  hd[max_buffer_size],*rbuf; /*定义接收缓冲区*/

int flag_close, retv,i,ncount="0";

struct termios opt;

int realdata="0";

/*******************************************************************/

open_serial(0);    /*打开串口1*/

/*******************************************************************/

tcgetattr(fd,&opt);

cfmakeraw(&opt);

/*****************************************************************/

cfsetispeed(&opt,B9600); /*波特率设置为9600bps*/

cfsetospeed(&opt,B9600);

/*******************************************************************/

tcsetattr(fd,TCSANOW,&opt);

rbuf="hd"; /*数据保存*/

printf("ready for receiving data...\n");

retv="read"(fd,rbuf,1);   /*接收数据*/

if(retv==-1)

{

 perror("read"); /*读状态标志判断*/

}

/*************************开始接收数据******************************/

while(*rbuf!='\n')       /*判断数据是否接收完毕*/

 {

      ncount+=1;

      rbuf++;

      retv="read"(fd,rbuf,1);

      if(retv==-1)

      {

perror("read");

    }

 }

/*******************************************************************/

printf("The data received is:\n");  /*输出接收到的数据*/

for(i="0";i<ncount;i++)

{

     printf("%c",hd[i]);

}

printf("\n");

flag_close =close(fd);

if(flag_close ==-1)   /*判断是否成功关闭文件*/

printf(“Close the Device failur\n”);

return 0;

}

/****************************结束***********************************/

2.send.c程序清单

/*******************************************************

* File Name     send.c

* Description  send data to serial_Port

* Date         

*******************************************************/

/******************头文件定义******************/

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <termios.h>

#define max_buffer_size   100   /*定义缓冲区最大宽度*/

/*******************************************/

int fd;  /*定义设备文件描述符*/

int flag_close

int open_serial(int k)

{

  if(k==0)       /*串口选择*/

   {

     fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY);  /*读写方式打开串口*/

     perror("open /dev/ttyS0");

   }

  else

   {

     fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY);

     perror("open /dev/ttyS1");

   }

  if(fd == -1)  /*打开失败*/

   return -1;

  else

   return 0;

}

/********************************************************************/

 

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

{

 char sbuf[]={"Hello,this is a Serial_Port test!\n"};/*待发送的内容,以\n为结束标志*/

 int sfd,retv,i;

 struct termios option;

 int length="sizeof"(sbuf);/*发送缓冲区数据宽度*/

/*******************************************************************/

open_serial(0);    /*打开串口1*/

/*******************************************************************/

printf("ready for sending data...\n"); /*准备开始发送数据*/

tcgetattr(fd,&option);

cfmakeraw(&option);

/*****************************************************************/

cfsetispeed(&opt,B9600); /*波特率设置为9600bps*/

cfsetospeed(&opt,B9600);

/*******************************************************************/

tcsetattr(fd,TCSANOW,&option);

retv="write"(fd,sbuf,length);  /*接收数据*/

if(retv==-1)

{

 perror("write");

}

printf("the number of char sent is %d\n",retv);

 

flag_close =close(fd);

if(flag_close ==-1)   /*判断是否成功关闭文件*/

printf(“Close the Device failur\n”);

 

return 0;

}

/****************************结束***********************************/

分别将上面的俩个程序编译之后就可以运行了,如果是在两个不同的平台上运行,比如,在开发板上运行数据发送程序writewrite.c编译后得到),在宿主机上运行结收数据程序readread.c编译得到),采用串口线将二者正确连接之后,就可以运行来看实际的效果了:

首先在宿主机端运行数据接收程序receive

[zhang@localhost]# ./receive

[zhang@localhost]#open /dev/ttyS0 Success

ready for receiving data...

The data received is

   Hello,this is a Serial_Port test!

[zhang@localhost]#

在接收端运行完程序之后再到发送端运行数据发送程序send

#./send

ready for sending data...

the number of char sent is 35

#

运行完发送程序之后就可以在接收端看到接收的数据了。

也可以在一台PC机上来运行这两个程序,这时需要将串口线的23脚短路连接即可(自发自收),实际运行的步骤与上面相同。

系统分类: ARM  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(12210) | 回复(4)

发表于 2006/10/19 9:34:43

26

关于投票

详解linux下的串口通讯开发

 

串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。串口通讯指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一。

Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口设备。在linux系统下面,每一个串口设备都有设备文件与其关联,设备文件位于系统的/dev目录下面。如linux下的/ttyS0/ttyS1分别表示的是串口1和串口2。下面来详细介绍linux下是如何使用串口的:

  

1.      串口操作需要用到的头文件

#include     <stdio.h>      /*标准输入输出定义*/

#include     <stdlib.h>     /*标准函数库定义*/

#include     <unistd.h>     /*Unix 标准函数定义*/

#include     <sys/types.h> 

#include     <sys/stat.h>  

#include     <fcntl.h>      /*文件控制定义*/

#include     <termios.h>    /*POSIX 终端控制定义*/

#include     <errno.h>      /*错误号定义*/

#include   <string.h>       /*字符串功能函数*/

2.      串口通讯波特率设置

波特率的设置定义在<asm/termbits.h>,其包含在头文件<termios.h>里。

常用的波特率常数如下:

B0-------à0                     B1800-------à1800

B50-----à50                    B2400------à2400

B75-----à75                    B4800------à4800

B110----à110                 B9600------à9600

B134----à134.5              B19200-----à19200

B200----à200                 B38400------à38400

B300----à300                 B57600------à57600

B600----à600                 B76800------à76800

B1200---à1200              B115200-----à115200

假定程序中想要设置通讯的波特率,使用cfsetispeed( )cfsetospeed( )函数来操作,获取波特率信息是通过cfgetispeed()和cfgetospeed()函数来完成的。比如可以这样来指定串口通讯的波特率:

#include <stdio.h>    //头文件定义

........

........

.......

struct termios opt           /*定义指向termios 结构类型的指针opt*/

 

/***************以下设置通讯波特率****************/

cfsetispeed(&optB9600 ) /*指定输入波特率,9600bps*/

cfsetospeed(&optB9600)/*指定输出波特率,9600bps*/

/************************************************/

.........

..........

一般来说,输入、输出的波特率应该是一致的。

3.      串口属性配置

在程序中,很容易配置串口的属性,这些属性定义在结构体struct termios中。为在程序中使用该结构体,需要包含文件<termbits.h>,该头文件定义了结构体struct termios。该结构体定义如下:

#define NCCS 19

struct termios {

             tcflag_t c_iflag;               /* 输入参数 */

             tcflag_t c_oflag;               /* 输出参数 */

             tcflag_t c_cflag;               /* 控制参数*/

             tcflag_t c_ispeed;              /* 输入波特率 */

tcflag_t c_ospeed;              /* 输出波特率 */

             cc_t c_line;                   /* 线控制 */

             cc_t c_cc[NCCS];              /* 控制字符*/

};

其中成员c_linePOSIX(Portable Operating System Interface for UNIX)系统中不使用。对于支持POSIX终端接口的系统中,对于端口属性的设置和获取要用到两个重要的函数是:

1.int tcsetattrint fdint opt_DE*ptr

该函数用来设置终端控制属性,其参数说明如下:

l        fd:待操作的文件描述符

l        opt_DE:选项值,有三个选项以供选择:

TCSANOW  不等数据传输完毕就立即改变属性

TCSADRAIN:等待所有数据传输结束才改变属性

TCSAFLUSH:清空输入输出缓冲区才改变属性

l        *ptr指向termios结构的指针

函数返回值:成功返回0,失败返回-1

2.int tcgetattrint fd*ptr

该函数用来获取终端控制属性,它把串口的默认设置赋给了termios数据数据结构,其参数说明如下:

l     fd:待操作的文件描述符

l        *ptr指向termios结构的指针

函数返回值:成功返回0,失败返回-1

4.      打开串口

在前面已经提到linux下的串口访问是以设备文件形式进行的,所以打开串口也即是打开文件的操作。函数原型可以如下所示:

int open(“DE_name”,int open_Status

参数说明:

1.DE_name:要打开的设备文件名

比如要打开串口1,即为/dev/ttyS0

2.open_Status:文件打开方式,可采用下面的文件打开模式:

l          O_RDONLY:以只读方式打开文件

l          O_WRONLY:以只写方式打开文件

l          O_RDWR:以读写方式打开文件

l          O_APPEND:写入数据时添加到文件末尾

l          O_CREATE:如果文件不存在则产生该文件,使用该标志需要设置访问权限位mode_t

l          O_EXCL:指定该标志,并且指定了O_CREATE标志,如果打开的文件存在则会产生一个错误

l          O_TRUNC:如果文件存在并且成功以写或者只写方式打开,则清除文件所有内容,使得文件长度变为0

l          O_NOCTTY:如果打开的是一个终端设备,这个程序不会成为对应这个端口的控制终端,如果没有该标志,任何一个输入,例如键盘中止信号等,都将影响进程。

l          O_NONBLOCK:该标志与早期使用的O_NDELAY标志作用差不多。程序不关心DCD信号线的状态,如果指定该标志,进程将一直在休眠状态,直到DCD信号线为0

函数返回值:

成功返回文件描述符,如果失败返回-1

例如假定以可读写方式打开/dev/ttyS0设备,就可以这样操作:

#include<stdio.h>    //头文件包含

......

......

int fd; /* 文件描述符 */

fd = open("/dev/ttyS0", O_RDWR | 0_NOCTTY)  /*以读写方式打开设备*/

if(fd == -1)

perror("Can not open Serial_Port 1\n")/*打开失败时的错误提示*/

........

........

 

5.      串口读操作(接收端)

open函数打开设备文件,函数返回一个文件描述符(file descriptors,fd),通过文件描述符来访问文件。读串口操作是通过read函数来完成的。函数原型如下:

int read(int fd, *buffer,length)

参数说明:

1.int fd:文件描述符

2.*buffer:数据缓冲区

3.length:要读取的字节数

函数返回值:

读操作成功读取返回读取的字节数,失败则返回-1

6.      串口写操作(发送端)

写串口操作是通过write函数来完成的。函数原型如下:

write(int fd, *buffer,length);

参数说明:

1.fd:文件描述符

2.*buffer:存储写入数据的数据缓冲区

3.length:写入缓冲去的数据字节数

函数返回值:

成功返回写入数据的字节数,该值通常等于length,如果写入失败返回-1

例如:向终端设备发送初始化命令

#include<stdio.h>    //头文件包含

......

......

 

int n

sbuf[]={Hellothis is a Serial_Port test\n }//待发送数据

int len_send="sizeof"sbuf);//发送缓冲区字节数定义

n = write(fd,sbuf,len_send); //写缓冲区

if(n == -1)

{

printf("Wirte sbuf error.\n");

}

......

......

7.      关闭串口

对设备文件的操作与对普通文件的操作一样,打开操作之后还需要关闭,关闭串口用函数close( )来操作,函数原型为:

int close(int fd);

参数说明:

fd:文件描述符

函数返回值:

成功返回0,失败返回-1

在后面的文章我会提供一个串行通讯的测试程序,供大家参考!

系统分类: ARM  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(4486) | 回复(1)

发表于 2006/10/19 9:19:55

23

关于投票

资料上传-Linux下图形用户接口(GUI)编程技术(II)

第二部分的上传:

rar

系统分类: 资源共享  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1217) | 回复(0)

发表于 2006/10/18 15:41:24

23

关于投票

资料上传-Linux下图形用户接口(GUI)编程技术(I)

GTK的开发教程:

                                        第一部分:

rar

系统分类: 资源共享  |  用户分类: 嵌入式linux  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1019) | 回复(2)

Total , Page /