??xml version="1.0" encoding="utf-8" standalone="yes"?>一本色道久久99一综合,国产精品美女久久久m,国产成人久久精品二区三区http://www.shnenglu.com/guangping/<font face="Arial" size="4" color="#FF8000">Q-Q宁静致q,然世外?lt;/font> zh-cnWed, 07 May 2025 17:32:30 GMTWed, 07 May 2025 17:32:30 GMT60人生?/title><link>http://www.shnenglu.com/guangping/archive/2009/08/26/94461.html</link><dc:creator>王光q?/dc:creator><author>王光q?/author><pubDate>Wed, 26 Aug 2009 07:21:00 GMT</pubDate><guid>http://www.shnenglu.com/guangping/archive/2009/08/26/94461.html</guid><wfw:comment>http://www.shnenglu.com/guangping/comments/94461.html</wfw:comment><comments>http://www.shnenglu.com/guangping/archive/2009/08/26/94461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guangping/comments/commentRss/94461.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guangping/services/trackbacks/94461.html</trackback:ping><description><![CDATA[话说当年Q有一q轻子Q对现实不满Q愤然离厅Rn背一卷书Q手持笔记本Q游历八方,尽人间hQ见惯潮h落。心态复归^和,Ҏ天下之大Q万法归宗。一切皆w外物,人生一世,能尽已性而ؓQ实乃h生大q? <img src ="http://www.shnenglu.com/guangping/aggbug/94461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guangping/" target="_blank">王光q?/a> 2009-08-26 15:21 <a href="http://www.shnenglu.com/guangping/archive/2009/08/26/94461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>的天I?--香港旧梦2http://www.shnenglu.com/guangping/archive/2009/08/24/94316.html王光q?/dc:creator>王光q?/author>Mon, 24 Aug 2009 14:38:00 GMThttp://www.shnenglu.com/guangping/archive/2009/08/24/94316.htmlhttp://www.shnenglu.com/guangping/comments/94316.htmlhttp://www.shnenglu.com/guangping/archive/2009/08/24/94316.html#Feedback0http://www.shnenglu.com/guangping/comments/commentRss/94316.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/94316.html

]]>
软g监理http://www.shnenglu.com/guangping/archive/2009/07/09/89664.html王光q?/dc:creator>王光q?/author>Thu, 09 Jul 2009 08:30:00 GMThttp://www.shnenglu.com/guangping/archive/2009/07/09/89664.htmlhttp://www.shnenglu.com/guangping/comments/89664.htmlhttp://www.shnenglu.com/guangping/archive/2009/07/09/89664.html#Feedback0http://www.shnenglu.com/guangping/comments/commentRss/89664.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/89664.html      摘要Q本文对软g开发型信息化项目的监理工作按照程q行了设计:招标阶段、M规划阶段、需求分析阶Dc概要设计阶Dc详l设计阶Dc编码和试阶段、系l试q行阶段Qƈ介绍了每个阶D늛理方应承担的工作?/span>

  关键词:软g开发型 目监理 程

  Abstract: This paper designs the surveillance flows of information engineering that focused on software development: the phase of inviting public bidding、of laying out、of demand analysis?of outline design、of detail design、of coding and testing 、of system test run , and presents the necessary work that the surveillant should do in the different phase.

  Key words: project of software development surveillance flow

  一、三U类型的信息化监理项目介l?/p>

  按照信息化工E项目本w的特点Q信息化工程目监理可以划分Zc:g|络集成目的监理、Y件品实施型信息化项目的监理以及软g开发型信息化项目的监理。下面分别介l这三类监理工作的特点:

  g|络集成目的监理:q类目Q主要包括综合布U和|络pȝ集成。这cȝ理最主要的特ҎQ硬件网l集成项目的评测标准是非常明,易于执行的。比如,l合布线的监理依据有“中国工程建筑标准化协会标准CESC89:97.5建筑与徏{群l合布线pȝ工程施工和验收规?#8221;?#8220;中华人民共和国通信行业标准YD/T926.11997大楼通信l合布线pȝ”{,|络质量监理依据?#8220;ANSIX3T9.5光纤分布式数据接口标准规?#8221;{,q些都是直接面向l果的规范。所以,相对于Y件品实施型信息化项目的监理和Y件开发型信息化项目的监理Q硬件网l集成项目的监理是比较简单的?/p>

  软g产品实施型信息化目的监理:q类目Q主要是面向各厂商开发出来的产品软gQ选择出合适的软g产品QƈҎ企业需求进行实施。相对于g|络集成目的监理,q类目涉及到对于Y件应用的评测Q而目前对于Y件评,国家q没有相应的标准来控制。事实上QY件实施评也不容易Ş成统一的标准,q造成了此c项目监理一定的隑ֺ?/p>

  软g开发型信息化项目的监理Q这c项目,主要是基于一定的g|络设施Q由承徏Ҏ据徏设方需求开发出一套能够满_设方需求的软gpȝ。由于Y件开发工作,是知识密集程度非帔R的工作,在某U程度上Q也是非怸性化的。目前对于Y件开发项目的各种标准Q多是针对Y件开发过E的控制Q比如术语、文档等。因此这c项目监理也有一定难度?/p>

  W者将l合自n的Y件开发型目监理的经历,此cM息化目监理工作的流E研I进行初步的试探?/p>

  ׃方和监理方的关系始于双方监理合同的签订,所以本文的监理程从监理合同签订开始。但鉴于在合同签订前监理方的前期准备工作是监理后l工作的基础Q因此先描述监理方的准备工作是非常必要的?/p>

  在签订监理合同之前,监理公司首先应对单位q行需求调研。此ơ需求调研的直接目的是ؓ了编制更详细的项目徏议书以获得监理合同,同时也是为招投标阶段~制招标文g做准备。此ơ调研主要明如下问题:方在该项目上M上要辑ֈ什么目标?l分后分别是什么目标?质量上要辑ֈ什么要求?旉斚w的要求?投资预算多少Q等。最后完成项目徏议书和初步监理规划?/p>

  下面详l叙q每个阶D늚特点及监理方在该阶段的工作?/p>

  二、Y件开发型目监理基本程

  1、招投标阶段

  在招投标阶段Q监理方主要工作是根据前期调研工作,协助方编制招标文Ӟ协助方评标及保管合同及文档。其中招标文件应包括Q投标hȝ、招标项目性质、技术要求、质量要求、工期要求、培训要求、验收要求、报仯求、投标h资质{要求、投标保证金要求、投标文件编制要求、评标标准、U担保函、合同主要条Ƅ内容。而协助评标工作主要则从以下方面入手:

  ⑴、技术方?/p>

  对于技术方面的评比Q一般有两种ҎQ一是比较法Q二是打分法。比较法一般是从标书的技术部分中选取一些关键技术进行横向比较,谁的参数最接近标书要求Q谁的技术评比的名次p靠前。相对于比较法,打分法的_性更高些。打分法也是从标书中选择关键技术参敎ͼ按照预定好的权D分D行打分,分数高者就在技术方面具有更大优ѝ两U方法各有长短。打分法一般适用于需要提取的关键技术种cL较多比较复杂且具有较大的成熟度、能较清晰划分高下的情况Q但在目前的评标工作中,一般都是采用比较法?/p>

  在技术方面,同时q应该考虑投标单位的技术背景等信息。比如公司具有的CMM{Q是否有q类似项目的开发经验以及过去项目的客户反馈{?/p>

  ch格方?/p>

  在h格方面,监理方应协助招标方对评标仯行评比。在核算时应注意如下因素Q?/p>

  ①、Lh否等于各分项报h之和。如果L价不{于各分Ҏ价之和,则以各分Ҏ价之和ؓ准,价差按误差处理?/p>

  ②、货币{换。如果投标h所使用的货币不一P则需Ҏ开标当日中国国家外汇管理局公布的各U货币对元汇率的卖ZhQ将非美元报h成元报h后再q行比较?/p>

  ③、报L的处理。对照投标文件的要求核对每一ҎP如果发现有缺ҎP按规定必d发函澄清Q如果属实则这一标中所报该的q_报h补充投标商缺Ҏ仯评标h|q且注明该项补遗的相x标在招标文g中的序号及理由。如果缺的总金额超q开标h格的5%Ӟ则可视ؓ重大偏差?/p>

  ④、超范围投标目的处理。投标商在投标文件中过投标文g规定范围投报的项目,原则上不能作为增减因素修改评标h|也不可以发函澄清其报仗只有当范围投标项目在报h表中有单独列名报hQ经批准可以从评标hg扣除Qƈ且在表下注明该项报h在投标文件中的编号以及理由?/p>

  l过调整补充所得到的报价则UCؓ评标P对评标hq行评比和排序即得到h斚w的评结果?/p>

  ⑶、其它方?/p>

  M产品的生产,都着重对质量、成本和交货期三斚w的控制。对于Y件开发项目,除了技术因素和h因素Q交货期也是一个重要的指标。所以投标书所报的交货期也需重点考虑。与此同Ӟ技术规范中所要求的有x务费用,投标人的信誉Q售后服务等因素也需要考虑到?/p>

  2、M规划阶段

  在招投标阶段定中标人,甲乙双方{订合同之后Q整个项目就形成了徏设方、承建方和监理方的三方ƈ存协作的一个团体,因此合理l一的规划就是项目成功的基础。M规划阶段的主要Q务,是在承建方制定出项目规划后Q对光目规划审查,q根据承建方的项目规划,修订前期制定的监理项目规划?/p>

  监理规划的性质Q是监理方对整个目工作的初步设计,是具体的监理zd的基。监理规划一般由监理方在该项目的ȝ理工E师制定。其基本内容应包括:

  ⑴、工E概c包括工E名U、徏讑֜址Q项目组成及规模Q预计L资额Q预计项目工期,工程质量{Q设计、开发单位名Uͼ工程特点{?/p>

  c监理范围和目标。监理范围一般包括在工程各阶D늚质量控制、进度控制和投资控制Q以及其它委托服务。监理目标以三大控制为目标?/p>

  ⑶、主要监理措施?/p>

  ⑗监理组l机构?/p>

  ⑸、项目监理工作制度。如监理方内部的工作会议制度、监理日志制度、监理周报和月报制度Q监理方与另两方的定期沟通制度等?/p>

  q个阶段l束Ӟ监理方应提交Q监理规划?/p>

  3、需求分析阶D?/p>

  需求分析是目的基矻I监理方在需求分析阶D应以尊重承建方的项目管理和目分析能力为前提,在具体的d开展上不深入、不q扰承徏方的自主权。同Ӟ监理方要充分发挥好项目监督及沟通徏设方和承建方之间的桥梁作用?/p>

  需求分析的工作ҎQ通常有三个阶Dc?/p>

  W一阶段Q访谈阶Dc这一阶段是和具体用户方的领导层、业务层人员的访谈式沟通,目的是从宏观了解用户需求方向和势Q了解现有组l构架、业务流E、Yg环境及用情c实现手D通常是事先将调查问卷发放到待调研部门Q然后在U定旉围绕问卷q行交流访谈?/p>

  W二阶段Q深入阶Dc这一阶段的工作是建立在访谈阶D工作完成,承徏方已l了解了用户的组l构架、业务流E、Yg环境及用情늭基本现状的基之上。承建方Ҏ以往目l验以及业务专家的经验,和徏设方共同探讨业务模型的合理性、准性和发展方向{问题,得到相对先进的业务模型?/p>

  W三阶段Q确认阶Dc在完成上两阶段的工作之后,需要对具体的流E细化,Ҏ据进行确认了。根据前两个阶段的工作,承徏方应草拟Z份需求分析报告,q提供原型演C系l,和徏设方q行q一步的讨论Q最l确定一份需求分析报告?/p>

  需要指出的是,在系l徏讄q程中,特别在采用P代法的开发模式时Q需求分析的工作需一直进行下去,而在后期的需求改q中Q工作则基本集中在后两个阶段中?/p>

  监理方在q三个阶D늚工作Q按照内容可以分Z部分Q监督和沟通。监督工作包括对需求分析阶D늚各种文档的保监督,Ҏ建方的访谈活动的监督Q对需求分析报告、原型演C系l的认{;沟通工作则表现在当方和承徏方由于知识背景不同而在访谈q程中沟通不畅的时候,监理方应利用自n优势使得双方利理解Ҏ?/p>

  需求分析阶D,监理方可参考的标准有:GB938588计算Y仉求说明编写指南?/p>

  q个阶段监理方应提交Q在需求分析进行前提交需求分析阶D늛理细则、监理日志、在需求分析结束后提交需求分析阶D|ȝ报告?/p>

  4、概要设计阶D?/p>

  概要设计Q即Y仉求{化ؓ数据l构和Y件的pȝl构Q一般包括数据设计和pȝl构设计。其中数据设计侧重于数据l构的定义,pȝl构设计定义软gpȝ各主要成份之间的关系?/p>

  在承建方q行概要设计的过E中Q监理方需要监督以下方面:

  ⑴、制定规?/p>

  在进入Y件开发阶D之初,首先应ؓ软g开发组制定在设计时应该共同遵守的标准,以便协调l内各成员的工作。包括:

  阅读和理解Y仉求说明书Q确认用戯求能否实玎ͼ明确实现的条Ӟ从而确定设计的目标Q以及它们的优先序Q?/p>

  Ҏ目标定最合适的设计ҎQ?/p>

  规定设计文档的编制标准;

  规定~码的信息Ş式,与硬Ӟ操作pȝ的接口规U,命名规则?/p>

  cY件系l结构的M设计

  Ҏ需求分析,Z功能层次l构建立pȝQ其中包括采用某U设计方法,系l按功能划分成模块的层次l构、确定每个模块的功能、徏立与已确定的软g需求的对应关系、确定模块间的调用关pR确定模块间的接口、评估模块划分的质量?/p>

  ⑶、处理方式设?/p>

  处理方式设计要确定ؓ实现pȝ的功能需求所必需的算法,评估法的性能Q确定ؓ满pȝ的性能需求所必需的算法和模块间的控制方式Q确定外部信L接收发送Ş式?/p>

  ⑗数据结构设?/p>

  Ҏ需求分析报告进行数据库设计。数据库设计包括定软g涉及的文件系l的l构以及数据库的模式、子模式Q进行数据完整性和安全性的设计Q确定输入,输出文g的详l的数据l构Q结合算法设计,定法所必需的逻辑数据l构及其操作Q确定对逻辑数据l构所必需的那些操作的E序模块(软g?Q限制和定各个数据设计决策的媄响范_若需要与操作pȝ或调度程序接口所必须的控制表{数据时Q确定其详细的数据结构和使用规则Q数据的保护性设计;数据的一致性设计;冗余性设计等?/p>

  ⑸、可靠性设?/p>

  可靠性设计也叫做质量设计。在q行q程中,Z适应环境的变化和用户新的要求Q需l常对Y件进行改造和修正。在软g开发的一开始就要确定Y件可靠性和其它质量指标Q考虑相应措施Q以使得软g易于修改和易于维护?/p>

  ⑏V概要设计阶D늚文档

  概要设计阶段完成时应~写以下文档Q概要设计说明书、数据库设计说明书、用h册、制定初步的试计划?/p>

  针对上述工作Q监理方应按如下标准评定承徏方的概要设计Q?/p>

  ⑴、可q溯性:认该设计是否覆盖了所有已定的Y仉求,软g每一成䆾是否可追溯到某一w求;

  c接口:认该Y件的内部接口与外部接口是否已l明定义,模块是否满高内聚和低耦合的要求,模块作用范围是否在其控制范围之内Q?/p>

  ⑶、风险:认该设计在现有技术条件下和预范围内是否能按时实玎ͼ

  ⑗实用性:认该设计对于需求的解决Ҏ是否实用Q?/p>

  ⑸、技术清晰度Q确认该设计是否以一U易于翻译成代码的Ş式表达;

  ⑏V可l护性:认该设计是否考虑了方便未来的l护Q?/p>

  ⑺、质量:认该设计是否表现出良好的质量特征;

  ⑅R各U选择ҎQ看是否考虑q其它方案,比较各种选择Ҏ的标准是什么;

  ⑹{限Ӟ评估对该软g的限制是否现实,是否与需求一_

  ⑽、其它具体问题:对于文档、可试性、设计过E等q行评估?/p>

  q个阶段监理方应提交Q在概要设计q行前提交M设计阶段监理l则、监理周记、在概要设计完成后提交概要设计监理报告?/p>

  5、详l设计阶D?/p>

  详细设计阶段的直接目标是~写详细设计说明书,为此Q承建方应做如下工作Q?/p>

  ⑴、确定每个模块的法Q用工具表达法的过E,写出模块的详l过E性描qͼ

  c确定每一模块的数据结构;

  ⑶、确定模块接口细节?/p>

  监理方在q个阶段主要是在q度上进行控Ӟ主要手段是定期与承徏Ҏ通,查文档?/p>

  q个阶段监理方应提交Q在详细设计q行前提交详l设计阶D늛理细则、监理周记、在详细设计完成后提交详l设计说明书的确认报告?/p>

  6、编码及试阶段

  ~码是将详细设计阶段的设计思想用某U计机语言实现的过E。监理方应从l构化程序设计原则来q行~码工作的监理:

  ⑴、用语a中的序、选择、重复等有限的基本控制结构表C程序逻辑Q?/p>

  c选用的控制结构只准许有一个入口和一个出口;

  ⑶、程序语句组成容易识别的块,每块只有一个入口和一个出口;

  ⑗复杂结构应该用基本控制l构q行l合嵌套来实玎ͼ

  ⑸、语a中没有的控制l构Q可用一D늭LE序D|拟,但要求该E序D在整个pȝ中应前后一_

  通常试是伴随着~码而同时进行的。广义上软g试q只在q个阶段才有Q而是贯穿软g需求分析、概要设计、详l设计等阶段的。本处的试Q则指代码测试。在试阶段Q监理方应依据测试原则对承徏方的试q行监督Q?/p>

  ⑴、应早的和不断的进行Y件测试;

  c测试用例应由测试输入数据和对应的预期输出结果这两部分组成;

  ⑶、程序员应避免检查自qE序Q?/p>

  ⑗在设计试用例Ӟ应包括合理的输入条g和不合理的输入条Ӟ

  ⑸、充分注意测试中的群集现象,即一般测试后E序中残存的错误数目与该E序中已发现的错误数目成正比Q?/p>

  ⑏V严格执行测试计划,排除试的随意性;

  ⑺、应当对每一个测试结果做全面查?/p>

  ⑅R妥善保存测试计划,试用例Q出错统计和最l分析报告,为维护提供方ѝ?/p>

  在编码及试阶段监理方可参考的标准有:GB938688计算Y件测试文件编制规范、GB/T1250490计算Y件质量标准保证计划规范、GB/T1250590计算Y仉|管理计划规范、GB/T1553295计算Y件单元测试等?/p>

  7、系l试q行阶段

  ׃信息化Y件一般都是比较大型的软gQ因此在完成了系l测试后q需要经q一D|间的试运行。系l试q行实际是测试的延箋Q检查系l的E_性、适用性等。监理方在这个阶D늚主要工作有:

  ⑴、审核竣工文档资料的完整性、可L及其与工程实际的一致性;

  c审核操作系l、应用系l等软g配置与设计方案的W合性;

  ⑶、检验证系l功能性能与合同的W合性;

  ⑗检查h员培训计划落实情况;

  ⑸、出具验收报告;

  ⑏V帮助用户制定系l运行管理规章制度;

  ⑺、在保修期内定期或不定期寚w目进行质量检查、督促承建方按合同要求进行维护?/p>

  结

  从监理合同签订开始到最后系l试q行l束Q监理方工作在职能上可以归结Z点:沟通与监督。沟通的目标是徏设方与承建方信息对等Q沟通的手段是定期或不定期召开工作会议Q监督的目标是在质量、进度和投资上进行控Ӟ监督的手D|合同理和文档管理?/p>

  参考文?/p>

  1.葛乃P|四l信息工E徏讄理电子工业出版社2002q?br>  2.张v藩Y件工E导论清华大学出版社1998q?br>  3.黄学战项目需求阶D늚监理角色和方法论中国计算机报2003q第三期




]]>
p的情怀---香港旧梦1http://www.shnenglu.com/guangping/archive/2009/06/29/88731.html王光q?/dc:creator>王光q?/author>Sun, 28 Jun 2009 16:27:00 GMThttp://www.shnenglu.com/guangping/archive/2009/06/29/88731.htmlhttp://www.shnenglu.com/guangping/comments/88731.htmlhttp://www.shnenglu.com/guangping/archive/2009/06/29/88731.html#Feedback1http://www.shnenglu.com/guangping/comments/commentRss/88731.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/88731.html

]]>
Linux 下串口编E入?/title><link>http://www.shnenglu.com/guangping/archive/2009/06/28/66914.html</link><dc:creator>王光q?/dc:creator><author>王光q?/author><pubDate>Sun, 28 Jun 2009 15:16:00 GMT</pubDate><guid>http://www.shnenglu.com/guangping/archive/2009/06/28/66914.html</guid><wfw:comment>http://www.shnenglu.com/guangping/comments/66914.html</wfw:comment><comments>http://www.shnenglu.com/guangping/archive/2009/06/28/66914.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.shnenglu.com/guangping/comments/commentRss/66914.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guangping/services/trackbacks/66914.html</trackback:ping><description><![CDATA[ <div id="bxtvpbb" class="title"> <h1>Linux 下串口编E入?/h1> </div> <b>计算Z口的引脚定义<br /><br /></b> <table 80%="" border="1" cellpadding="0" cellspacing="0"> <tbody> <tr> <td 10%="" align="center">序号</td> <td 30%="" align="center">信号名称</td> <td 10%="" align="center">W号</td> <td 10%="" align="center">向</td> <td 40%="" align="center">功能</td> </tr> <tr> <td align="center">2</td> <td align="center">发送数?/td> <td align="center">TXD</td> <td align="center">DTE→DCE</td> <td>DTE发送串行数?/td> </tr> <tr> <td align="center">3</td> <td align="center">接收数据</td> <td align="center">RXD</td> <td align="center">DTE←DCE</td> <td>DTE 接收串行数据</td> </tr> <tr> <td align="center">4</td> <td align="center">h发?/td> <td align="center">RTS</td> <td align="center">DTE→DCE</td> <td>DTE h DCE 线路切换到发送方?/td> </tr> <tr> <td align="center">5</td> <td align="center">允许发?/td> <td align="center">CTS</td> <td align="center">DTE←DCE</td> <td>DCE 告诉 DTE U\已接通可以发送数?/td> </tr> <tr> <td align="center">6</td> <td align="center">数据讑֤准备?/td> <td align="center">DSR</td> <td align="center">DTE←DCE</td> <td>DCE 准备?/td> </tr> <tr> <td align="center">7</td> <td align="center">信号?/td> <td align="center"> </td> <td align="center"> </td> <td>   信号公共?/td> </tr> <tr> <td align="center">8</td> <td align="center">载L?/td> <td align="center">DCD</td> <td align="center">DTE←DCE</td> <td>表示 DCE 接收到远E蝲?/td> </tr> <tr> <td align="center">20</td> <td align="center">数据l端准备?/td> <td align="center">DTR</td> <td align="center">DTE→DCE</td> <td>DTE 准备?/td> </tr> <tr> <td align="center">22</td> <td align="center">振铃指示</td> <td align="center">RI</td> <td align="center">DTE←DCE</td> <td>表示 DCE 与线路接通,出现振铃</td> </tr> </tbody> </table> <a name="N1013B"> <span id="txhthbr" class="atitle">串口操作<br /></span> </a> <p>串口操作需要的头文? </p> <pre class="displaycode">#include <stdio.h> /*标准输入输出定义*/<br />#include <stdlib.h> /*标准函数库定?/<br />#include <unistd.h> /*Unix 标准函数定义*/<br />#include <br />#include <br />#include <fcntl.h> /*文g控制定义*/<br />#include <termios.h> /*PPSIX l端控制定义*/<br />#include <errno.h> /*错误号定?/<br /></errno.h></termios.h></fcntl.h></unistd.h></stdlib.h></stdio.h></pre> <p> <a name="N10148"> <span id="bfztfdr" class="atitle">打开串口</span> </a> </p> <p> ?Linux 下串口文件是位于 /dev 下的 </p> <p>串口一 ?/dev/ttyS0 </p> <p>串口??/dev/ttyS1 </p> <p>打开串口是通过使用标准的文件打开函数操作Q? </p> int fd; /*以读写方式打开串口*/ <br />fd = open( "/dev/ttyS0", O_RDWR);//| O_NOCTTY | O_NDELAY<br />if (-1 == fd)<br />{ <br /> /* 不能打开串口一*/ <br /> perror(" 提示错误Q?); <br />}<br /><p><a name="N1015E"><span id="jlpdvnb" class="atitle">讄串口</span></a></p><p>最基本的设|串口包括L特率讄Q效验位和停止位讄?/p><p>串口的设|主要是讄 struct termios l构体的各成员倹{? </p><pre class="displaycode">struct termio<br />{ unsigned short c_iflag; /* 输入模式标志 */ <br /> unsigned short c_oflag; /* 输出模式标志 */ <br /> unsigned short c_cflag; /* 控制模式标志*/ <br /> unsigned short c_lflag; /* local mode flags */ <br /> unsigned char c_line; /* line discipline */ <br /> unsigned char c_cc[NCC]; /* control characters */<br />};<br /></pre><p>讄q个l构体很复杂Q我q里只说说常见的一些设|: </p><p>波特率设|?/p><p>下面是修ҎL特率的代码:</p><pre class="displaycode">struct termios Opt;<br />tcgetattr(fd, &Opt);<br />cfsetispeed(&Opt,B19200); /*讄?9200Bps*/<br />cfsetospeed(&Opt,B19200);<br />tcsetattr(fd,TCANOW,&Opt);<br />讄波特率的例子函数Q?br />/**<br />*@brief 讄串口通信速率<br />*@param fd cd int 打开串口的文件句?br />*@param speed cd int 串口速度<br />*@return void<br />*/<br />int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,<br /> B38400, B19200, B9600, B4800, B2400, B1200, B300, };<br /><!-- code sample is too wide -->int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, <br /> 19200, 9600, 4800, 2400, 1200, 300, };<br />void set_speed(int fd, int speed){<br /> int i; <br /> int status; <br /> struct termios Opt;<br /> tcgetattr(fd, &Opt); <br /> for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) { <br /> if (speed == name_arr[i]) { <br /> tcflush(fd, TCIOFLUSH); <br /> cfsetispeed(&Opt, speed_arr[i]); <br /> cfsetospeed(&Opt, speed_arr[i]); <br /> status = tcsetattr(fd1, TCSANOW, &Opt); <br /> if (status != 0) { <br /> perror("tcsetattr fd1"); <br /> return; <br /> } <br /> tcflush(fd,TCIOFLUSH); <br /> } <br /> }<br />}<br />效验位和停止位的讄Q?br /></pre><table 100%="" border="1" cellpadding="0" cellspacing="0"><tbody><tr><td 20%="" align="center">无效?/td><td 20%="" align="center">8?/td><td 60%=""> Option.c_cflag &= ~PARENB; <br /> Option.c_cflag &= ~CSTOPB; <br /> Option.c_cflag &= ~CSIZE; <br /> Option.c_cflag |= ~CS8; </td></tr><tr><td 20%="" align="center">奇效?Odd)</td><td 20%="" align="center">7?/td><td 60%=""> Option.c_cflag |= ~PARENB; <br /> Option.c_cflag &= ~PARODD; <br /> Option.c_cflag &= ~CSTOPB; <br /> Option.c_cflag &= ~CSIZE; <br /> Option.c_cflag |= ~CS7; </td></tr><tr><td 20%="" align="center">偶效?Even)</td><td 20%="" align="center">7?/td><td 60%=""> Option.c_cflag &= ~PARENB; <br /> Option.c_cflag |= ~PARODD; <br /> Option.c_cflag &= ~CSTOPB; <br /> Option.c_cflag &= ~CSIZE; <br /> Option.c_cflag |= ~CS7; </td></tr><tr><td 20%="" align="center">Space效验</td><td 20%="" align="center">7?/td><td 60%=""> Option.c_cflag &= ~PARENB; <br /> Option.c_cflag &= ~CSTOPB; <br /> Option.c_cflag &= &~CSIZE; <br /> Option.c_cflag |= CS8; </td></tr></tbody></table><pre class="displaycode">讄效验的函敎ͼ<br />/**<br />*@brief 讄串口数据位,停止位和效验?br />*@param fd cd int 打开的串口文件句?br />*@param databits cd int 数据? 取??7 或?<br />*@param stopbits cd int 停止? 取gؓ 1 或?<br />*@param parity cd int 效验cd 取gؓN,E,O,,S<br />*/<br />int set_Parity(int fd,int databits,int stopbits,int parity)<br />{ <br /> struct termios options; <br /> if ( tcgetattr( fd,&options) != 0) { <br /> perror("SetupSerial 1"); <br /> return(FALSE); <br /> }<br /> options.c_cflag &= ~CSIZE; <br /> switch (databits) /*讄数据位数*/<br /> { <br /> case 7: <br /> options.c_cflag |= CS7; <br /> break;<br /> case 8: <br /> options.c_cflag |= CS8;<br /> break; <br /> default: <br /> fprintf(stderr,"Unsupported data size\n"); return (FALSE); <br /> }<br />switch (parity) <br />{ <br /> case 'n':<br /> case 'N': <br /> options.c_cflag &= ~PARENB; /* Clear parity enable */<br /> options.c_iflag &= ~INPCK; /* Enable parity checking */ <br /> break; <br /> case 'o': <br /> case 'O': <br /> options.c_cflag |= (PARODD | PARENB); /* 讄为奇效验*/ <br /> options.c_iflag |= INPCK; /* Disnable parity checking */ <br /> break; <br /> case 'e': <br /> case 'E': <br /> options.c_cflag |= PARENB; /* Enable parity */ <br /> options.c_cflag &= ~PARODD; /* 转换为偶效验*/ <br /> options.c_iflag |= INPCK; /* Disnable parity checking */<br /> break;<br /> case 'S': <br /> case 's': /*as no parity*/ <br /> options.c_cflag &= ~PARENB;<br /> options.c_cflag &= ~CSTOPB;break; <br /> default: <br /> fprintf(stderr,"Unsupported parity\n"); <br /> return (FALSE); <br /> } <br />/* 讄停止?/ <br />switch (stopbits)<br />{ <br /> case 1: <br /> options.c_cflag &= ~CSTOPB; <br /> break; <br /> case 2: <br /> options.c_cflag |= CSTOPB; <br /> break;<br /> default: <br /> fprintf(stderr,"Unsupported stop bits\n"); <br /> return (FALSE); <br />} <br />/* Set input parity option */ <br />if (parity != 'n') <br /> options.c_iflag |= INPCK; <br />tcflush(fd,TCIFLUSH);<br />options.c_cc[VTIME] = 150; /* 讄时15 seconds*/ <br />options.c_cc[VMIN] = 0; /* Update the options and do it NOW */<br />if (tcsetattr(fd,TCSANOW,&options) != 0) <br />{ <br /> perror("SetupSerial 3"); <br /> return (FALSE); <br />} <br />return (TRUE); <br />}<br /></pre><p><b>需要注意的?</b></p><p>如果不是开发终端之cȝQ只是串口传输数据,而不需要串口来处理Q那么用原始模?Raw Mode)方式来通讯Q设|方式如下: <br /></p><pre class="displaycode">options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/<br />options.c_oflag &= ~OPOST; /*Output*/<br /></pre><p><a name="N10200"><span id="lfhjdlr" class="atitle">d串口</span></a></p><p> 讄好串口之后,d串口很Ҏ了,把串口当作文件读写就是? </p> 发送数?br /><pre class="displaycode">char buffer[1024];int Length;int nByte;nByte = write(fd, buffer ,Length)<br /></pre>d串口数据 <p>使用文g操作read函数dQ如果设|ؓ原始模式(Raw Mode)传输数据Q那么read函数q回的字W数是实际串口收到的字符数? </p><p>可以使用操作文g的函数来实现异步dQ如fcntlQ或者select{来操作?<br /></p><pre class="displaycode">char buff[1024];int Len;int readByte = read(fd,buff,Len);<br /></pre><p><a name="N10220"><span id="xrjfzpn" class="atitle">关闭串口</span></a></p><p> 关闭串口是关闭文g?<br /></p><pre class="displaycode">close(fd);</pre><img src ="http://www.shnenglu.com/guangping/aggbug/66914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guangping/" target="_blank">王光q?/a> 2009-06-28 23:16 <a href="http://www.shnenglu.com/guangping/archive/2009/06/28/66914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI命o一览表http://www.shnenglu.com/guangping/archive/2008/08/21/59516.html王光q?/dc:creator>王光q?/author>Thu, 21 Aug 2008 05:08:00 GMThttp://www.shnenglu.com/guangping/archive/2008/08/21/59516.htmlhttp://www.shnenglu.com/guangping/comments/59516.htmlhttp://www.shnenglu.com/guangping/archive/2008/08/21/59516.html#Feedback0http://www.shnenglu.com/guangping/comments/commentRss/59516.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/59516.html VI命o一览表Q?/font>


q入vi的命?/span>
vi filename :打开或新建文Ӟq将光标|于W一行首
vi +n filename Q打开文gQƈ光标置?font color="#ff6600">Wn行首

vi + filename Q打开文gQƈ光标置?font color="#ff6600">最后一行首
vi +/pattern filenameQ打开文gQƈ光标置于第一个与pattern匚w的串?
vi -r filename Q在上次正用vi~辑时发生系l崩溃,恢复filename
vi filename....filename Q打开多个文gQ依ơ进行编?

Ud光标cd?/span>
h ?BackspaceQ: 光标左移一个字W?
l ?spaceQ: 光标右移一个字W?
k ?Ctrl+pQ? 光标上移一?
j ? Enter ?Ctrl+n Q光标下UM?


w Q? 光标右移一个字臛_?

W Q光标右UM个字臛_首,忽略标点W号
b ?B Q? 光标左移一个字臛_?
e ?E Q? 光标右移一个字臛_?


) Q光标移臛_?
( Q光标移臛_?
}Q光标移x落开?
{Q光标移x落结?


nGQ光标移至第n行首
n+Q光标下Un?
n-Q光标上Un?
n$Q光标移至第n行尾
H Q光标移臛_q顶?
M Q光标移臛_q中间行
L Q光标移臛_q最后行
0Q(注意是数字零Q光标移臛_前行?
$Q光标移臛_前行?

屏幕Lcd?/span>
Ctrl+uQ?向文仉d?
Ctrl+dQ?向文件尾d?
Ctrl+fQ? 向文件尾M?
CtrlQbQ向文g首翻一?
nzQ? 第n行滚臛_q顶部,不指定n时将当前行滚臛_q顶部?

插入文本cd?/span>
i Q在光标?
I Q在当前行首
aQ光标后
AQ在当前行尾
oQ在当前行之下新开一?
OQ在当前行之上新开一?
rQ替换当前字W?
RQ替换当前字W及其后的字W,直至按ESC?
sQ从当前光标位置处开始,以输入的文本替代指定数目的字W?
SQ删除指定数目的行,q以所输入文本代替?
ncw或nCWQ修Ҏ定数目的?
nCCQ修Ҏ定数目的?

删除命o
ndw或ndWQ删除光标处开始及其后的n-1个字
doQ删臌?
d$Q删臌?
nddQ删除当前行及其后n-1?
x或XQ删除一个字W,x删除光标后的Q而X删除光标前的
Ctrl+uQ删除输入方式下所输入的文?

搜烦及替换命?/span>
/patternQ从光标开始处向文件尾搜烦pattern
?patternQ从光标开始处向文仉搜烦pattern
nQ在同一方向重复上一ơ搜索命?
NQ在反方向上重复上一ơ搜索命?
Qs/p1/p2/gQ将当前行中所有p1均用p2替代
Qn1,n2s/p1/p2/gQ将Wn1至n2行中所有p1均用p2替代
Qg/p1/s//p2/gQ将文g中所有p1均用p2替换

选项讄
allQ列出所有选项讄情况
termQ设|终端类?
ignoranceQ在搜烦中忽略大写
listQ显C制表位(Ctrl+I)和行标志($)
numberQ显C?
reportQ显C由面向行的命o修改q的数目
terseQ显C简短的警告信息
warnQ在转到别的文g时若没保存当前文件则昄NO write信息
nomagicQ允许在搜烦模式中,使用前面不带“\”的Ҏ字符
nowrapscanQ禁止vi在搜索到达文件两端时Q又从另一端开?
mesgQ允许vi昄其他用户用write写到自己l端上的信息

末行方式命o
Qn1,n2 co n3Q将n1行到n2行之间的内容拯到第n3行下
Qn1,n2 m n3Q将n1行到n2行之间的内容U至到第n3行下
Qn1,n2 d Q将n1行到n2行之间的内容删除
Qw Q保存当前文?
Qe filenameQ打开文gfilenameq行~辑
QxQ保存当前文件ƈ退?
QqQ退出vi
Qq!Q不保存文gq出vi
Q?commandQ执行shell命ocommand
Qn1,n2 w!commandQ将文g中n1行至n2行的内容作ؓcommand的输入ƈ执行之,若不指定n1Qn2Q则表示整个文件内容作为command的输?
Qr!commandQ将命ocommand的输出结果放到当前行

寄存器操?/span>
"?nyyQ将当前行及其下n行的内容保存到寄存器Q中Q其?Z个字母,nZ个数?
"?nywQ将当前行及其下n个字保存到寄存器Q中Q其?Z个字母,nZ个数?
"?nylQ将当前行及其下n个字W保存到寄存器?中,其中?Z个字母,nZ个数?
"?pQ取出寄存器Q中的内容ƈ其攑ֈ光标位置处。这里?可以是一个字母,也可以是一个数?
nddQ将当前行及其下共n行文本删除,q将所删内Ҏ?号删除寄存器中?/p>

光标控制命o

命o 光标Ud

h ?/span> ^h 向左UM个字W?/span>

j ?/span> ^j ?/span> ^n 向下UM?/span>

k ?/span> ^p 向上UM?/span>

l 或空?/span> 向右UM个字W?/span>

G Ud文g的最后一?/span>

nG Ud文g的第 n ?/span>

w Ud下一个字的开?/span>

W Ud下一个字的开_忽略标点W号

b Ud前一个字的开?/span>

B Ud前一个字的开_忽略标点W号

L Ud屏幕的最后一?/span>

M Ud屏幕的中间一?/span>

H Ud屏幕的第一?/span>

e Ud下一个字的结?/span>

E Ud下一个字的结,忽略标点W号

( Ud句子的开?/span>

) Ud句子的结?/span>

{ UdD落的开?/span>

} Ud下一个段落的开?/span>

0 ?/span> | Ud当前行的W一?/span>

n| Ud当前行的W?/span> n ?/span>

^ Ud当前行的W一个非I字W?/span>

Q?span> Ud当前行的最后一个字W?/span>

+ ?/span> return Ud下一行的W一个字W?/span>

- Ud前一行的W一个非I字W?/span>

?/span> vi 中添加文?/span>

命o 插入动作

a 在光标后插入文本

A 在当前行插入文本

i 在光标前插入文本

I 在当前行前插入文?/span>

o 在当前行的下Ҏ入新?/span>

O 在当前行的上Ҏ入新?/span>

:r file d文g file 内容Qƈ插在当前行后

:nr file d文g file 内容Qƈ插在W?/span> n 行后

escape 回到命o模式

^v char 插入时忽?/span> char 的指定意义,q是Z插入Ҏ字符

?/span> vi 中删除文?/span>

命o 删除操作

x 删除光标处的字符Q可以在 x 前加上需要删除的字符数目

nx 从当前光标处往后删?/span> n 个字W?/span>

X 删除光标前的字符Q可以在 X 前加上需要删除的字符数目

nX 从当前光标处往前删?/span> n 个字W?/span>

dw 删至下一个字的开?/span>

ndw 从当前光标处往后删?/span> n 个字

dG 删除行,直到文gl束

dd 删除整行

ndd 从当前行开始往后删?/span>

db 删除光标前面的字

ndb 从当前行开始往前删?/span> n ?/span>

:n,md 从第 m 行开始往前删?/span> n ?/span>

d ?/span> dQ?span> 从光标处删除到行?/span>

dcursor_command 删除臛_标命令处Q如 dG 从当胆行删除x件的末尾

^h ?/span> backspace 插入Ӟ删除前面的字W?/span>

^w 插入Ӟ删除前面的字

修改 vi 文本

每个命o前面的数字表C命o重复的次?/span>

命o 替换操作

rchar ?/span> char 替换当前字符

R text escape ?/span> text 替换当前字符直到换下 Esc ?/span>

stext escape ?/span> text 代替当前字符

S ?/span> cctext escape ?/span> text 代替整行

cwtext escape 当前字改ؓ text

Ctext escape 当前行余下的改?/span> text

cG escape 修改x件的末尾

ccursor_cmd text escape 从当前位|处到光标命令位|处都改?/span> text

?/span> vi 中查找与替换

命o 查找与替换操?/span>

/text 在文件中向前查找 text

?text 在文件中向后查找 text

n 在同一方向重复查找

N 在相反方向重复查?/span>

ftext 在当前行向前查找 text

Ftext 在当前行向后查找 text

ttext 在当前行向前查找 text Qƈ光标定位在 text 的第一个字W?/span>

Ttext 在当前行向后查找 text Qƈ光标定位在 text 的第一个字W?/span>

:set ic 查找时忽略大写

:set noic 查找时对大小写敏?/span>

s/ pat1 /g ?/span> newtext 替换 oldtext

:m,ns/oldtext/newtext ?/span> m 行通过 n Q用 newtext 替换 oldtext

& 重复最后的 :s 命o

:g/text1/s/text2/text3 查找包含 text1 的行Q用 text3 替换 text2

:g/text/command 在所有包?/span> text 的行q行 command 所表示的命?/span>

:v/text/command 在所有不包含 text 的行q行 command 所表示的命?/span>

?/span> vi 中复制文?/span>

命o 复制操作

yy 当前行的内Ҏ入时缓冲区

nyy ?/span> n 行的内容攑օ临时~冲?/span>

p 时缓冲区中的文本攑օ光标?/span>

P 时缓冲区中的文本攑օ光标?/span>

"(a-z)nyy 复制 n 行放入名字ؓ圆括号内的可命名~冲区,省略 n 表示当前?/span>

"(a-z)ndd 删除 n 行放入名字ؓ圆括号内的可命名~冲区,省略 n 表示当前?/span>

"(a-z)p 名字ؓ圆括L可命名缓冲区的内Ҏ入当前行?/span>

"(a-z)P 名字ؓ圆括L可命名缓冲区的内Ҏ入当前行?/span>

?/span> vi 中撤消与重复

命o 撤消操作

u 撤消最后一ơ修?/span>

U 撤消当前行的所有修?/span>

. 重复最后一ơ修?/span>

, 以相反的方向重复前面?/span> f ?/span> F ?/span> t ?/span> T 查找命o

; 重复前面?/span> f ?/span> F ?/span> t ?/span> T 查找命o

"np 取回最后第 n ơ的删除 ( ~冲Z存有一定次数的删除内容Q一般ؓ 9)

n 重复前面?/span> / ?/span> ? 查找命o

N 以相反方向重复前面的 / ?/span> ? 命o

保存文本和退?/span> vi

命o 保存?/span> / 或退出操?/span>

:w 保存文g但不退?/span> vi

:w file 修改保存在 file 中但不退?/span> vi

:wq ?/span> ZZ ?/span> :x 保存文gq?/span> vi

:q! 不保存文Ӟ退?/span> vi

:e! 攑ּ所有修改,从上ơ保存文件开始再~辑

vi 中的选项

选项 作用

:set all 打印所有选项

:set nooption 关闭 option 选项

:set nu 每行前打印行?/span>

:set showmode 昄是输入模式还是替换模?/span>

:set noic 查找时忽略大写

:set list 昄制表W?/span> (^I) 和行?/span>

:set ts=8 为文本输入设|?/span> tab stops

:set window=n 讄文本H口昄 n ?/span>

:syntax on 语法加亮




VI的状?/strong>

选项 作用

:.= 打印当前行的行号

:= 打印文g中的行数

^g 昄文g名、当前的行号、文件的总行数和文g位置的百分比

:l 使用字母 "l" 来显C多的Ҏ字符Q如制表W和换行W?/span>

在文本中定位D落和放|标?/strong>

选项 作用

{ 在第一列插?/span> { 来定义一个段?/span>

[[ 回到D落的开头处

]] 向前Ud下一个段落的开头处

m(a-z) 用一个字母来标记当前位置Q如?/span> mz 表示标记 z

'(a-z) 光标移动到指定的标讎ͼ如用 'z 表示Ud?/span> z

?/span> vi 中连接行

选项 作用

J 下一行连接到当前行的末尾

nJ q接后面 n ?/span>

光标攄与屏q调?/strong>

选项 作用

H 光标移动到屏幕的顶?/span>

nH 光标移动到屏幕行下的W?/span> n ?/span>

M 光标移动到屏幕的中?/span>

L 光标移动到屏幕的底?/span>

nL 光标移动到屏幕底行上的W?/span> n ?/span>

^e(ctrl+e) 屏q上滚一?/span>

^y 屏q下滚一?/span>

^u 屏q上滚半?/span>

^d 屏q下滚半?/span>

^b 屏q上滚一?/span>

^f 屏q下滚一?/span>

^l 重绘屏幕

z-return 当前行|ؓ屏幕的顶?/span>

nz-return 当前行下的W?/span> n 行置为屏q的行

z. 当前行|ؓ屏幕的中?/span>

nz. 当前行上的W?/span> n 行置为屏q的中央

z- 当前行|ؓ屏幕的底?/span>

nz- 当前行上的W?/span> n 行置为屏q的底行

vi 中的 shell 转义命o

选项 作用

:!command 执行 shell ?/span> command 命oQ如 :!ls

:!! 执行前一?/span> shell 命o

:r!command d command 命o的输入ƈ插入Q如 :r!ls 会先执行 ls Q然后读入内?/span>

:w!command 当前已~辑文g作ؓ command 命o的标准输入ƈ执行 command 命oQ如 :w!grep all

:cd directory 当前工作目录更改ؓ directory 所表示的目?/span>

:sh 启动一个子 shell Q?/span> ^d(ctrl+d) q回 vi

:so file ?/span> shell E序 file 中读入和执行命o

vi 中的宏与~写

( 避免使用控制键和W号Q不要用字W?/span> K ?/span> V ?/span> g ?/span> q ?/span> v ?/span> * ?/span> = 和功能键 )

选项 作用

:map key command_seq 定义一个键来运?/span> command_seq Q如 :map e ea Q无Z么时候都可以 e Ud一个字的末来q加文本

:map 在状态行昄所有已定义的宏

:umap key 删除该键的宏

:ab string1 string2 定义一个羃写,使得当插?/span> string1 Ӟ?/span> string2 替换 string1 。当要插入文本时Q键?/span> string1 然后?/span> Esc 键,pȝ插入了 string2

:ab 昄所有羃?/span>

:una string 取消 string 的羃?/span>

?/span> vi 中羃q文?/span>

选项 作用

^i(ctrl+i) ?/span> tab 插入文本Ӟ插入Ud的宽度,Ud宽度是事先定义好?/span>

:set ai 打开自动~进

:set sw=n 移动宽度设|ؓ n 个字W?/span>

n<&lt; ?/span> n 行都向左Ud一个宽?/span>

n>> ?/span> n 行都向右Ud一个宽度,例如 3>> 将接下来的三行每行都向右移动一个移动宽?/span>



]]>
菩提本无树,明镜亦非?/title><link>http://www.shnenglu.com/guangping/archive/2008/08/19/59302.html</link><dc:creator>王光q?/dc:creator><author>王光q?/author><pubDate>Tue, 19 Aug 2008 01:13:00 GMT</pubDate><guid>http://www.shnenglu.com/guangping/archive/2008/08/19/59302.html</guid><wfw:comment>http://www.shnenglu.com/guangping/comments/59302.html</wfw:comment><comments>http://www.shnenglu.com/guangping/archive/2008/08/19/59302.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.shnenglu.com/guangping/comments/commentRss/59302.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guangping/services/trackbacks/59302.html</trackback:ping><description><![CDATA[ <h2> </h2> <div class="xjzlnnt" id="articlecontent"> <p> <font face="楷体_GB2312" size="3">此乃六祖慧能的悟之aQ因为其师兄的:w似菩提树,心似明镜収ͼ时时勤拂拭,不惹尘?。六感觉悟不dQ于是他吟出了:菩提本无?明镜亦非?本来无一?何处惹尘??/font> </p> <p> <font face="楷体_GB2312" size="3">从字面上Ԍ菩提树是I的Q明镜台也是I的Qn与心俱是I的Q本来无一物的I,又怎么可能惹尘埃呢?</font> </p> <p> <br /> <font face="楷体_GB2312"> <font size="3"> 佛对我说Q你的心上有。我用力地擦拭?br />  佛说Q你错了Q尘是擦不掉的。我于是心剥了下来.<br />  佛又_你又错了Q尘本非,何来有尘<br />  我领悟不透,是什么意思?<br />  我想q是从神U和慧能那两个偈子引申出来?br />  秀_“n是菩提树Q心如明镜台Q时时勤拂拭Q勿使惹埃。?br />  慧能_“菩提本无树Q明镜亦非台Q本来无一物,何处惹尘埃。?br />  的确Q要能够参透这两个偈子的确很难Q就是正的理解也不易?br />  参悟不?..<br />  w是菩提树,心如明镜収ͼ时时勤拂拭,勿惹尘?br />  众生的n体就是一觉悟的智慧树,<br />  众生的心灵就象一座明亮的台镜?br />  要时时不断地它掸拂擦试Q?br />  不让它被垢污染障蔽了光明的本性?br />  <br />  菩提本无树,明镜亦非収ͼ本来无一物,何处惹尘?br />  菩提原本没有树Q?br />  明亮的镜子也q不是台?br />  本来是虚无没有一物,<br />  那里会染上什么尘?<br />  现在只能从字面上ȝ解它Q惨悟不透!<br />  心本无尘Q尘x心。无心无,Z歅R?br />  <br />  其实在外,心在内,常拂之,心净无尘Q?br />  在内,心在外,常剥之,无尘无心Q?br />  心中有尘Q尘本是心,<br />  何畏心中,无尘亦无??正如慧能所说的 仁者心?br />  <br />  又如道家所说的 道可道非帔R<br />  <br />  它们的道理是一L<br />  佛家讲究万物在心 q求修世<br />  <br />  道家讲究无牵无挂 q求避世<br />  <br />  佛家惌׃?道家则是修行今世 而追I其原理来说都是一U修?br />  <br />  而最l的说的是一U超?br />  <br />  却不是刻意的L<br />  <br />  L在心<br />  <br />  世间人,法无定法Q然后知非法法也Q?br />  天下事,了犹未了Q何妨以不了了之?</font> </font> </p> <p> <font face="楷体_GB2312" size="3">我本n来讲Q对于世间的事情Q万物,我认为,需要一颗宁静的心,去面对这一切?/font> </p> <!----> </div> <img src ="http://www.shnenglu.com/guangping/aggbug/59302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guangping/" target="_blank">王光q?/a> 2008-08-19 09:13 <a href="http://www.shnenglu.com/guangping/archive/2008/08/19/59302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>理解循环冗余码CRChttp://www.shnenglu.com/guangping/archive/2008/08/04/57980.html王光q?/dc:creator>王光q?/author>Mon, 04 Aug 2008 08:57:00 GMThttp://www.shnenglu.com/guangping/archive/2008/08/04/57980.htmlhttp://www.shnenglu.com/guangping/comments/57980.htmlhttp://www.shnenglu.com/guangping/archive/2008/08/04/57980.html#Feedback0http://www.shnenglu.com/guangping/comments/commentRss/57980.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/57980.html M一个由二进制数位串l成的代?都可以惟一C一个只含有0?两个pL的多式建立一一对应的关pR例?代码1010111对应的多式为X6+X4+X2+X+1,同样.多项式X5+X3+X2+X+1对应的代码ؓ101111?br /> CRC码在发送端~码和接收端校验?都可以利用事先约定的生成多项式G(X)来得到?k位要发送的信息位可对应于一?k-1)ơ多式K(X),r位冗余位则对应于一?r-1)ơ多式R(X),由k位信息位后面加上r位冗余位l成的n=k+r位码字则对应于一?n-1)ơ多式T(X)=Xr·K(X)+R(X)。例?

׃息位产生冗余位的~码q程,是已知K(X)求R(X)的过E。在CRC码中可以通过扑ֈ一个特定的rơ多式G (X)(其最高项Xr的系数恒?),然后用Xr·K(X)去除以G(X),得到的余式就是R(X)。特别要的是,q些多项式中?+"都是??也即异或q算);此外,q里的除法用的也是模2除法,即除法过E中用到的减法是?减法,它和?加法的运规则一?都是异或q算,q是一U不考虑加法q位和减法借位的运??/p>

0+O=0,0+1=1,1+0=1,1+1=0
0-0=0,0-1=1,1-0=1,1-1=0

在进行基于模2q算的多式除法?只要部分余数首位?,便可上商1,否则上商0。然后按?减法求得余数,该余C计最高位。当被除数逐位除完?最后得到比除数一位的余数。此余数即ؓ冗余?其d在信息位后便构成CRC码字?br /> 仍以上例中K(X)=X6+X4+X3+1Z(即信息位?011001),若G(X)=X4+X3+1
(对应代码11001),取r=4,则X4·K(X)=X10+X8+X7+X4(对应代码?110010000),其由?除法求余式R(X)的过E所C如?


得到的最后余Cؓ1010,q就是冗余位,对应R(X)=X3+X?br /> ׃R(X)是Xr·K(X)除以G(X)的余?那么下列关系式必然满?br /> Xr·K(X)=G(X)Q(X)+R(X)
其中Q(X)为商式。根据模二运规则R(X)+R(X)=0的特?可将上式改记?/p>

[Xr-K(X)+R(X)]/G(X)=Q(X)

? T(X)/G(X)=Q(X)

由此可见,信道上发送的码字多项式T(X)=Xr-K(X)+R(X)。若传输q程无错Q则接收Ҏ到的码字也对应于此多式,也即接收到的码字多项式能被G(X)整除。因而接收端的校验过E就是将接收到的码字多项式除以G(X)的过E。若余式为零则认Z输元差错;若余式不为零则传输有差错?/p>

例如,前述例子中若码字10110011010l传输后׃受噪声的q扰,在接收端变成?0110011100,则求余式的除法如?
求得的余式不为零,相当于在码字上面半加上了差错模式00000000110。差错模式对应的多项式记为E(X),上例中E(X)=X2+X。有差错?接收端收到的不再是T(X),而是T(X)与E(X)之模二加,?br /> [T(X)+E(X)]/G(X)=T(X)/G(X)+E(X)/G(X)
若E(X)/G(X)=0,则这U差错就能检出?若E(X)/G(X)=0,那么׃接收到的码字多项式仍然可被G(X)整除,错误检不出来,也即发生了漏?/p>

理论上可以证明@环冗余校验码的检错能力有以下特点:
(1)可检出所有奇C错?br /> (2)可检出所有双比特的错?br /> (3)可检出所有小于、等于校验位长度的突发错?/p>

CRC码是由r-K(X)除以某个选定的多式后生的,所以该多现式称生成多项式。一般来?生成多项式位数越多校验能力越强。但q不是Q何一个r+1位的二进制数都可以做生成多项式?nobr oncontextmenu="return false" onmousemove="kwM(0)" id="clickeyekey0" onmouseover="kwE(event,0, this)" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="kwC(event,0)" onmouseout="kwL(event,this)">目前q泛使用的生成多式主要有以下四U?



]]>
C++中的左值和叛_?/title><link>http://www.shnenglu.com/guangping/archive/2008/04/23/47889.html</link><dc:creator>王光q?/dc:creator><author>王光q?/author><pubDate>Wed, 23 Apr 2008 03:40:00 GMT</pubDate><guid>http://www.shnenglu.com/guangping/archive/2008/04/23/47889.html</guid><wfw:comment>http://www.shnenglu.com/guangping/comments/47889.html</wfw:comment><comments>http://www.shnenglu.com/guangping/archive/2008/04/23/47889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guangping/comments/commentRss/47889.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guangping/services/trackbacks/47889.html</trackback:ping><description><![CDATA[1. 概念 变量和文字常量都有存储区Qƈ且有相关的类型,区别在于变量是可d的; <br /> 对于每个变量Q都?个g其相兌Q?br /> 1>数据|存储在某个内存地址中,也称叛_|rvalueQ,叛_是被读取的|read valueQ,文字帔R和变量都可被用于叛_{? <br /> 2>地址|卛_储数据值的那块内存地址Q也U左|lvalueQ,文字帔R不能被用作左倹{? <br /><br />2 . 问题 l表辑ּ加上括号Q?br /> ++a-- <br />l果 ++(a--) <br />q个表达式是非法的,因ؓ前增量操作要求一个可修改的左|?"a--" 不是左|卛_|<br /><br /> 3 . 前增量和后增量的区别 <br />早期的c语言教材Qfor循环语句通常写成Q?br />for(int i=0;i<10;i++) <br />而现在多为: <br />for(int i=0;i<10;++i) 两者有区别吗? <br />a++ xq回 a的|然后变量 a ?1Q返回需要生一个时变量类g <br />{ int temp = a; <br /> a=a+1; <br /> return temp; //q回叛_? } <br /><br />++a 则ؓQ? <br />{ a=a+1; <br /> return &a; //q回左? } <br />昄Q前增量不需要中间变量,效率更高? <img src ="http://www.shnenglu.com/guangping/aggbug/47889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guangping/" target="_blank">王光q?/a> 2008-04-23 11:40 <a href="http://www.shnenglu.com/guangping/archive/2008/04/23/47889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>typedef用法结http://www.shnenglu.com/guangping/archive/2008/04/08/46519.html王光q?/dc:creator>王光q?/author>Tue, 08 Apr 2008 08:21:00 GMThttp://www.shnenglu.com/guangping/archive/2008/04/08/46519.htmlhttp://www.shnenglu.com/guangping/comments/46519.htmlhttp://www.shnenglu.com/guangping/archive/2008/04/08/46519.html#Feedback0http://www.shnenglu.com/guangping/comments/commentRss/46519.htmlhttp://www.shnenglu.com/guangping/services/trackbacks/46519.html q两天在看程序的时?发现很多地方都用到typedef,在结构体定义,q有一些数l等地方都大量的用到.但是有些地方q不是很清楚,今天下午,想好好研究一?上网搜了一?有不资?归纳一?
来源一:Using typedef to Curb Miscreant Code
Typedef 声明有助于创建^台无关类型,甚至能隐藏复杂和难以理解的语法。不怎样Q?typedef 能ؓ代码带来意想不到的好处,通过本文你可以学习用 typedef 避免~欠Q从而代码更健壮?br />typedef 声明Q简U?typedefQؓ现有cd创徏一个新的名字。比如h们常怋?typedef 来编写更观和可ȝ代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及^台相关的数据cdQ从而增强可UL性和以及未来的可l护性。本文下面将竭尽全力来揭C?typedef 强大功能以及如何避免一些常见的陷阱?br />如何创徏q_无关的数据类型,隐藏W拙且难以理解的语法?
使用 typedefs 为现有类型创建同义字?br />定义易于记忆的类型名
  typedef 使用最多的地方是创建易于记忆的cd名,用它来归档程序员的意图。类型出现在所声明的变量名字中Q位?''typedef'' 关键字右辏V例如:
typedef int size;
  此声明定义了一?int 的同义字Q名字ؓ size。注?typedef q不创徏新的cd。它仅仅为现有类型添加一个同义字。你可以在Q何需?int 的上下文中?sizeQ?br />void measure(size * psz);
size array[4];
size len = file.getlength();
std::vector vs;
  typedef q可以掩饰符合类型,如指针和数组。例如,你不用象下面q样重复定义?81 个字W元素的数组Q?br />char line[81];
char text[81];
定义一?typedefQ每当要用到相同cd和大的数组Ӟ可以q样Q?br />typedef char Line[81];
Line text, secondline;
getline(text);
同样Q可以象下面q样隐藏指针语法Q?br />typedef char * pstr;
int mystrcmp(pstr, pstr);
  q里带我们到达W一?typedef 陷阱。标准函?strcmp()有两个‘const char *'cd的参数。因此,它可能会误导Z象下面这样声?mystrcmp()Q?br />int mystrcmp(const pstr, const pstr);
  q是错误的,按照序Q‘const pstr'被解释ؓ‘char * const'Q一个指?char 的常量指针)Q而不是‘const char *'Q指向常?char 的指针)。这个问题很Ҏ解决Q?br />typedef const char * cpstr;
int mystrcmp(cpstr, cpstr); // 现在是正的
CQ不什么时候,只要为指针声?typedefQ那么都要在最l的 typedef 名称中加一?constQ以使得该指针本w是帔RQ而不是对象?br />代码?br />  上面讨论?typedef 行ؓ有点?#define 宏,用其实际cd替代同义字。不同点?typedef 在编译时被解释,因此让编译器来应付超预处理器能力的文本替换。例如:
typedef int (*PF) (const char *, const char *);
  q个声明引入?PF cd作ؓ函数指针的同义字Q该函数有两?const char * cd的参C及一?int cd的返回倹{如果要使用下列形式的函数声明,那么上述q个 typedef 是不可或~的Q?br />PF Register(PF pf);
  Register() 的参数是一?PF cd的回调函敎ͼq回某个函数的地址Q其|名与先前注册的名字相同。做一ơ深呼吸。下面我展示一下如果不?typedefQ我们是如何实现q个声明的:
int (*Register (int (*pf)(const char *, const char *)))
(const char *, const char *);
  很少有程序员理解它是什么意思,更不用说q种费解的代码所带来的出错风险了。显Ӟq里使用 typedef 不是一U特权,而是一U必需。持怀疑态度的h可能会问Q?OKQ有会写q样的代码吗Q?Q快速浏览一下揭C?signal()函数的头文g Q一个有同样接口的函数?br />typedef 和存储类关键字(storage class specifierQ?br />  q种说法是不是有点o人惊Ӟtypedef 像 autoQexternQmutableQstaticQ和 register 一P是一个存储类关键字。这q是?typedef 会真正媄响对象的存储Ҏ;它只是说在语句构成上Qtypedef 声明看v来象 staticQextern {类型的变量声明。下面将带到W二个陷阱:
typedef register int FAST_COUNTER; // 错误
  ~译通不q。问题出在你不能在声明中有多个存储类关键字。因为符?typedef 已经占据了存储类关键字的位置Q在 typedef 声明中不能用 registerQ或M其它存储cd键字Q?br />促进跨^台开?br />  typedef 有另外一个重要的用途,那就是定义机器无关的cdQ例如,你可以定义一个叫 REAL 的Q点类型,在目标机器上它可以i获得最高的_ֺQ?br />typedef long double REAL;
在不支持 long double 的机器上Q该 typedef 看v来会是下面这P
typedef double REAL;
q且Q在q?double 都不支持的机器上Q该 typedef 看v来会是这P?br />typedef float REAL;
   你不用对源代码做M修改Q便可以在每一U^C~译q个使用 REAL cd的应用程序。唯一要改的是 typedef 本n。在大多数情况下Q甚臌个微的变动完全都可以通过奇妙的条件编译来自动实现。不是吗? 标准库广泛地使用 typedef 来创Lq_无关cdQsize_tQptrdiff ?fpos_t 是其中的例子。此外,?std::string ?std::ofstream q样?typedef q隐藏了镉K的,难以理解的模板特化语法,例如Qbasic_stringQallocator> ?basic_ofstream>?br />作者简?br />  Danny Kalev 是一名通过认证的系l分析师Q专?C++ 和Ş式语a理论的Y件工E师?997 q到 2000 q期_他是 C++ 标准委员会成员。最q他以优异成l完成了他在普通语a学研I方面的士论文。业余时间他喜欢听古兔R乐,阅读l多利亚时期的文学作品,研究 Hittite、Basque ?Irish Gaelic q样的自然语a。其它兴包括考古和地理。Danny 时常C?C++ 论坛q定期ؓ不同?C++ |站和杂志撰写文章。他q在教育机构讲授E序设计语言和应用语a评?br />来源二:(http://www.ccfans.net/bbs/dispbbs.asp?boardid=30&;id=4455)
C语言中typedef用法
1. 基本解释
  typedef为C语言的关键字Q作用是ZU数据类型定义一个新名字。这里的数据cd包括内部数据cdQint,char{)和自定义的数据类型(struct{)?br />  在编E中使用typedef目的一般有两个Q一个是l变量一个易C意义明确的新名字Q另一个是化一些比较复杂的cd声明?br />  至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐q?br /> 2. typedef & l构的问?br />  当用下面的代码定义一个结构时Q编译器报了一个错误,Z么呢Q莫非C语言不允许在l构中包含指向它自己的指针吗Q请你先猜想一下,然后看下文说明:
typedef struct tagNode
{
 char *pItem;
 pNode pNext;
} *pNode;
  {案与分析:
  1、typedef的最单?br />typedef long byte_4;
  l已知数据类型long起个新名字,叫byte_4?br />  2?typedef与结构结合?br />typedef struct tagMyStruct
{
 int iNum;
 long lLength;
} MyStruct;
  q语句实际上完成两个操作Q?br />  1) 定义一个新的结构类?br />struct tagMyStruct
{
 int iNum;
 long lLength;
};
  分析QtagMyStructUCؓ“tag”,即“标{䏀,实际上是一个时名字,struct 关键字和tagMyStruct一P构成了这个结构类型,不论是否有typedefQ这个结构都存在?br />  我们可以用struct tagMyStruct varName来定义变量,但要注意Q用tagMyStruct varName来定义变量是不对的,因ؓstruct 和tagMyStruct合在一h能表CZ个结构类型?br />  2) typedef个新的结构v了一个名字,叫MyStruct?br />typedef struct tagMyStruct MyStruct;
  因此QMyStruct实际上相当于struct tagMyStructQ我们可以用MyStruct varName来定义变量?br />  {案与分?br />  C语言当然允许在结构中包含指向它自q指针Q我们可以在建立链表{数据结构的实现上看到无数这L例子Q上qC码的Ҏ问题在于typedef的应用?br />  Ҏ我们上面的阐q可以知道:新结构徏立的q程中遇CpNext域的声明Q类型是pNodeQ要知道pNode表示的是cd的新名字Q那么在cd本nq没有徏立完成的时候,q个cd的新名字也还不存在,也就是说q个时候编译器Ҏ不认识pNode?br />  解决q个问题的方法有多种Q?br />  1)?br />typedef struct tagNode
{
 char *pItem;
 struct tagNode *pNext;
} *pNode;
  2)?br />typedef struct tagNode *pNode;
struct tagNode
{
 char *pItem;
 pNode pNext;
};
  注意Q在q个例子中,你用typedefl一个还未完全声明的cdh名字。C语言~译器支持这U做法?br />  3)、规范做法:
struct tagNode
{
 char *pItem;
 struct tagNode *pNext;
};
typedef struct tagNode *pNode;
 3. typedef & #define的问?br />  有下面两U定义pStr数据cd的方法,两者有什么不同?哪一U更好一点?
typedef char *pStr;
#define pStr char *;
  {案与分析:
  通常Ԍtypedef要比#define要好Q特别是在有指针的场合。请看例子:
typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;
  在上q的变量定义中,s1、s2、s3都被定义为char *Q而s4则定义成了charQ不是我们所预期的指针变量,Ҏ原因在?define只是单的字符串替换而typedef则是Z个类型v新名字?br />  #define用法例子Q?br />#define f(x) x*x
main( )
{
 int a=6Qb=2QcQ?br /> c=f(a) / f(b)Q?br /> printf("%d \\n"Qc)Q?br />}
  以下E序的输出结果是: 36?br />  因ؓ如此原因Q在许多C语言~程规范中提C?define定义Ӟ如果定义中包含表辑ּQ必M用括P则上q定义应该如下定义才对:
#define f(x) (x*x)
  当然Q如果你使用typedef没有这L问题?br />  4. typedef & #define的另一?br />  下面的代码中~译器会报一个错误,你知道是哪个语句错了吗?
typedef char * pStr;
char string[4] = "abc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
  {案与分析:
  是p2++出错了。这个问题再一ơ提醒我们:typedef?define不同Q它不是单的文本替换。上qC码中const pStr p2q不{于const char * p2。const pStr p2和const long x本质上没有区别,都是对变量进行只读限Ӟ只不q此处变量p2的数据类型是我们自己定义的而不是系l固有类型而已。因此,const pStr p2的含义是Q限定数据类型ؓchar *的变量p2为只读,因此p2++错误?br />  #define与typedef引申?br />  1) #define宏定义有一个特别的长处Q可以?#ifdef ,#ifndef{来q行逻辑判断Q还可以使用#undef来取消定义?br />  2) typedef也有一个特别的长处Q它W合范围规则Q用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内Q取决于此变量定义的位置Q,而宏定义则没有这U特性?br />  5. typedef & 复杂的变量声?br />  在编E实践中Q尤其是看别Z码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价|比如Q?br />  下面是三个变量的声明Q我想用typdef分别l它们定义一个别名,请问该如何做Q?br />>1Qint *(*a[5])(int, char*);
>2Qvoid (*b[10]) (void (*)());
>3. doube(*)() (*pa)[9];
  {案与分析:
  对复杂变量徏立一个类型别名的Ҏ很简单,你只要在传统的变量声明表辑ּ里用cd名替代变量名Q然后把关键字typedef加在该语句的开头就行了?br />>1Qint *(*a[5])(int, char*);
//pFun是我们徏的一个类型别?br />typedef int *(*pFun)(int, char*);
//使用定义的新cd来声明对象,{h于int* (*a[5])(int, char*);
pFun a[5];
>2Qvoid (*b[10]) (void (*)());
//首先Z面表辑ּ蓝色部分声明一个新cd
typedef void (*pFunParam)();
//整体声明一个新cd
typedef void (*pFun)(pFunParam);
//使用定义的新cd来声明对象,{h于void (*b[10]) (void (*)());
pFun b[10];
>3. doube(*)() (*pa)[9];
//首先Z面表辑ּ蓝色部分声明一个新cd
typedef double(*pFun)();
//整体声明一个新cd
typedef pFun (*pFunParam)[9];
//使用定义的新cd来声明对象,{h于doube(*)() (*pa)[9];
pFunParam pa;



]]>
ۺ˾þۺ| þþþþݴۺϾƷ| ޹Ʒþþþ| þþþùƷ| þҹӰ| þۺɫHEZYO| 99þwww˳ɾƷ| 2020¾þþӾƷ | ŷƷþþ| ޾þþһ | Ʒŷһþþ | ɫþþþþþС˵| ˺ݺۺϾþ޸| ھƷ˾þþþӰԺ԰| Ʒ99þò| þþƷAV| þۺϾþԾ99ëƬ| ɫþ| ŷvaþþþ| þþùҺ| ޾Ʒþǧն| ɫþþۺ| ƷŮþþm| ƷѾþþþõӰ| Ʒ99þþþþè | Ʒþøһ| þþƷĻ鶹| Ʒþþþþ| 99þþƷѹƬ| þҹɫƷa| ٸþĻ| þþĻ| ˾þþƷӰԺ| Ʒþþþþۺձ| ɫ99þþþø߳ۺӰԺ| þAV˳׽| պŷþþwwwۺ| ŷþþþ9999| ƷŷþþӰ| þþžžþƷ| þþþþŮ|