Register

  • 点击获取
  •   

已有账号直接登录    

公告:

热门文章 2016迅游加速器破解版

时间:2016-4-3 作者:RainFly   分类: 软件分享   热度: 34039°  评论:126  
时间:2016-4-3   分类: 软件分享    热度:34039   评论:126

   迅游2016最新破解版是一款功能强大的游戏加速神器,你可以在这里对市面各类主流游戏进行修改,破解其收费限制,此版本2016最新版本,由吾爱破解,是您最佳的游戏加速器选择。

破解使用说明

以下操作不准错,否则破解不了,特别是第一步!

请先关杀毒再破解,破解成功后再开杀毒软件!

第一步:先解压成文件夹在桌面,必须是桌面!

(特别注意必须是9.16文件一点进去就有很多东西那种,而不是一点进去还有个9.16文件!) 第二步:运行:第一次运行请点我! 第三步:=运行xunyou (只打开,什么都别动) 第四步:管理员运行替补补丁,点破解,然后点完毕,关闭补丁(XP直接运行) 第五步:选好游戏,区,启动加速! 特别是第一步(内容看好)

每次都必须重解压,然后按上面操作!(重解压是第一次下载的压缩包)

小编点评

善用清理讯游注册表哦,其他失效版本都可能从新复活加速。

此处内容已隐藏

热门文章 如何接收国外的电话和短信验证

时间:2016-3-24 作者:RainFly   分类: 随手乱写   热度: 78339°  评论:5  
时间:2016-3-24   分类: 随手乱写    热度:78339   评论:5

     今天在申请试用国外一个免费空间时又遇到了电话短信验证的问题,之前部落也分享过不少的国外免费电话,例如:TextNow、Pinger等都非常不错的免费电话服务,以前在申请免费VPS主机和免费空间时我们成功用这些免费网络电话通过了国外空间商的短信和电话验证。 但是有些空间商为了保护自己的免费资源不被滥用,设置更加苛刻的电话短信验证条件,我们都知道像Virtual Phone Line、Voxox这样的电话服务只能算是网络电话,还不是传统意义上的手机电话,因此难免不出现一些验证失败的情况,再加上被人用的太多也容易导致被识别而通不过验证。 因此,本文就来为大家搜集整理一下国外的免费电话,因为不少的国外电话官网打开缓慢,大家在申请试用时一定要有足够的耐心。 国外免费电话搜集整理:接收国外验证短信、语音电话和拨打国际长途电话 一、Google Voice 和 Hangouts 环聊 1、Google Voice 官网:

官方网站:https://www.google.com/voice

环聊网站:https://hangouts.google.com/

2、Google Voice 由Google推出的VOIP服务,能够将个人所用的众多电话号码集中成为一个号码。对国内用户来说,Google Voice 提供了一个美国电话号码,这个号码可以用来接收国外的短信和语音电话,且可以转接到国内的手机上。

3、Hangouts 环聊是Google的即时通讯和视频聊天应用,在2013年5月15日期间的Google I/O发布,取代 Google Talk(Gtalk)。支持Android、iOS以及Chrome多平台,并在Gmail、Google+中集成环聊网页版。有传言Google Voice 将会被谷歌整合到Hangouts 环聊。

4、申请Google Voice有一个难点就是:Google Voice注册过程中要求一个美国电话号码用来接听验证语音。这个我们可以通过部落已经分享的的Groovytel 、Virtual Phone Line 来解决。 二、Pinger和Textfree 免费短信和电话 1、Pinger官网: 官方网站:http://www.pinger.com/ Textfree:http://www.pinger.com/tfw/ 2、TextFree是由Pinger开发的一款手机应用,允许用户通过真实的手机号码免费收发手机短信,拨打免费电话。Pinger提供了美国不同地方的电话号码,每个人可以免费申请一个,可以用来接收国外短信和语音信息。

3、Pinger提供的手机应用软件和在线网页版本,Pinger在线网页版本可以收取短信和语音,Pinger的TextFree应用在国外比较流行,国内上手难度不高,因此用TextFree去申请国外电话验证的人比较多。

三、 Textnow 免费接收国外短信电话 1、Textnow 官网: 官方网站:http://www.textnow.com/ 2、TextNow可以在美国和加拿大免费接收和发送短信,和Pinger一样有网页版,也有手机应用版本,可以在APP Store、Google Play和Windows Phone中下载TextNow应用。

3、TextNow注册比较简单,但是直接使用国内IP来注册账号会提示失败。注册成功后会自动分配一个美国电话号码给你了,这个号码就可以用来接收短信验证了。

四、Sonetel 欧洲国家美国免费电话 1、Sonetel 官网: 官方网站:http://sonetel.com/ 2、Sonetel是一家瑞典公司,数据中心在美国和欧洲总部。注册Sonetel可以获得一个免费的虚拟号码试用,无需验证,直接跳转到Sonetel帐户。你可以自己选择美国、欧洲国家等号码。 3、Sonetel目前提供了中文语言,有Android和苹果OS版本,进入到Sonetel后直接点击免费申请试用。

4、然后选择一个国家的号码,这里可以看到有美国、法国、德国、加拿大、中国、韩国等上百个国家的电话号码可供选择。

5、美国的电话可以精细到哪个一个州的,选择好了后点击下一步,确定。

6、接下来输入你的邮箱和手机号码注册,这个手机号码是用来转接Sonetel的电话的,所以一定要准确。

7、添加后,Sonetel会向你的手机号码打来语音电话,是自动播音的那种,会告诉你验证码。听不懂英语没有关系,Sonetel还会往你的手机发送短信验证码。

8、验证手机成功后,接下来就是填写Sonetel账号和密码了。

9、登录到Sonetel,就可以看到已经给出了一个免费试用的电话号码了,试用之后这个电话号码是付费的。

10、现在你可以下载安装运行手机客户端,并用你的Email地址和默认的密码sonetel登陆,然后就可以接收国外的电话,同时也可以拨打国外的电话,注意免费试用时长有一定的限制。

五、TextMe 免费短信和国外电话 1、TextMe 官网: 官方首页:https://go-text.me/ 2、TextMe 可适用于iPhone、iPad、iPod, Android智能手机、Android平板电脑和 Window的电话。TextMe应用本身和应用内通信是免费的,给非TextMe用户打电话则是收费服务,TextMe 会给 iPod 用户分配的电话号码也是美国本土号码。

3、TextMe支持给国外的用户发送短信,不过目前TextMe需要做任务来赚钱一定的积分,由于网络的原因TextMe在国内部分地区可能无法正常使用,只能是做为一个备选的应用工具。(点击放大)

六、国外免费电话使用小结 1、国外免费电话的APP应用非常多,但是可以免费获取一个美国或者国外其它国家的电话号码比较少,上面介绍了几款免费国外电话都提供了免费试用服务,打电话可能太贵,但是用来接收国外空间商的短信验证码还是可以的。

2、使用国外的免费电话应用时需要到Google Play下载安装,Google Play目前是无法访问的,有的即便是成功打开也要输入Google账号登录下载才能安装,真是够为难了。这里整理出了国外几个自动生成Google Play应用直链地址,帮助我们轻松下载安装App。 1、http://apkleecher.com/ 2、http://apk-dl.com/ 3、http://apps.evozi.com/apk-downloader/ 4、http://globalapk.com/

热门文章 毕业季我们该何去何从?

时间:2016-3-23 作者:RainFly   分类: 生活哲理   热度: 10792°  评论:4  
时间:2016-3-23   分类: 生活哲理    热度:10792   评论:4

        正如"打工皇帝"唐骏说:"我觉得有两种人不要跟别人争利益和价值回报。第一种人就是刚刚进入企业的人,头5年千万不要说你能不能多给我一点儿工资,最重要的是能在企业里学到什么,对发展是不是有利……"         人总是从平坦中获得的教益少,从磨难中获得的教益多;从平坦中获得的教益浅,从磨难中获得的教益深。一个人在年轻时经历磨难,如能正确视之,冲出黑暗,那就是一个值得敬慕的人。最要紧的是先练好内功,毕业后这5年就是练内功的最佳时期,练好内功,才有可能在未来攀得更高。 出路在哪里?出路在于思路! 其实,没有钱、没有经验、没有阅历、没有社会关系,这些都不可怕。没有钱,可以通过辛勤劳动去赚;没有经验,可以通过实践操作去总结;没有阅历,可以一步一步去积累;没有社会关系,可以一点一点去编织。但是,没有梦想、没有思路才是最可怕的,才让人感到恐惧,很想逃避! 人必须有一个正确的方向。无论你多么意气风发,无论你是多么足智多谋,无论你花费了多大的心血,如果没有一个明确的方向,就会过得很茫然,渐渐就丧失了斗志,忘却了最初的梦想,就会走上弯路甚至不归路,枉费了自己的聪明才智,误了自己的青春年华。 荷马史诗《奥德赛》中有一句至理名言:"没有比漫无目的地徘徊更令人无法忍受的了。"毕业后这5年里的迷茫,会造成10年后的恐慌,20年后的挣扎,甚至一辈子的平庸。如果不能在毕业这5年尽快冲出困惑、走出迷雾,我们实在是无颜面对10年后、20年后的自己。毕业这5年里,我们既有很多的不确定,也有很多的可能性。 毕业这5年里,我们既有很多的待定,也有很多的决定。 迷茫与困惑谁都会经历,恐惧与逃避谁都曾经有过,但不要把迷茫与困惑当作可以自我放弃、甘于平庸的借口,更不要成为自怨自艾、祭奠失意的苦酒。生命需要自己去承担,命运更需要自己去把握。在毕业这5年里,越早找到方向,越早走出困惑,就越容易在人生道路上取得成就、创造精彩。无头苍蝇找不到方向,才会四处碰壁;一个人找不到出路,才会迷茫、恐惧。 生活中,面对困境,我们常常会有走投无路的感觉。不要气馁,坚持下去,要相信年轻的人生没有绝路,困境在前方,希望在拐角。只要我们有了正确的思路,就一定能少走弯路,找到出路! 成功的人不是赢在起点,而是赢在转折点。 不少刚刚毕业的年轻人,总是奢望马上就能找到自己理想中的工作。然而,很多好工作是无法等来的,你必须选择一份工作作为历练。职业旅程中的第一份工作,无疑是踏入社会这所大学的起点。也许你找了一份差强人意的工作,那么从这里出发,好好地沉淀自己,从这份工作中汲取到有价值的营养,厚积薄发。千里之行,始于足下,只要出发,就有希望到达终点。 起点可以相同,但是选择了不同的拐点,终点就会大大不同! 毕业这几年,我们的生活、感情、职业等都存在很多不确定的因素,未来也充满了各种可能。这个时候,必须学会选择,懂得放弃,给自己一个明确的定位,使自己稳定下来。如果你不主动定位,就会被别人和社会"定型"! 可以这么说:一个人在毕业这5年培养起来的行为习惯,将决定他一生的高度。我们能否成功,在某种程度上取决于自己对自己的评价,这就是定位。你给自己定位是什么,你就是什么。定位能决定人生,定位能改变命运。丑小鸭变成白天鹅,只要一双翅膀;灰姑娘变成美公主,只要一双水晶鞋。 人的命,三分天注定,七分靠打拼,有梦就"会红",爱拼才会赢。只要不把自己束缚在心灵的牢笼里,谁也束缚不了你去展翅高飞。 现实情况远非他们所想的那样。于是,当优越感逐渐转为失落感甚至挫败感时,当由坚信自己是一块"金子"到怀疑自己是一粒"沙子"时,愤怒、迷茫、自卑就开始与日俱增。 其实,应该仔细掂量一下自己,你是否真是金子?是真金,手中要有绝活,才能上要有过人之处才行。一句话:真金是要靠实力来证明的,只有先把自己的本领修炼好了,才有资格考虑伯乐的事情 每颗珍珠原本都是一粒沙子,但并不是每一粒沙子都能成为一颗珍珠。 想要卓尔不群,就要有鹤立鸡群的资本。忍受不了打击和挫折,承受不住忽视和平淡,就很难达到辉煌。年轻人要想让自己得到重用,取得成功,就必须把自己从一粒沙子变成一颗价值连城的珍珠。 天有下雨与日出,人生高峰与低谷。 莫为浮云遮望眼,风物长宜放眼量。只要拂去阴霾,就能亮出朗朗晴空。如果你在工作上有些不如意,要相信自己不会一直处于人生的低谷期,总有一天能冲破重重云层。告诉自己:我并没有失败,只是暂时没有成功!只要在内心点亮一盏希望之灯,一定能驱散黑暗中的阴霾,迎来光明。 的确,论资历,他们是不折不扣的职场菜鸟,业务涉及不深,人脉一穷二白,在工作中经常碰壁。他们的压力并不一定都像千钧大石,而是像大雨来临前的天色,灰色低沉,明明有空间,却被灰色填满每个缝隙,只能等待大雨倾盆之后的晴空。 "起得比鸡早,睡得比狗晚,干得比驴多,吃得比猪差。"这是很多刚刚毕业的人喜欢用来调侃自己生活状态的话。虽然有点儿夸张,但是,他们中的很多人的确一直都被灰色心情所笼罩--心里永远是多云转阴。记得有位哲人曾说:"我们的痛苦不是问题本身带来的,而是我们对这些问题的看法产生的。"换个角度看人生,是一种突破、一种解脱、一种超越、一种高层次的淡泊与宁静,从而获得自由自在的快乐。 一位哲人说:"人生就是一连串的抉择,每个人的前途与命运,完全把握在自己手中,只要努力,终会有成。"就业也好,择业也罢,创业亦如此,只要奋发努力,都会成功。你是不是准备把生命的承诺全部都交给别人? 毕业后这5年,是改变自己命运的黄金时期。在最能决定自己命运时,如果还不把握,那你还要等到什么时候呢?我的人生我做主,命运由己不由人。 不要活在别人的嘴里,不要活在别人的眼里,而是把命运握在自己手里。 别说你没有背景,自己就是最大的背景。美国作家杰克·凯鲁亚克说过一句话:"我还年轻,我渴望上路。"在人生的旅途中,我们永远都是年轻人,每天都应该满怀渴望。每个人的潜能都是无限的,关键是要发现自己的潜能和正确认识自己的才能,并找到一个能充分发挥潜能的舞台,而不能只为舞台的不合适感到不快。要客观公正地看待自己的能力,结合自己的实际情况和爱好冷静选择,尽可能到最需要自己、最适合自己的地方。 在人力资源管理界,特别流行一个说法,即"骑马,牵牛,赶猪,打狗"理论:人品很好,能力又很强的,是千里马,我们要骑着他;人品很好但能力普通的,是老黄牛,我们要牵着他;人品、能力皆普通的,就是"猪",我们要赶走他;人品很差能力很强的,那是"狗",我们要打击他。 我想,刚刚毕业几年的你,一样胸怀大志,一样想成为一匹被人赏识、驰骋沙场的千里马吧?那么,就好好沉淀下来。低就一层不等于低人一等,今日的俯低是为了明天的高就。所谓生命的价值,就是我们的存在对别人有价值。能被人利用是一件好事,无人问津才是真正的悲哀! 能干工作、干好工作是职场生存的基本保障。 任何人做工作的前提条件都是他的能力能够胜任这项工作。能干是合格员工最基本的标准,肯干则是一种态度。一个职位有很多人都能胜任,都有干好这份工作的基本能力,然而,能否把工作做得更好一些,就要看是否具有踏实肯干、苦于钻研的工作态度了。 在能干的基础上踏实肯干。 工作中,活干得比别人多,你觉得吃亏;钱拿得比别人少,你觉得吃亏;经常加班加点,你觉得吃亏……其实,没必要这样计较,吃亏不是灾难,不是失败,吃亏也是一种生活哲学。现在吃点儿小亏,为成功铺就道路,也许在未来的某个时刻,你的大福突然就来了。 能吃亏是做人的一种境界,是处世的一种睿智。 在工作中并不是多做事或多帮别人干点儿活就是吃亏。如果领导让你加加班、赶赶任务,别以为自己吃了大亏,反而应该感到庆幸,因为领导只叫了你,而没叫其他人,说明他信任你、赏识你。吃亏是一种贡献,你贡献得越多,得到的回报也就越多。乐于加班,就是这样的一种吃亏。 舍得舍得,有舍才有得;学会在适当时吃些亏的人绝对不是弱智,而是大智。 给别人留余地就是给自己留余地,予人方便就是予己方便,善待别人就是善待自己。 傻人有傻福,因为傻人没有心计。和这样的人在一起,身心放松,没有太多警惕,就能相互靠近。傻在很多时候意味着执着和忠贞,也意味着宽厚和诚实,让人不知不觉站到他一边。傻人无意中得到的,比聪明人费尽心机得到的还多。毕业这几年,你的天空中只飘着几片雪花,这样你就满足了吗?成功需要坚持与积累,与其专注于搜集雪花,不如省下力气去滚雪球。巴菲特说:"人生就像滚雪球,最重要的是发现很湿的雪和很长的坡。"让自己沉淀下来,学着发现"很湿的雪",努力寻找"很长的坡"。记住:散落的雪花会很快融化,化为乌有,只有雪球才更实在,才能长久。 在毕业这几年里,你要是能做到比别人多付出一分努力,就意味着比别人多积累一分资本,就比别人多一次成功的机会。 什么是职业化呢?职业化就是工作状态的标准化、规范化、制度化,即在合适的时间、合适的地点用合适的方式说合适的话、做合适的事,使知识、技能、观念、思维、态度、心理等符合职业规范和标准。"在每个行业里,都有很多出色的人才,他们之所以能存在,是因为比别人更努力、更智慧、更成熟。但是,最重要的是,他们比一般人更加职业化!这就是为什么我现在能当你老板的原因。一个人仅仅专业化是不够的,只有职业化的人才能飞在别人前面,让人难以超越!"不要以为我们现在已经生存得很安稳了。对于毕业5年的人来讲,一定要认清即将面临的五大挑战。

一、赡养父母。

二、结婚生子。 三、升职加薪。 四、工作压力。 五、生活质量。 有的人为生存而雀跃,目光总是停在身后,三天打鱼两天晒网,有始无终。 有的人为发展而奋斗,目光总是盯在正前方,每天进步一点点,坚持不懈。 毕业这几年,不能没有追求和探索,不能没有理想和目标。人生如逆水行舟,不进则退。甘于现状的生活就是不再前行的船,再也无法追上时代前进的步伐。一定要抓紧每一秒钟的时间来学习,要明白学习不是学生的专利。小聪明的人最得意的是:自己做过什么?大智慧的人最渴望的是:自己还要做什么? 小聪明是战术,大智慧是战略;小聪明看到的是芝麻,大智慧看到的是西瓜。 在这个世界上,既有大人物,也有小角色,大人物有大人物的活法,小人物有小人物的潇洒,每个人都有自己的生活方式,谁也勉强不了谁。但是,小聪明只能有小成绩和小视野,大智慧才能有大成就和大境界。小企业看老板,中企业看制度,大企业看文化。

热门文章 浅析Easy-ARMi.MAX283 GPIO中断驱动模块

时间:2016-3-20 作者:RainFly   分类: Linux嵌入式   热度: 10334°  评论:1  
时间:2016-3-20   分类: Linux嵌入式    热度:10334   评论:1

需要的是一步步解析这个代码中比较抽象难懂的点 顺带举一反三 共同学习 不喜勿喷!

贴上源代码 在光盘文件 ....\3.Linux\4.开发示例6、驱动示例GPIO中断

#inc lude<linux/init.h>

#include<linux/module.h> #include<mach/gpio.h>                                                   #include<asm/io.h>                                                  #include"mach/../../mx28_pins.h" #include <mach/pinctrl.h> #include "mach/mx28.h" #include<linux/fs.h> #include <linux/io.h> #include<asm/uaccess.h>                                      #include<linux/miscdevice.h>                           #include<linux/irq.h>                           #include<linux/sched.h>                    #include<linux/interrupt.h>               #include<linux/timer.h> #include <linux/kernel.h> #include <linux/delay.h> #include <asm/uaccess.h> #include <asm/io.h> #define GPIO_BUTTON_PIN PINID_SSP0_DATA4 //按键的引脚为P2.4

//具体引脚文件的配置在内核arch/arm/mach-mx28/mx28_pin.h文件中宏定义添加引脚配置 

MXS_PING_ENCODE函数是通过计算得出引脚位置

#define MXS_PIN_ENCODE(b, p)   \ ((((b) & MXS_PIN_BANK_MAX) << MXS_PIN_BANK_BIT) |\ ((p) & MXS_PIN_PINID_MAX))  

static volatile int ev_press = 0;

static struct fasync_struct button_async; struct pin_desc_s{ //中断引脚描述结构体 unsigned int pin; unsigned int irq; unsigned int key_val; }; static unsigned char key_val; //初始化中断引脚结构体 struct pin_desc_s pin_desc = { .pin     = MXS_PIN_TO_GPIO(GPIO_BUTTON_PIN), .key_val = 0, }; static DECLARE_MUTEX(button_lock);      static DECLARE_WAIT_QUEUE_HEAD(button_waitq); //中断处理函数 static irqreturn_t buttons_irq(int irq, void dev_id) { struct pin_desc_s pindesc = (struct pin_desc_s )dev_id; unsigned int pinval; pinval = gpio_get_value(pindesc->pin); if (pinval) { key_val = 1; } else { key_val = pindesc->key_val; }         ev_press = 1;         wake_up_interruptible(&button_waitq); //唤醒等待队列里面的进程 kill_fasync (&button_async, SIGIO, POLL_IN); //异步通知 //printk("interrupt occur..........\n"); return IRQ_RETVAL(IRQ_HANDLED); } static int gpio_drv_open(struct inode inode, struct file file) { int iRet=0; if (file->f_flags & O_NONBLOCK) { if (down_trylock(&button_lock)) return -EBUSY; } else { down(&button_lock); } gpio_direction_input(pin_desc.pin); pin_desc.irq = gpio_to_irq(pin_desc.pin);  if (pin_desc.irq)  disable_irq(pin_desc.irq); set_irq_type(pin_desc.irq, IRQF_TRIGGER_FALLING); //下降沿中断 //申请中断并设置中断处理函数 iRet = request_irq(pin_desc.irq, buttons_irq, IRQF_SHARED, "gpio_int", &pin_desc); if (iRet != 0){ printk("request irq failed!! ret: %d  irq:%d \n", iRet,pin_desc.irq); return -EBUSY; } return 0; } ssize_t gpio_drv_read(struct file file, char __user buf, size_t size, loff_t ppos) { if (size != 1) return -EINVAL; if (file->f_flags & O_NONBLOCK) { if (!ev_press) return -EAGAIN; } else { wait_event_interruptible(button_waitq, ev_press); } copy_to_user(buf, &key_val, 1); ev_press = 0; return 1; } int gpio_drv_close(struct inode inode, struct file file) { free_irq(pin_desc.irq, &pin_desc); up(&button_lock); return 0; } static int gpio_drv_fasync (int fd, struct file filp, int on) { printk("driver: gpio_drv_fasync\n"); return fasync_helper (fd, filp, on, &button_async); } static struct file_operations gpio_drv_fops = { .owner = THIS_MODULE, .open = gpio_drv_open, .read = gpio_drv_read, .release = gpio_drv_close, .fasync = gpio_drv_fasync, }; static struct miscdevice button_miscdev =  { .minor        = MISC_DYNAMIC_MINOR,     .name        = "magic-gpio",     .fops        = &gpio_drv_fops, }; static int __init gpio_drv_init(void) { int iRet=0; printk("gpio_miscdev module init!\n");

iRet = misc_register(&button_miscdev);

// 注册miscdevice 混杂设备驱动 公用主设备号为10,节省主设备号!  

详细解释 http://blog.csdn.net/tong646591/article/details/8301925

if (iRet) { printk("register failed!\n"); }  return 0; } static void __exit gpio_drv_exit(void) { printk("gpio_miscdev module exit!\n"); misc_deregister(&button_miscdev); } module_init(gpio_drv_init); module_exit(gpio_drv_exit); MODULE_AUTHOR("EasyARM283 By LZZ"); MODULE_LICENSE("Dual BSD/GPL"); MODULE_DESCRIPTION("gpio button interrupt module");

热门文章 BOA服务器ARM开发板上无法加载CSS样式处理方法

时间:2016-3-9 作者:RainFly   分类: Linux嵌入式   热度: 12298°  评论:2  
时间:2016-3-9   分类: Linux嵌入式    热度:12298   评论:2

        背景:前段时间刚移植了BOA服务器到我的EasyARM283的开发板上面了,CGI程序运行正常但是当写入一下css样式文本后,浏览器始终无法正常显示 发现可以调用JS文件,按照相应的CSS文件路径也可以找到对应文件,百度Google了很多资料都没有得到什么有效的解决办法,最终在看火狐浏览器对应的source路径找到css文件加载不了的实际原因

 如同图上的报错所说  样式表单未载入 因为它的MIME类型是“text/plain” 不是“test/css”

查了一下服务器的配置文件发现了解决途径 

在/etc/boa/boa.conf 文件第165行 有一个定义缺省MIME类型

 将 text/plain   更改为text/css

成功完成css加载!

热门文章 EasyARM-imx28开发板嵌入web服务器

时间:2016-3-5 作者:RainFly   分类: Linux嵌入式   热度: 8610°  评论:1  
时间:2016-3-5   分类: Linux嵌入式    热度:8610   评论:1

     

      随着互联网应用的普及,越来越多的信息化产品需要接入互联网通过Web页面进行远程访问。嵌入式Web系统提供了一种经济、实用的互联网嵌入式接入方案。这里结合一种嵌入式Web Server BOA来介绍嵌入式Linux系统下的CGI程序设计技术。

关于实现项目所出现的相关问题解决办法

 一、编译配置boa服务器 1 、[root@localhost /]#mkdir web                           //在根目录下创建web目录 2 、[root@localhost /]# cd /web/ 3 、[root@localhost web]# rz 4 、[root@localhost web]# tar –zxvf boa-0.94.13.tar.gz      //将源码解压到/web目录下 5 、[root@localhost web]# cd boa-0.94.13/ 6 、[root@localhost boa-0.94.13]# cd src/    7 、[root@localhost src]# ls 8 、[root@localhost src]# ./configure                         //运行./configure使之生成Makefile文件 9 、[root@localhost src]# vi Makefile 修改内容如下: 把CC=gcc 和CPP=gcc -E改写成CC=arm-none-linux-gnueabi-gcc    CPP=arm-none-linux-gnueabi-g++ -E 10 、[root@localhost src]# vi compat.h 在一般模式下输入:set nu显示行编号,再用120进到120行,修改内容如下: 120 #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff   改为define TIMEZONE_OFFSET(foo) foo->tm_gmtoff 把120行foo后两个#号去掉

11 、[root@localhost src]# make                       //编译 12 、[root@localhost src]# arm-linux-strip boa        //优化boa可执行文件(此步非必须) 13 、[root@localhost web]# cd boa-0.94.13/      14 、[root@localhost boa-0.94.13]# vi boa.conf         //修改boa的配置文件 在一般模式下输入:set nu显示行编号,再用111进到111行,  修改内容如下:  把111 DocumentRoot /var/www 改为111 DocumentRoot /var/www //指明html文件所放的路径 把193 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ 改为193 ScriptAlias /cgi-bin/ /var/www/cgi-bin/ //指明cgi脚本的虚拟路径所对应的实际路径 15、将/src目录下新生成的boa文件下载到目标板的/bin目录下,将boa.conf文件下载到目标板的/etc/boa/目录下。 16、进入开发板的/bin目录,运行boa。 二、可能遇到的问题 1、Could not chdir to "/etc/boa": aborting       必须创建/etc/boa目录 2、Could not open mime.types file, "/etc/mime.types", for reading      /etc/目录下缺少mime.types文件,从它处拷贝。 3、gethostbyname:: Connection timed out      把“#ServersName www.your.org.here”的“#”去掉。   三、修改boa.conf文件 # 监听的端口号,缺省都是80 ,一般无需修改 Port 80 # bind 调用的IP 地址,一般注释掉,表明绑定到INADDR_ANY ,通配于服务器的所有IP 地址 #Listen 192.68.0.5 User 0 Group 0 # 当服务器发生问题时发送报警的email 地址,目前未用,注释掉 #ServerAdmin root@localhost  # 错误日志文件。如果没有以/ 开始,则表示从服务器的根路径开始。如果不需要错误日志,则用#/dev/null 。在下面设置时,注意一定要建立/var/log/boa 目录 ErrorLog /mnt/log/boa/error_log # 访问日志文件。如果没有以/ 开始,则表示从服务器的根路径开始。如果不需要错误日志,则用#/dev/null 或直接注释掉。在下面设置时,注意一定要建立/var/log/boa 目录 #AccessLog /var/log/boa/access_log # 是否使用本地时间。如果没有注释掉,则使用本地时间。注释掉则使用UTC 时间 #UseLocaltime # 是否记录CGI 运行信息,如果没有注释掉,则记录,注释掉则不记录 #VerboseCGILogs # 服务器名字 ServerName www.hyesco.com  # 是否启动虚拟主机功能,即设备可以有多个网络接口,每个接口都可以拥有一个虚拟的Web 服 # 务器。一般注释掉,即不需要启动 #VirtualHost # 非常重要,HTML 文档的主目录。如果没有以/ 开始,则表示从服务器的根路径开始。 DocumentRoot /var/www # 如果收到一个用户请求的话,在用户主目录后再增加的目录名 UserDir public_html #HTML 目录索引的文件名,也是没有用户只指明访问目录时返回的文件名 DirectoryIndex index.html # 当HTML 目录没有索引文件时,用户只指明访问目录时,boa 会调用该程序生成索引文件然后 # 返回给用户,因为该过程比较慢最好不执行,可以注释掉或者给每个HTML 目录加上#DirectoryIndex 指明的文件 #DirectoryMaker /usr/lib/boa/boa_indexer # 如果DirectoryIndex 不存在,并且DirectoryMaker 被注释,那么就用Boa 自带的索引 # 生成程序来生成目录的索引文件并输出到下面目录,该目录必须是Boa 能读写 # DirectoryCache /var/spool/boa/dircache # 一个连接所允许的HTTP 持续作用请求最大数目,注释或设为0 都将关闭HTTP 持续作用 KeepAliveMax 1000 #HTTP 持续作用中服务器在两次请求之间等待的时间数,以秒为单位,超时将关闭连接 KeepAliveTimeout 10 # 指明mime.types 文件位置。如果没有以/ 开始,则表示从服务器的根路径开始。可以注释掉 # 避免使用mime.types 文件,此时需要用AddType 在本文件里指明 MimeTypes /etc/mime.types # 文件扩展名没有或未知的话,使用的缺省MIME 类型 DefaultType text/plain # 提供CGI 程序的PATH 环境变量值 CGIPath /bin:/usr/bin:/usr/local/bin # 将文件扩展名和MIME 类型关联起来,和mime.types 文件作用一样。如果用mime.types # 文件,则注释掉,如果不使用mime.types 文件,则必须使用 #AddType application/x-httpd-cgi cgi # 指明文档重定向路径 #Redirect /bar http://elsewhere/feh/bar  # 为路径加上别名 Alias /doc /usr/doc # 非常重要,指明CGI 脚本的虚拟路径对应的实际路径。一般所有的CGI 脚本都要放在实际路径 # 里,用户访问执行时输入站点+ 虚拟路径+CGI 脚本名 ScriptAlias /cgi-bin/ /var/www/cgi-bin/     用户可以根据自己需要,对boa.conf 进行修改,但必须要保证其他的辅助文件和设置必须和boa.conf 里的配置相符,不然Boa 就不能正常工作。 在上面的例子中,我们还需要创建日志文件所在目录/var/log/boa ,创建HTML 文档的主目录/var/www ,将mime.types 文件拷贝 到/etc 目录,创建CGI 脚本所在目录/var/www/cgi-bin/ . www 目录放index.html 文件。mime.types 文件用来指明不同文件扩展名对应的MIME 类型,一般 可以直接从Linux 主机上拷贝一个,大部分也都是在主机的/etc 目录下。访问方式:http://192.168.3.223/index.html

BOA源文件编译出错解决方案

        

编译boa时提示:      

make: yacc:命令未找到 make: *** [y.tab.c] 错误 127 make: lex:命令未找到 make: *** [lex.yy.c] 错误 127 解决方法:

安装需要工具         apt-get install bison

        apt-get install flex

编译会出错: util.c: 100: 1: pasting “t” and “->” does not give a valid preprocessing token make: [util.o] Error1 解决方法,修改compat.h中的 #define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff 为: #define TIMEZONE_OFFSET(foo) foo->tm_gmtoff

1.必须要在板子的/etc下建一个boa目录(错误代码忘了) 2.”can't open boa.conf for reading“ 解决:不仅要在你自己放置boa的目录下放入boa.conf配置文件,而且要在板子的/etc/boa下也要放入boa.conf文件,这样系统在运行boa的时候才可以读取到boa.conf文件。 3.“unable to dup2 the error log bad file descriptor” 解决:在boa源码里,即src文件夹下把log.c中的第73行的if语句注释掉。

其实主要原因在于没有创建/var/log/boa/文件夹下面的 两个记录文件 error_log access_log  创建完成后重新运行boa 4."unable to dup2 the error log:Bad file descriptor" 解决:在boa.conf里,把“#AccessLog /var/log/boa/access_log”注释掉(即去掉#号)。 5.“[01/Jan/2031:00:12:25 +0000] boa.c:226 - icky Linux kernel bug!: No such file or directory” 解决:在boa源码里,即src文件夹下把boa.c中的第226行的if语句注释掉。  6."gethostbyname:: Resource temporarily unavailable" 解决:把“#ServerName www.your.org.here”的“#”号去掉。  7."./boa: 1: syntax error: "(" unexpected" 解决:没有修改Makefile,是用gcc编译的,应该改成是arm-linux-gcc编译。 8.如果页面上是:“502 Bad Gateway The CGI was not CGI/1.1 compliant.“ 解决:给你要执行的cgi可执行程序赋个权限。chmod 777 filename 9.在<form action="cgi-bin/test2.cgi" method="get">中,cgi可执行程序的路径就直接写“cgi-bin/test2.cgi”就可以了,不要写板子上的绝对路径,这样就重复了,因为cgi执行时会自动去boa.conf的指定的路径里找。 10.出现警告:“control reaches end of non-void function”,是因为某个函数没有return,而函数定义时是非void型的。所以需要有个返回值。比如int cgiMain()这个函数就一定要有个返回值的,否则会报这个错误。 12.运行网页时老出现错误:“mkstemp:No such file or diectory” 解决:不能用post,只能用get。因为post方式需要新建一个临时文件,这就需要用到mkstemp函数。这个函数是在系统中以唯一的文件名创建一个文件并打开,且只有当前用户才能访问这个临时文件。故权限不够,或其他什么问题都会报这个错误。那么就用get吧!这里具体原因细节笔者暂时也不是很清楚... 13.直接写的含有system()函数的c程序用arm-linux-gcc编译到板子上的可以执行,而如果写在cgi中的就不一定能执行了。因为牵涉到一个cgi的权限的问题。即使给你的cgi-bin文件夹下的所有cgi可执行文件都赋了权限,也不一定能执行。

boa程序无法运行  如果要将运行用户为 root 则还要改, 首先在 boa.conf 中  48行   User nobody 改为   User root 如果这样重新运行boa 则会邮错,请看 error_log 中的提示        src/boa.c:226 - icky Linux kernel bug!: Success 在linux中很少以root 用户作为应用程的运行者,一般的应用程序也会禁止认root作为程序的运行者  所以在boa.c 的225行中有       if (setuid(0) != -1)    }注释掉下面语句: if(setuid(0) != -1) { DIE(”icky Linux kernel bug!”); } 即修改为: #if 0 if(setuid(0) != -1) {    DIE(”icky Linux kernel bug!”);    } #endif 上面修改完成 查看/var/log/error/boa/error_log   

继而可以打开浏览器查看是否能打开index.html

cgi文件也可以正常打开!

写写改改一天终于完成了在imx283开发版上面移植web服务器了,本想上传一些大的网页素材结果发现 /var 目录分配的时候给的太小了 只有512k,需要重新做个根文件,(笔者想更改掉网站的根目录 DocumentRoot 结果发现CGI程序无法正常运行,改日再继续修改!)

通过修改了DocumentRoot /www 和ScriptAlias          /www/cgi-bin/   

将网站文件放到了根目录,boa服务器顺利完成搭建!

参考资料

            基于嵌入式web服务器的远程数据采集系统的应用   韩改宁,梁新月      

资源网盘              

           http://pan.baidu.com/s/1dEh0lLf

热门文章 Linux串口编程详解

时间:2016-2-4 作者:RainFly   分类: Linux嵌入式   热度: 5992°  评论:2  
时间:2016-2-4   分类: Linux嵌入式    热度:5992   评论:2
串口本身,标准和硬件 

串口是计算机上的串行通讯的物理接口。计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备。虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代;而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之。但是,一方面因为串口本身造价便宜技术成熟,另一方面因为串口的控制台功能RS-232标准高度标准化并且非常普及,所以直到现在它仍然被广泛应用到各种设备上。某些计算机使用一个叫做UART的集成电路来作为串口设备。这个集成电路可以进行字符和异步串行通讯序列之间的转换,并且可以自动地处理数据的时序。而某些低端设备则会让CPU直接通过输出针来传送数据,这种技术叫做bit-banging。因为“串口”,RS-232和UARTs基本上总是在同一个语境中出现,所以这些名词通常会被搞混。下面逐一解释以下一些重要的名词和术语。

什么是串行通信 ?

计算机可以每次传送一个或者多个位(bit)的数据。“串行”指的式每次只传输一位(1bit)数据。当需要通过串行通讯传输一个字(word)的数据时,只能以每次一位的方式接收或者发送。每个位可能是on(1)或者off(0)。很多技术术语中经常用mark表示on,而space表示off。 串行数据的速度通常用每秒传输的字节数bits-per-second(bps)或者波特率(baud)表示。这个值表示的是每秒钟被送出的0和1 的个数。很久很久以前,300bps就是很快的速度了,而现在的电脑可以处理高达430,800的RS-232速率。表示波特率的单位还有kpbs和 Mbps,1kps=1000bps而1Mbps=1000kbps。一般有人提到串行设备的时候,它通常说可能是某种数据通讯设备-DCE(Data Communications Equipment)或者数据终端设备-DTE(Data Terminal Equipment)。它们之间的区别非常简单,每个信号对,比如传送和接收,它们俩正好是相反的。如果需要将两个DTE或者DCE设备连接起来的话,需要适配器或者交叉线缆将信号对交换。 ↑

什么是RS-232 ?

RS-232是EIA(Electronic Industries Association)定义的串行通信的电器接口。RS-232事实上有三种(A,B和C),它们分别采用不同的电压来表示on和off。最被广泛使用的是RS-232C,它将mark(on)比特的电压定义为-3V到-12V之间,而将space(off)的电压定义到+3V到+12V之间。虽然 RS-232C标准说信号最远被传输8m,但事实上你可以使用它传输更长的距离,直到信号波特率已经小到不行了为止。 RS-232的连结线中除去用来传入传出数据的电线,还有一些用来提供时序,状态和握手的电线: RS-232 针脚定义 DB-25 针脚 描述 针脚 描述 针脚 描述 针脚 描述 针脚 描述 1 Earth Ground 6 DSR - Data Set Ready 11 Unassigned 16 Secondary RXD 21 Signal Quality Detect 2 TXD - Transmitted Data 7 GND - Logic Ground 12 Secondary DCD 17 Receiver Clock 22 Ring Detect 3 RXD - Received Data 8 DCD - Data Carrier Detecter 13 Secondary CTS 18 Unassigned 23 Data Rate Select 4 RTS - Request To Send 9 Reserved 14 Secondary TXD 19 Secondary RTS 24 Transmit Clock 5 CTS - Clear To Send 10 Reserved 15 Transmit Clock 20 DTR - Data Terminal Ready 25 Unassigned DB-9 针脚 名称 全名 方向(主机 外设) 3 TD Transmit Data -> 2 RD Receive Data <- 7 RTS Request To Send -> 8 CTS Clear To Send <- 6 DSR Data Set Ready <- 4 DTR Data Terminal Ready -> 1 CD Data Carrier Detect <- 9 RI Ring Indicator <- 5 - Signal Ground   另外两个比较常见的串行接口的标准式RS-422和RS-574。RS-422使用更低的电压和差分信号,这样可以将传输距离扩张到300m。而RS-574定义了通常可以见到的用在电脑上的9针连接器和电压。 ↑ 信号定义 ? RS-232标准定义了18个不同的串行通信的信号。而这些之中,仅仅有如下6个可以在UNIX环境中使用。 GND - Logic Ground 从技术角度讲,GND不能算是信号。但是没有它其他信号都不能用了。基本上,logic ground有点像一个参考电压,通过它来判断哪个电压表示正哪个电压表示负。 TXD - Transmitted Data TXD信号负载着从你的电脑或者设备到另一端(比如调制解调器)的数据。Mark范围的电压被解析成1,而space范围电压被解析成0。 RXD - Received Data RXD于TXD正好相反。它负载着从另一端的电脑或者设备上传到你的工作站的数据。Mark和space的解析方法于TXD一致。 DCD - Data Carrier Detect DCD信号通常来自串口连结线的另一端。这条信号线上的space电压表示另一端的电脑或者设备现在已经连接。但是,DCD信号线却不是总可以得到的,有些设备上有这条信号线,而有的则没有。 DTR - Data Terminal Ready DTR信号是你的工作站产生的,用以告诉另一端的电脑或者设备你已经是否已经准备好了。Space电压表示准备好了,而mark电压表示没有准备好。当你在工作站上打开串行接口时,DTR通常自动被设置位有效。 CTS - Clear To Send CTS则通常来自连结线的另一端。Space电压表示你可以从工作站送出更多的数据。CTS通常用来协调你的工作站和另一端之间的串行数据流。 RTS - Request To Send 如果RTS信号被设置成space电压,这表示你准备好了一些数据需要传送。和CTS一样,RTS也被用来协调工作站和另一端的电脑或者设备之间的数据流。有些工作站上会一直将这个信号设置位space。 ↑

异步通讯 ?

计算机为了弄懂传给它的串行数据,它需要确定每个字符开始和结束的位置。这通常是用异步串行数据来完成的。 在异步模式中,除非有字符被传输,否则串行数据线总是处于mark(1)状态。有一个start位会被加入传输字符的各个位之前,在字符本身的位之后会有一个可选的parity位和一个或者多个stop位。Start位总是space(0)并且它会告诉计算机新的串行数据过来了。数据可以随时被送出或者接收,这就是所谓的异步。

ref(): File not found: "async.gif" at page "Linux串口编程详解"

那个可选的parity位仅仅是所有传输位的和,这个和用以表示传输字符中有奇数个1还是偶数个1。在偶数parity中,如果有传输字符中有偶数个1,那么parity位被设置成0,而传输字符中有奇数个1,那么parity位被设置成1。在奇数parity中,位设置与此相反。还有一些术语,比如space parity, mark parity和no parity。Space parity是指parity位会一直被设置位0,而mark parity正好与此相反,parity会一直是1。No parity的意思就是根本不会传输parity位。剩余的位叫做stop位。传输字符之间可以有1个,1.5个或者2个stop位,而且,它们的值总是1。传统上,Stop位式用给计算机一些时间处理前面的字符的,但是它只是被用来同步接收数据的计算机和接受的字符。异步数据通常被表示成"8N1","7E1",或者与此类似的形式。这表示“8数据位,no parity和1个stop bit”,还有相应得,“7数据位,even parity和1个stop bit”。 ↑

什么是全双工和半双工 ?

全双工(Full duplex)是说计算机可以同时接受和发送数据——也就是它有两个分开的数据传输通道(一个传入,一个传出)。 半双工(Half duplex)表示计算机不能同时接受和发送数据,而在某一时刻它只能单一的传送或者接收。这通常意味着,它只有一个数据通道。半双工并不是说RS-232的某些信号不能使用,而是,它通常是使用了有别于RS-232的其他不支持全双工的标准。 ↑

什么是流控制 ?

两个串行接口之间的传输数据流通常需要协调一致才行。这可能是由于用以通信的某个串行接口或者某些存储介质的中间串行通信链路的限制造成的。对于异步数据这里有两个方法做到这一点。 第一种方法通常被叫做“软件”流控制。这种方法采用特殊字符来开始(XON,DC1,八进制数021)或者结束(XOFF,DC3或者八进制数 023)数据流。而这些字符都在ASCII中定义好了。虽然这些编码对于传输文本信息非常有用,但是它们却不能被用于在特殊程序中的其他类型的信息。 第二种方法叫做“硬件”流控制。这种方法使用RS-232标准的CTS和RTS信号来取代之前提到的特殊字符。当准备就绪时,接受一方会将CTS信号设置成为space电压,而尚未准备就绪时它会被设置成为mark电压。相应得,发送方会在准备就绪的情况下将RTS设置成space电压。正因为硬件流控制使用了于数据分隔的信号,所以与需要传输特殊字符的软件流控制相比它的速度很快。但是,并不是所有的硬件和操作系统都支持CTS/RTS流控制。 ↑

什么是BREAK ?

通常,直到有数据传输时,接收和传输信号会保持在mark电压。如果一个信号掉到space电压并且持续了很长时间,一般来说是1/4到1/2秒,那么就说有一个break条件存在了。 BREAK经常被用来重置一条数据线或者用来改变像调制解调器这样的设备的通讯模式。 ↑

同步通讯 

与异步数据不同,同步数据是一个稳定的字节流。为了能够在线路上读取到数据,计算机必须提供或者接受一个时钟,这样才能保证发送端和接收端同步。尽管已经有同步时钟,计算机还是必须以某种方式标志数据流的开端。做这件事情最常见的办法就是使用像Serial Data Link Control("SDLC")或者High-Speed Data Link Control("HDLC")这样的数据包通讯协议。 这些协议每个都定义了一个确定的比特序列来表示数据包的开始和结束。当然,它们也定义了一个用来表示没有数据传输的比特序列。这些比特序列可以帮助计算机识别数据包的开端。 因为同步协议可以不使用每个字符的同步比特位,所以通常它们的性能比异步通讯快最少25%,而且一般比较适用于远距离的网络链接或者有两个串口接口的配置的情况。尽管同步通讯的速度有优势,大部分RS-232硬件却不支持它,因为同步通讯需要其他的硬件和软件。 ↑

用户看到的串口和用户空间的串口编程 

和其他设备一样,Linux也是通过设备文件来提供访问串口的功能。当需要访问串口的时候,你只需要open相应的文件。 ↑

串口的设备文件 

Linux系统上一般有一个或者多个串口,而这些串口设备文件名字比较奇怪,如比下面这样 串口设备文件名 操作系统 串口1 串口2 USB/RS-232转换器 Windows COM1 COM2 - Linux /dev/ttyS0 /dev/ttyS1 /dev/ttyUSB0 ↑

打开串口 ?

因为串口和其他设备一样,在类Unix系统中都是以设备文件的形式存在的,所以,理所当然得你可以使用open(2)系统调用/函数来访问它。但 Linux系统中却有一个稍微不方便的地方,那就是普通用户一般不能直接访问设备文件。你可以选择以下方式做一些调整,以便你编写的程序可以访问串口。 改变设备文件的访问权限设置 [#cd9bd1e0] 以root超级用户的身份运行程序 [#kdd0e577] 将你的程序编写位setuid程序,以串口设备所有者的身份运行程序 [#s7b703ff] OK.假如你已经准备好了让串口设备文件可以被所有用户访问,你可以在Linux系统中实验一下下面这个程序,它可以打开计算机的串口1。

include <stdio.h> include <string.h> include <unistd.h> include <fcntl.h> / File control definitions / include <errno.h> include <termios.h> / POSIX terminal control definitions /

/   'open_port()' - Open serial port 1   Returns the file descriptor on success or -1 on error.  / int open_port(void) { int fd; / File descriptor for the port / fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1) { /*

Could not open the port. */ perror("open_port: Unable to open /dev/ttyS0 -"); } else {     fcntl(fd, F_SETFL, 0); return (fd); } } ↑ 打开文件的选项 ?

打开串口连接的时候,程序在open函数中除了Read+Write模式以外还指定了两个选项; fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); 标志O_NOCTTY可以告诉UNIX这个程序不会成为这个端口上的“控制终端”。如果不这样做的话,所有的输入,比如键盘上过来的Ctrl+C中止信号等等,会影响到你的进程。而有些程序比如getty(1M/8)则会在打开登录进程的时候使用这个特性,但是通常情况下,用户程序不会使用这个行为。 O_NDELAY标志则是告诉UNIX,这个程序并不关心DCD信号线的状态——也就是不关心端口另一端是否已经连接。如果不指定这个标志的话,除非DCD信号线上有space电压否则这个程序会一直睡眠。 ↑

给端口上写数据 ?

给端口上写入数据也很简单,使用write(2)系统调用就可以发送数据了: n = write(fd, "ATZ\r", 4); if (n < 0)         fputs("write() of 4 bytes failed!\n", stderr); 和写入其他设备文件的方式相同,write函数也会返回发送数据的字节数或者在发生错误的时候返回-1。通常,发送数据最常见的错误就是EIO,当调制解调器或者数据链路将Data Carrier Detect(DCD)信号线弄掉了,就会发生这个错误。而且,直至关闭端口这个情况会一直持续。 ↑

从端口上读取数据 ?

从串口上读取数据的时候就得耍花招了。因为,如果你在原数据模式(raw data mode)操作端口的话,每个read(2)系统调用都会返回从串口输入缓冲区中实际得到的字符的个数。在不能得到数据的情况下,read(2)系统调用就会一直等着,只到有端口上新的字符可以读取或者发生超时或者错误的情况发生。如果需要read(2)函数迅速返回的话,你可以使用下面这个方式: fcntl(fd, F_SETFL, FNDELAY); 标志FNDELAY可以保证read(2)函数在端口上读不到字符的时候返回0。需要回到正常(阻塞)模式的时候,需要再次在不带FNDELAY标志的情况下调用fcntl(2)函数: fcntl(fd, F_SETFL, 0); 当然,如果你最初就是以O_NDELAY标志打开串口的,你也可在之后使用这个方法改变读取的行为方式。 ↑

关闭串口 ?

可以使用close(2)系统调用关闭串口: close(fd); 关闭串口会将DTR信号线设置成low,这会导致很多调制解调器挂起。 ↑

配置串口 ?

↑ POSIX终端接口 ? 很多系统都支持POSIX终端(串口)接口。程序可以利用这个接口来改变终端的参数,比如,波特率,字符大小等等。要使用这个端口的话,你必须将<termios.h>头文件包含到你的程序中。这个头文件中定义了终端控制结构体和POSIX控制函数。 与串口操作相关的最重要的两个POSIX函数可能就是tcgetattr(3)和tcsetattr(3)。顾名思义,这两个函数分别用来取得设设置终端的属性。调用这两个函数的时候,你需要提供一个包含着所有串口选项的termios结构体: termios结构体成员 成员 描述 c_cflag 控制选项 c_lflag 行选项 c_iflag 输入选项 c_oflag 输出选项 c_cc 控制字符 c_ispeed 输入波特率(NEW) c_ospeed 输出波特率(NEW) ↑ 控制选项 ? 通过termios结构体的c_cflag成员可以控制波特率,数据的比特数,parity,停止位和硬件流控制。下面这张表列出了所有可以使用的常数。 c_cflag常数 常量 描述 CBAUD Bit mask for baud rate B0 0 baud (drop DTR) B50 50 baud B75 75 baud B110 110 baud B134 134.5 baud B150 150 baud B200 200 baud B300 300 baud B600 600 baud B1200 1200 baud B1800 1800 baud B2400 2400 baud B4800 4800 baud B9600 9600 baud B19200 19200 baud B38400 38400 baud B57600 57,600 baud B76800 76,800 baud B115200 115,200 baud EXTA External rate clock EXTB External rate clock CSIZE Bit mask for data bits CS5 5 data bits CS6 6 data bits CS7 7 data bits CS8 8 data bits CSTOPB 2 stop bits (1 otherwise) CREAD Enable receiver PARENB Enable parity bit PARODD Use odd parity instead of even HUPCL Hangup (drop DTR) on last close CLOCAL Local line - do not change "owner" of port LOBLK Block job control output CNEW_RTSCTS/CRTSCTS Enable hardware flow control (not supported on all platforms) 在传统的POSIX编程中,当连接一个本地的(不通过调制解调器)或者远程的终端(通过调制解调器)时,这里有两个选项应当一直打开,一个是 CLOCAL,另一个是CREAD。这两个选项可以保证你的程序不会变成端口的所有者,而端口所有者必须去处理发散性作业控制和挂断信号,同时还保证了串行接口驱动会读取过来的数据字节。 波特率常数(CBAUD,B9600等等)通常指用到那些不支持c_ispeed和c_ospeed成员的旧的接口上。后面文章将会提到如何使用其他POSIX函数来设置波特率。 千万不要直接用使用数字来初始化c_cflag(当然还有其他标志),最好的方法是使用位运算的与或非组合来设置或者清除这个标志。不同的操作系统版本会使用不同的位模式,使用常数定义和位运算组合来避免重复工作从而提高程序的可移植性。 ↑

设置波特率 ?

不同的操作系统会将波特率存储在不同的位置。旧的编程接口将波特率存储在上表所示的c_cflag成员中,而新的接口实装则提供了c_ispeed和c_ospeed成员来保存实际波特率的值。 程序中可是使用cfsetospeed(3)和cfsetispeed(3)函数在termios结构体中设置波特率而不用去管底层操作系统接口。下面的代码是个非常典型的设置波特率的例子。 struct termios options; /   Get the current options for the port...  / tcgetattr(fd, &options); /   Set the baud rates to 19200...  / cfsetispeed(&options, B19200); cfsetospeed(&options, B19200); /   Enable the receiver and set local mode...  / options.c_cflag |= (CLOCAL | CREAD); /   Set the new options for the port...  / tcsetattr(fd, TCSANOW, &options); 函数tcgetattr(3)会将当前串口配置回填到termio结构体option中。然后,程序设置了输入输出的波特率并且将本地模式 (CLOCAL)和串行数据接收(CREAD)设置为有效,接着将新的配置作为参数传递给函数tcsetattr(3)。常量TCSANOW标志所有改变必须立刻生效而不用等到数据传输结束。其他另一些常数可以保证等待数据结束或者刷新输入输出之后再生效。 tcsetattr常量 常量 描述 TCSANOW Make changes now without waiting for data to complete TCSADRAIN Wait until everything has been transmitted TCSAFLUSH Flush input and output buffers and make the change 不同的系统上可能支持不同的输入输出速度,所以,通过串口连接两台机器或者设备的时候,应该将波特率设置成两者中较小的那个,即MIN(speed1, speed2)。 ↑

设置字符大小 ?

设置字符大小的时候,这里却没有像设置波特率那么方便的函数。所以,程序中需要一些位掩码运算来把事情搞定。字符大小以比特为单位指定: options.c_flag &= ~CSIZE; / Mask the character size bits / options.c_flag |= CS8;    / Select 8 data bits / ↑

设置奇偶校验 ?

与设置字符大小的方式差不多,这里仍然需要组合一些位掩码来将奇偶校验设为有效和奇偶校验的类型。UNIX串口驱动可以生成even,odd和no parity位码。设置space奇偶校验需要耍点小手段。 No parity (8N1) options.c_cflag &= ~PARENB options.c_cflag &= ~CSTOPB options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; Even parity (7E1) options.c_cflag |= PARENB options.c_cflag &= ~PARODD options.c_cflag &= ~CSTOPB options.c_cflag &= ~CSIZE; options.c_cflag |= CS7; Odd parity (7O1) options.c_cflag |= PARENB options.c_cflag |= PARODD options.c_cflag &= ~CSTOPB options.c_cflag &= ~CSIZE; options.c_cflag |= CS7; Space parity is setup the same as no parity (7S1) options.c_cflag &= ~PARENB options.c_cflag &= ~CSTOPB options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; ↑

设置硬件流控制 

某些版本的UNIX系统支持通过CTS(Clear To Send)和RTS(Request To Send)信号线来设置硬件流控制。如果系统上定义了CNEW_RTSCTS和CRTSCTS常量,那么很可能它会支持硬件流控制。使用下面的方法将硬件流控制设置成有效: options.c_cflag |= CNEW_RTSCTS;    /* Also called CRTSCTS 将它设置成为无效的方法与此类似: options.c_cflag &= ~CNEW_RTSCTS; ↑

本地设置 

本地模式成员变量c_lflag可以控制串口驱动怎样控制输入字符。通常,你可能需要通过c_lflag成员来设置经典输入和原始输入模式。 成员变量c_lflag可以使用的常量 ISIG Enable SIGINTR, SIGSUSP, SIGDSUSP, and SIGQUIT signals ICANON Enable canonical input (else raw) XCASE Map uppercase \lowercase (obsolete) ECHO Enable echoing of input characters ECHOE Echo erase character as BS-SP-BS ECHOK Echo NL after kill character ECHONL Echo NL NOFLSH Disable flushing of input buffers after interrupt or quit characters IEXTEN Enable extended functions ECHOCTL Echo control characters as ^char and delete as ~? ECHOPRT Echo erased character as character erased ECHOKE BS-SP-BS entire line on line kill FLUSHO Output being flushed PENDIN Retype pending input at next read or input char TOSTOP Send SIGTTOU for background output ↑

选择经典输入 

经典输入是以面向行设计的。在经典输入模式中输入字符会被放入一个缓冲之中,这样可以以与用户交互的方式编辑缓冲的内容,直到收到CR(carriage return)或者LF(line feed)字符。 选择使用经典输入模式的时候,你通常需要选择ICANON,ECHO和ECHOE选项: options.c_lflag |= (ICANON | ECHO | ECHOE); ↑

选择原始输入 

原始输入根本不会被处理。输入字符只是被原封不动的接收。一般情况中,如果要使用原始输入模式,程序中需要去掉ICANON,ECHO,ECHOE和ISIG选项: options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); ↑

输入选项 

可以通过输入模式成员c_iflag来控制从端口上收到的字符的输入过程。与c_cflag一样,c_iflag的最终值是想要使用的所有状态的位运算OR的组合。 c_iflag成员可以使用的常量 常量 描述 INPCK Enable parity check IGNPAR Ignore parity errors PARMRK Mark parity errors ISTRIP Strip parity bits IXON Enable software flow control (outgoing) IXOFF Enable software flow control (incoming) IXANY Allow any character to start flow again IGNBRK Ignore break condition BRKINT Send a SIGINT when a break condition is detected INLCR Map NL to CR IGNCR Ignore CR ICRNL Map CR to NL IUCLC Map uppercase to lowercase IMAXBEL Echo BEL on input line too long ↑

设置输入奇偶校验选项 

当程序在c_cflag中设置了奇偶校验成员(PARENB)的时候,程序就需要将输入奇偶校验设置成为有效。与奇偶校验相关的常量有 INPCK,IGNPAR,PARMRK和ISTRIP。一般情况下,你可能需要选择INPCK和ISTRIP将奇偶校验设置为有效同时从接收字串中脱去奇偶校验位: options.c_iflag |= (INPCK | ISTRIP); IGNPAR是一个比较危险选项,即便有错误发生时,它也会告诉串口驱动直接忽略奇偶校验错误给数据放行。这个选项在测试链接的通讯质量时比较有用而通常不会被用在实际程序中。 PARMRK会导致奇偶校验错误被标志成特殊字符加入到输入流之中。如果IGNPAR选项也是有效的,那么一个NUL(八进制000)字符会被加入到发生奇偶校验错误的字符前面。否则,DEL(八进制177)和NUL字符会和出错的字符一起送出。 ↑

设置软件流控制 

软件流控制可以通过IXON,IXOFF和IXANY常量设置成有效: options.c_iflag |= (IXON | IXOFF | IXANY); 将其设置为无效的时候,很简单,只需要对这些位取反: options.c_iflag &= ~(IXON | IXOFF | IXANY); XON(start data)和XOFF(stop data)字符却是在c_cc数组中定义的,下面会详细描述这个数组。 ↑

输出选项 

成员变量c_oflag之中包括了输出过滤选项。和输入模式相似,程序可以选择使用经过加工的或者原始的数据输出。 c_oflag成员的常量 常量 描述 OPOST Postprocess output (not set = raw output) OLCUC Map lowercase to uppercase ONLCR Map NL to CR-NL OCRNL Map CR to NL NOCR No CR output at column 0 ONLRET NL performs CR function OFILL Use fill characters for delay OFDEL Fill character is DEL NLDLY Mask for delay time needed between lines NL0 No delay for NLs NL1 Delay further output after newline for 100 milliseconds CRDLY Mask for delay time needed to return carriage to left column CR0 No delay for CRs CR1 Delay after CRs depending on current column position CR2 Delay 100 milliseconds after sending CRs CR3 Delay 150 milliseconds after sending CRs TABDLY Mask for delay time needed after TABs TAB0 No delay for TABs TAB1 Delay after TABs depending on current column position TAB2 Delay 100 milliseconds after sending TABs TAB3 Expand TAB characters to spaces BSDLY Mask for delay time needed after BSs BS0 No delay for BSs BS1 Delay 50 milliseconds after sending BSs VTDLY Mask for delay time needed after VTs VT0 No delay for VTs VT1 Delay 2 seconds after sending VTs FFDLY Mask for delay time needed after FFs FF0 No delay for FFs FF1 Delay 2 seconds after sending FFs ↑

选择加工过的输出 

通过在c_oflag成员变量中设置OPOST选项的方法程序可以选择加工过的输入。 options.c_oflag |= OPOST; 在所有选项当中,你可能只需要使用ONLCR选项来将行分隔符映射到CR-LF组合对上。其他选项主要是历史遗留,仅仅与行打印机和终端跟不上串行数据的年代有关。 ↑

选择原始输出 

原始输出方式可以通过在c_oflag中重置OPOST选项来选择: options.c_oflag &= ~OPOST; 如果OPOST选项被设置成无效的话,其他c_oflag中的选项都会失效。 ↑

控制字符 

字符数组c_cc里面包括了控制字符的定义和超时参数。这个数组的每个元素都是以常量定义的。 成员变量c_cc中的控制字符 常量 描述 键 VINTR Interrupt CTRL-C VQUIT Quit CTRL-Z VERASE Erase Backspace (BS) VKILL Kill-line CTRL-U VEOF End-of-file CTRL-D VEOL End-of-line Carriage return (CR) VEOL2 Second end-of-line Line feed (LF) VMIN Minimum number of characters to read - VSTART Start flow CTRL-Q (XON) VSTOP Stop flow CTRL-S (XOFF) VTIME Time to wait for data (tenths of seconds) - ↑

设置软件流控制字符 

用来做软件流控制的字符包含在数组c_cc的VSTART和VSTOP元素里面。通常情况下,它们应该被设置成DC1(八进制021)和DC3(八进制023),它们在ASCII标准中代表着XON和XOFF字符。 ↑

设置读取超时 

UNIX串口驱动提供了设置字符和包超时的能力。数组c_cc中有两个元素可以用来设置超时:VMIN和VTIME。在经典输入模式或者通过open(2)和fcntl(2)函数传递NDELAY选项时,超时设置会被忽略。 VMIN可以指定读取的最小字符数。如果它被设置为0,那么VTIME值则会指定每个字符读取的等待时间。 如果VMIN不为零,VTIME会指定等待第一个字符读取操作的时间。如果在这个指定时间中可以开始读取某个字符,直到VMIN个数的所有字符全部被读取,其他读取操作将会被阻塞(等待)。也就是说,一旦读取第一个字符,串口驱动的预期就是接收到整个字符包(一共VMIN字节)。如果在允许的时间内没有字符被读取,那么read(2)调用就会返回0。通过这个方法可以确切得告诉串口驱动程序需要读取N个字节,而且read(2)调用只会返回N或者 0。然而,超时设置只对第一个字符的读取操作有效,所以,如果因为某些原因驱动程序在N字节的包中丢失某个字符的话,read(2)调用将会一直等下去。 VTIME可以以十分之一秒为单位指定等待字符输入的时间。如果VTIME设置为0(默认情况),除非open(2)或者fcntl(2)函数设置了NDELAY选项,否则read(2)将会永久得阻塞(等待)。 ↑

调制解调器通讯  说到串口通讯就不得不提一下通过调剂解调器通讯的方式。这里给出的程序例子都适用于支持“事实上的”标准AT命令集的调制解调器。

↑ 什么是调制解调器 ? 调制解调器是一种可以将数字信号的串行数据转化为模拟信号频率的设备。通过这种转换,信息就可以通过像电话线或者有线电视线缆那样的模拟数据链路来传输了。口语中,经常将调制解调器称作“猫”。标准的电话调制解调器可以将串行数据转化为能够通过电话线传输的音频;因为这种转化非常之快又非常复杂,所以如果你去听一下的话,这些音频很像是大声尖叫时发出来的声音。 今天可以见到的调制解调器可以通过电话线每秒传输53000比特——5.3Kbps——的数据。还有就是,大多数调制解调器都使用数据压缩技术,这样就可以将某些类型数据的传输比特率提高到100kbps。 ↑ 与调制解调器通讯 ? 于调制解调器通讯的第一步就是要以原始输入模式打开和配置串口。 int            fd; struct termios options; / open the port / fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); fcntl(fd, F_SETFL, 0); / get the current options / tcgetattr(fd, &options); / set raw input, 1 second timeout / options.c_cflag     |= (CLOCAL | CREAD); options.c_lflag     &= ~(ICANON | ECHO | ECHOE | ISIG); options.c_oflag     &= ~OPOST; options.c_cc[VMIN]  = 0; options.c_cc[VTIME] = 10; / set the options / tcsetattr(fd, TCSANOW, &options); 接下来就需要和调制解调器建立通讯连接。最好的办法就是给调制解调器发送“AT”命令。这也会让比较只能的调制解调器探测到你正在使用的波特率。如果正确地连接到调制解调器上,并且调制解调器开启电源,它会返回一个回应信号“OK”。 int                  / O - 0 = MODEM ok, -1 = MODEM bad / init_modem(int fd)   / I - Serial port file / {   char buffer[255];  / Input buffer /   char bufptr;      / Current char in buffer /   int  nbytes;       / Number of bytes read /   int  tries;        / Number of tries so far /    for (tries = 0; tries < 3; tries ++)   {    / send an AT command followed by a CR /  if (write(fd, "AT\r", 3) < 3)   continue;    / read characters into our string buffer until we get a CR or NL / bufptr = buffer; while ((nbytes = read(fd, bufptr, buffer + sizeof(buffer) - bufptr - 1)) > 0) {  bufptr += nbytes;  if (bufptr[-1] == '\n' | bufptr[-1] == '\r')         break; }    / nul terminate the string and see if we got an OK response / bufptr = '\0'; if (strncmp(buffer, "OK", 2) == 0)  return (0);   }   return (-1); } ↑ 标准调制解调器命令 ? 大多数调制解调器都支持“AT”命令集。之所以这样叫是因为这个命令集中的每个命令都是以“AT”字符开头。每个命令都是以第一列的AT开头字符后面跟上特殊命令参数和一个回车符CR(八进制015)。调制解调器处理完这条命令之后会根据命令回复一些文本消息。 ATD 拨号 [#b39592a6] 通过ATD命令可以拨打一个指定号码。除过号码和分隔符(-)以外,你还可以指定以音频("T")或者脉冲("P")方式拨号,暂停一秒(",")和等待拨号音("W"): ATDT 555-1212 ATDT 18008008008W1234,1,1234 ATD T555-1212WP1234 调制解调器可能回复下面列出的某个消息: NO DIALTONE BUSY NO CARRIER CONNECT CONNECT baud ATH 挂断 通过ATH命令可以让调制解调器挂断。因为,调制解调器如果在“命令”模式的话,你可能就不能打普通电话了。 如果DTR信号线掉了的话,大部分调制解调器也会挂断。你可以将波特率设置成0并且持续至少1秒来做到这一点。再次让DTR掉落同样也可以把调制解调器重新拉回命令模式。 调制解调器成功挂断以后,它会回复一个"NO CARRIER"回来。如果调制解调器仍然保持连接,它则会发送"CONNECT"或者"CONNECT baud"这样的消息。 ATZ 重置调制解调器 通过ATZ命令可以重置调制解调器。重置之后它会回复字符串"OK"。 与调制解调器通讯的常见问题 首先,也是最重要的一点,千万不要使用回声输入(input echoing)。回声输入会导致调制解调器和计算机之间产生反馈循环。 其次,当发送调制解调器命令时,命令必须以回车(CR)而不是换行(NL)结束。C语言中回车的字符常量是"\r"。 最后,处理调制解调器通讯的时候,要一定保证你使用了调制解调器支持的波特率。虽然大多数调制解调器都支持自动探测波特率,但你也会注意到某些(通常是19.2kbps或者比较老的调制解调器)有局限性。 ↑ 高级串口编程 ? 所谓高级串口编程其实说的就是使用更直接的底层的ioctl(2)和select(2)系统调用来操作串口。 ↑ 串口的ioctl ? 前文中曾经提到使用tcgetattr和tcsetattr函数来配置串口。UNIX环境下,这些函数都是使用ioctl(2)系统调用来实现的。 系统调用ioctl可以带三个参数: int ioctl(int fd, int request, ...);  显然,fd参数对于串口编程来说就是串口设备文件的文件描述符咯。而request参数是在<termios.h>头文件中定义的常量,而且一般不会超出下表所列的范围。 串口的IOCTL请求 REQUEST 描述 POSIX函数 TCGETS Gets the current serial port settings. tcgetattr TCSETS Sets the serial port settings immediately. tcsetattr(fd, TCSANOW, &options) TCSETSF Sets the serial port settings after flushing the input and output buffers. tcsetattr(fd, TCSAFLUSH, &options) TCSETSW Sets the serial port settings after allowing the input and output buffers to drain/empty. tcsetattr(fd, TCSADRAIN, &options) TCSBRK Sends a break for the given time. tcsendbreak, tcdrain TCXONC Controls software flow control. tcflow TCFLSH Flushes the input and/or output queue. tcflush TIOCMGET Returns the state of the "MODEM" bits. None TIOCMSET Sets the state of the "MODEM" bits. None FIONREAD Returns the number of bytes in the input buffer. None ↑ 取得控制信号 ? TIOCMGET ioctl可以取得当前调制解调器的状态位。这个状态位囊括了除去RXD和TXD信号线的所有RS-232信号,这些都在下表中列出。 控制信号常量 常量 描述 TIOCM_LE DSR (data set ready/line enable) TIOCM_DTR DTR (data terminal ready) TIOCM_RTS RTS (request to send) TIOCM_ST Secondary TXD (transmit) TIOCM_SR Secondary RXD (receive) TIOCM_CTS CTS (clear to send) TIOCM_CAR DCD (data carrier detect) TIOCM_CD Synonym for TIOCM_CAR TIOCM_RNG RNG (ring) TIOCM_RI Synonym for TIOCM_RNG TIOCM_DSR DSR (data set ready) 例如下面这个程序片段,你可以通过给ioctl带一个用来保存状态位的整形变量的指针来取得状态位。

include <unistd.h> include <termios.h>

int fd; int status; ioctl(fd, TIOCMGET, &status);   ↑ 设置控制信号 ? TIOCMSET ioctl可以设置上面定义的调制解调器状态位。下面的例子展示如何使用它来将DTR信号线设成掉线状态。

include <unistd.h> include <termios.h>

int fd; int status; ioctl(fd, TIOCMGET, &status); status &= ~TIOCM_DTR; ioctl(fd, TIOCMSET, &status); 可能被设置的状态位取决于操作系统,驱动和正在使用的模式。

热门文章 智能家居真的智能吗?

时间:2016-1-29 作者:RainFly   分类: Linux嵌入式   热度: 10086°  评论:2  
时间:2016-1-29   分类: Linux嵌入式    热度:10086   评论:2

        每天躺在床上都要看那个操蛋的扫地机器人风风火火的跑进来,默默的把我的拖鞋给挪走了,然后听到它卡住地毯了,卡住鞋带了,卡住音响的底盘了,发出期盼的哀求声~然后还要把它抱上抱下榻榻米,阳台,卫生间。我觉得这孩子叫智障家居比较贴切。但是看到它永远周而复始傻乐傻乐的满房间跑,不想我那贤良淑德,勤劳可亲的老婆,扫地的时候哪里容得下我再补个美容觉我心理明白,这个世界终究是它们的。----靠我家的傻宝卖的一坨好萌~答案居然上了五百~今天晚上就就和老婆申请,自己扫地让这孩子好好休息一晚吧----另外想说下我的态度,因为不少评论有提到1,智能家居火不起来,因为他们还不够智能,人力省的少,价钱付的多,或者根本没有在省人力。少数稍稍能够平衡的区域(比如扫地机器人)他们的发展是成燎原之势的。所以虽然火不起来,其实已经离火不远了~~2,我老婆不在家的时候,我家傻宝是唯一和我有互动的存在,对我来说是和宠物一样的,有些层面上我并不希望它太完美,完美到用不上我。它那个风风火火不知疲倦的状态,更是一锅上好的智能鸡汤~

                                                                                       - 知乎

        智能家居已经开始很多家庭了,昂贵的价格和低效的实用性一直使它们难以的到有效的推广,也许在技术不断进步中,得到了少许提升,扫地机器人可以避开障碍物,避开楼梯等具有高度差的地势,但是从设计创意从一开始就出现问题了,扫地真的有必要用机器吗?就算能扫干净不出问题,效果也不会超过人力。还可以得到少许身体锻炼,且不论它从在的必要性,就现在很多智能家居而言,WIFI远程控制电灯亮灭,冰箱内的温度,空调的温度等等~ 虽然带上了”互联网+“的帽子,可是即便接入了互联网对家庭使用有能有多大帮助,是不是晚上手机坏了就得过原始人生活了? 当然这些技术的发展需要去尝试,不褒不贬只是想说说我自己的心目中的智能

    早晨,7点30分,是小田每天起床的时间。 屋子里的音响自动开启,声音从小到大逐渐响起,播放的正是小田昨天下载到MP8里的歌曲。 小田被闹钟叫醒,在床上伸了一个懒腰。床垫之下的传感器感应到了小田已经起床,于是告知窗帘自动拉开。同时音乐声音渐渐停止,并开始播放当天的天气预报以及当天的日程。 小田爬下床,走到洗漱间开始洗漱。位于屋顶的红外传感器感应到了小田的移动,然后卧室里的音响渐渐停止,洗漱间的音响无缝地衔接上。 正在小田洗漱的过程中,水池上方的镜子忽然亮了一下然后显示出了一行提示信息。“小田你好,沐浴露马上就要用光,是否按照之前的品牌继续购买?”小田想了想,伸手在镜子上确认的位置点了一下。镜子收到小田的确认操作之后,自动按照上次购买沐浴露的方式又下了一次订单。新的沐浴露预计会在晚上8点20分送到,镜子继续提示。

热门文章 iMX283开发板实践历程-LED实验

时间:2016-1-21 作者:RainFly   分类: Linux嵌入式   热度: 12485°  评论:1  
时间:2016-1-21   分类: Linux嵌入式    热度:12485   评论:1

通过在开发板中输入命令 mount -t nfs 192.168.1.2:/nfsroot  /mnt  -o nolock

将开发板/mnt挂载到linux主机nfsroot目录下 实现文件传输共享!

在nfsroot目录下新建文件flash.c Makefile 

Makefile 用交叉编译器实现编译

# this makefile is to compile the light flashing! EXE =flash SRC =flash.c CC = arm-none-linux-gnueabi-gcc .PHONY:all clean all: $(CC) $(SRC) $^ clean: -rm -v $(EXE)

flash.c文件内容

#include<stdio.h> #include<fcntl.h> #include<unistd.h> void delaytime(); int main() { int time; int t_fd,b_fd; int t_ret,b_ret; const char t_path[]="/sys/class/leds/led-err/trigger"; const char b_path[]="/sys/class/leds/led-err/brightness"; const char t_none[]="none"; const char b_true[1]="1";  //只写入一个字符'1'进入缓冲区 const char b_false[1]="0"; //同上 t_fd =open(t_path,O_RDWR); printf("%s file describer is %d \n",t_path,t_fd); b_fd =open(b_path,O_RDWR); printf("%s file describer is %d \n",b_path,b_fd); t_ret=write(t_fd,t_none,sizeof(t_none)); printf("write to trigger fd  %d\n",t_ret); while(1) { for(time=2;time>0;time--) { if(2 == time) { b_ret=write(b_fd,b_true,1); delaytime(); printf("%d\n",b_ret); printf("write the 1 to b\n"); } else { b_ret=write(b_fd,b_false,1); delaytime(); printf("%d\n",b_ret); printf("write the 0 to b\n"); } } } return 0; } void  delaytime()   //延时函数 { int i,j; for(i=1000;i>0;i--) for(j=10000;j>0;j--); }

热门文章 Vim实现自动缩进换行补全等功能

时间:2016-1-21 作者:RainFly   分类: Linux嵌入式   热度: 8774°  评论:1  
时间:2016-1-21   分类: Linux嵌入式    热度:8774   评论:1

所有步骤均修改文件 /etc/vim/vimrc

实现自动缩进

    在vimrc任意位置加上一下语句实现

    1)设置(软)制表符宽度为4:     set tabstop=4     set softtabstop=4     2)设置缩进的空格数为4     set shiftwidth=4     3)设置自动缩进:即每行的缩进值与上一行相等;使用 noautoindent 取消设置:     set autoindent     4)设置使用 C/C++ 语言的自动缩进方式:     set cindent     5)设置C/C++语言的具体缩进方式(以我的windows风格为例):     set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s     6)如果想在左侧显示文本的行号,可以用以下语句:     set nu

自动换行

    自动换行是每行超过 n 个字的时候 vim 自动加上换行符用     类似 :set textwidth=70 来设置 n     自动折行 是把长的一行用多行显示 , 不在文件里加换行符用      :set wrap 设置自动折行     :set nowrap 设置不自动折行

自动补全

    在末尾处添加如下代码:     inoremap ( ()<ESC>i     inoremap [ []<ESC>i     inoremap { {}<ESC>i     inoremap < <><ESC>i    其余括号仍按照同样方式添加

    自动补全代码需要依赖插件安装!

最后,如果没有下列语句,就加上吧: if &term=="xterm" set t_Co=8 set t_Sb=^[[4%dm set t_Sf=^[[3%dm endif 还有中文显示问题, 可以添加: let &termencoding=&encoding set fileencodings=utf-8,gbk,ucs-bom,cp936 上面这两行命令即可

            

热门文章 Makefile编写注意事项

时间:2016-1-20 作者:RainFly   分类: Linux嵌入式   热度: 9380°  评论:1  
时间:2016-1-20   分类: Linux嵌入式    热度:9380   评论:1

一个最简单的Makefile编写:

#对变量进行赋值

SRC = temp.c                                       OBJ = temp.o EXE = temp CC  = gcc CFLAGS = -g LDFLAGS = #显影式规则模式

EXE:$(OBJ)         $(CC) $(LDFLAGS) -o $(EXE)  $^            OBJ:$(SRC)         $(CC) $(CFLAGS) -o $(OBJ) -c $^

#伪目标 是改动文件能得到及时编译更新

.PHONY:clean clean:         -$(RM)  $(EXE)  $(OBJ)             //删除掉 .out执行文件 和.o目标文件!

所有的缩进部分全部需要tab键 如果使用空格键 make时就会报错 如下图

返回顶部    首页    捐赠支持    手气不错    友情链接    关于我们    站长工具    站长介绍    手机版本    后台登陆   
版权所有:雨夜轩    站长:RainFly    特别鸣谢   文章归档   皖ICP备15003600号-1   百度统计
Copyright©2015雨夜轩 Powered by emlog强力驱动 七牛CDN全球加速 360站长联盟安全认证 中国博客联盟荣誉成员 可信赖网站 谷歌地图   百度地图   
页面加载耗时:0.041秒 数据库查询次数:124次
背景设置
$