<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>iRayu</title>
  
  <subtitle>Rayu&#39;s Blog</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://rayuu.com/"/>
  <updated>2019-12-18T15:57:02.621Z</updated>
  <id>http://rayuu.com/</id>
  
  <author>
    <name>Rayu</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Matlab生成stm32代码</title>
    <link href="http://rayuu.com/2019/12/18/matlabgenstm32code/"/>
    <id>http://rayuu.com/2019/12/18/matlabgenstm32code/</id>
    <published>2019-12-18T15:55:44.000Z</published>
    <updated>2019-12-18T15:57:02.621Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、整体思路"><a href="#一、整体思路" class="headerlink" title="一、整体思路"></a>一、整体思路</h2><p>利用Matlab的simulink搭建模型生成C代码，通过stm32cubemx生成工程，最后在KEIL或者IAR等工具里面编译生成代码下载至MCU中执行。<br>本文以流水灯建立模型和简单使用定时器为例进行演示。</p><h2 id="二、开发环境"><a href="#二、开发环境" class="headerlink" title="二、开发环境"></a>二、开发环境</h2><h3 id="1、安装Matlab"><a href="#1、安装Matlab" class="headerlink" title="1、安装Matlab"></a>1、安装Matlab</h3><p>Matlab版本建议在2013B以上，本文使用Matlab 2016a。<br><img src="https://img.rayu.me/2019/12/4091818094.png" alt="matlab_1.png"></p><h3 id="2、安装STM32硬件支持包"><a href="#2、安装STM32硬件支持包" class="headerlink" title="2、安装STM32硬件支持包"></a>2、安装STM32硬件支持包</h3><p>下载地址(<a href="https://www.stmcu.org.cn/document/detail/index/id-216053" target="_blank" rel="noopener">https://www.stmcu.org.cn/document/detail/index/id-216053</a>)<br>安装完成后重启MATLAB。官网文档中提到，当前只支持F4和F3部分系列，F1系列生成代码后编译可能会报错，本文使用STM32-MAT版本V4.3.0。<br><img src="https://img.rayu.me/2019/12/3860263216.png" alt="matlab_2.png"></p><h3 id="3、安装STM32CUBEMX"><a href="#3、安装STM32CUBEMX" class="headerlink" title="3、安装STM32CUBEMX"></a>3、安装STM32CUBEMX</h3><p>用于配置单片机硬件资源，下载地址(<a href="https://www.stmcu.org.cn/document/detail/index/id-214984" target="_blank" rel="noopener">https://www.stmcu.org.cn/document/detail/index/id-214984</a>)</p><h3 id="4、安装KEIL或者IAR等IDE"><a href="#4、安装KEIL或者IAR等IDE" class="headerlink" title="4、安装KEIL或者IAR等IDE"></a>4、安装KEIL或者IAR等IDE</h3><p>用于配置工程文件。</p><h2 id="三、STM32硬件资源配置"><a href="#三、STM32硬件资源配置" class="headerlink" title="三、STM32硬件资源配置"></a>三、STM32硬件资源配置</h2><h3 id="1、打开STM32CUBEMX"><a href="#1、打开STM32CUBEMX" class="headerlink" title="1、打开STM32CUBEMX"></a>1、打开STM32CUBEMX</h3><p>选择“access to MCU selector”<br><img src="https://img.rayu.me/2019/12/547732427.png" alt="matlab_3.png"></p><h3 id="2、选择STM32芯片"><a href="#2、选择STM32芯片" class="headerlink" title="2、选择STM32芯片"></a>2、选择STM32芯片</h3><p>以STM32F103R6为例。如果搜索不到，那么可能需要下载安装库文件<br><img src="https://img.rayu.me/2019/12/2819518942.png" alt="matlab_4.png"><br>下载对应的库文件即可。<br><img src="https://img.rayu.me/2019/12/966114914.png" alt="matlab_5.png"><br>搜索到芯片后，选中点击“Start Project”，进入配置界面。<br><img src="https://img.rayu.me/2019/12/937169943.png" alt="matlab_6.png"></p><h3 id="3、首先选择时钟"><a href="#3、首先选择时钟" class="headerlink" title="3、首先选择时钟"></a>3、首先选择时钟</h3><p>这里选择HSE，使用外部晶振<br><img src="https://img.rayu.me/2019/12/1888902784.png" alt="matlab_7.png"></p><h3 id="4、再配置GPIO"><a href="#4、再配置GPIO" class="headerlink" title="4、再配置GPIO"></a>4、再配置GPIO</h3><p>选择PA1-5作为LED灯。引脚状态选择为输出。<br><img src="https://img.rayu.me/2019/12/1808122368.png" alt="matlab_8.png"><br><img src="https://img.rayu.me/2019/12/3559229031.png" alt="matlab_9.png"><br>再根据硬件设计，配置IO上拉还是下拉。<br><img src="https://img.rayu.me/2019/12/3538065060.png" alt="matlab_10.png"><br><img src="https://img.rayu.me/2019/12/3540381036.png" alt="matlab_11.png"></p><h3 id="5、最后配置时钟"><a href="#5、最后配置时钟" class="headerlink" title="5、最后配置时钟"></a>5、最后配置时钟</h3><p>选择最大72MHz。<br><img src="https://img.rayu.me/2019/12/2582507988.png" alt="matlab_12.png"></p><h3 id="6、保存工程"><a href="#6、保存工程" class="headerlink" title="6、保存工程"></a>6、保存工程</h3><p>输入工程文件信息<br><img src="https://img.rayu.me/2019/12/1586740590.png" alt="matlab_13.png"><br>选择生成的工程文件，如果是KEIL，那么选择“MDK-ARM V5”。<br><img src="https://img.rayu.me/2019/12/967088450.png" alt="matlab_14.png"><br>最后保存即可。<br><img src="https://img.rayu.me/2019/12/2717894657.png" alt="matlab_15.png"></p><h2 id="四、SIMULINK配置"><a href="#四、SIMULINK配置" class="headerlink" title="四、SIMULINK配置"></a>四、SIMULINK配置</h2><h3 id="1、配置MATLAB搜索路径"><a href="#1、配置MATLAB搜索路径" class="headerlink" title="1、配置MATLAB搜索路径"></a>1、配置MATLAB搜索路径</h3><p>打开MATLAB，首先配置MATLAB搜索路径。<br><img src="https://img.rayu.me/2019/12/2406532122.png" alt="matlab_16.png"><br>将STM32-MAT的安装路径添加进来。<br><img src="https://img.rayu.me/2019/12/1119623777.png" alt="matlab_17.png"><br>添加完成后将MATLAB当前工作路径修改为第三步中IOC文件位置，默认是在Matlab安装位置，不修改的话后面生成代码的时候会报错。<br><img src="https://img.rayu.me/2019/12/3194415153.png" alt="matlab_18.png"><br>最后建议重启一下MATLAB。</p><h3 id="2、打开SIMULINK"><a href="#2、打开SIMULINK" class="headerlink" title="2、打开SIMULINK"></a>2、打开SIMULINK</h3><p>新建一个空白模型。<br><img src="https://img.rayu.me/2019/12/587515553.png" alt="matlab_19.png"><br>打开配置界面<br><img src="https://img.rayu.me/2019/12/1991376729.png" alt="matlab_20.png"></p><h3 id="3、选择STM32配置文件"><a href="#3、选择STM32配置文件" class="headerlink" title="3、选择STM32配置文件"></a>3、选择STM32配置文件</h3><p><img src="https://img.rayu.me/2019/12/835791195.png" alt="matlab_21.png"><br>选择stm32.tlc。<br><img src="https://img.rayu.me/2019/12/2205420636.png" alt="matlab_22.png"><br>解算器(Solver)选项默认为固定步长，即“Fixed-step”，然后修改步长为1/10000，即0.1ms。也可以根据实际情况修改，默认为auto可能会导致程序运行时无法显示出效果。<br><img src="https://img.rayu.me/2019/12/225924940.png" alt="matlab_23.png"><br>添加代码注释<br><img src="https://img.rayu.me/2019/12/153828361.png" alt="matlab_24.png"></p><h3 id="4、选择cubeMX路径"><a href="#4、选择cubeMX路径" class="headerlink" title="4、选择cubeMX路径"></a>4、选择cubeMX路径</h3><p><img src="https://img.rayu.me/2019/12/2076589470.png" alt="matlab_25.png"></p><h2 id="五、模型搭建"><a href="#五、模型搭建" class="headerlink" title="五、模型搭建"></a>五、模型搭建</h2><p>Simulink配置完成后就可以自己搭建模型。</p><h3 id="1、配置芯片"><a href="#1、配置芯片" class="headerlink" title="1、配置芯片"></a>1、配置芯片</h3><p>选择MCU config，将右侧模块拖动至刚刚新建的空白模型。<br><img src="https://img.rayu.me/2019/12/3905430825.png" alt="matlab_26.png"><br><img src="https://img.rayu.me/2019/12/3037982617.png" alt="matlab_27.png"><br>双击刚刚拖出来的模块，进入配置界面，选择第三步生成的IOC文件。<br><img src="https://img.rayu.me/2019/12/670021828.png" alt="matlab_28.png"><br><img src="https://img.rayu.me/2019/12/2770541262.png" alt="matlab_29.png"></p><h3 id="2、选择GPIO模块"><a href="#2、选择GPIO模块" class="headerlink" title="2、选择GPIO模块"></a>2、选择GPIO模块</h3><p><img src="https://img.rayu.me/2019/12/3814932227.png" alt="matlab_30.png"><br>同样拖动至SIMULINK，双击该模块配置IO引脚，可以看到我们在cubemx里面配置的IO，勾选要打开的IO，点击确认即可。<br><img src="https://img.rayu.me/2019/12/2972822818.png" alt="matlab_31.png"></p><h3 id="3、模型设计"><a href="#3、模型设计" class="headerlink" title="3、模型设计"></a>3、模型设计</h3><p>使用”Counter Free-Running”模块进行计数，参数配置如下<br><img src="https://img.rayu.me/2019/12/1962333515.png" alt="matlab_32.png"><br>此配置的意思为每0.5秒计数一次，计数的最大值为2^Nbits – 1，其中Nbits为所填的2，所以这里最大值为3。<br>示波器显示和预期值一致。<br><img src="https://img.rayu.me/2019/12/1085181333.png" alt="matlab_33.png"><br>然后通过一个关系比较符，当计数值分别等于0,1,2,3,时，相应的GPIO输出为1。<br><img src="https://img.rayu.me/2019/12/2048388794.png" alt="matlab_34.png"><br>示波器仿真结果如图<br><img src="https://img.rayu.me/2019/12/161170131.png" alt="matlab_35.png"><br>最后模型如图所示<br><img src="https://img.rayu.me/2019/12/1319100497.png" alt="matlab_36.png"></p><h2 id="六、代码生成"><a href="#六、代码生成" class="headerlink" title="六、代码生成"></a>六、代码生成</h2><p>模型设计完成后，仿真结果无误，就可以进行代码生成。按“Ctrl+B”或者如图所示点击，进行代码生成。<br><img src="https://img.rayu.me/2019/12/1351445366.png" alt="matlab_37.png"><br><img src="https://img.rayu.me/2019/12/150914549.png" alt="matlab_38.png"><br><img src="https://img.rayu.me/2019/12/1617475346.png" alt="matlab_39.png"><br>最后生成工程目录如下<br><img src="https://img.rayu.me/2019/12/2075535780.png" alt="matlab_40.png"><br>“stmDemo_stm32”目录为matlab生成的原始代码。<br>IOC文件为stm32cubemx工程文件。<br>Slx文件为simulink模型文件。<br>其他的为KEIL工程中的代码。</p><h2 id="七、编译下载验证"><a href="#七、编译下载验证" class="headerlink" title="七、编译下载验证"></a>七、编译下载验证</h2><h3 id="1、仿真验证"><a href="#1、仿真验证" class="headerlink" title="1、仿真验证"></a>1、仿真验证</h3><p>打开工程，代码编译完成后，下载程序到目标板。<br><img src="https://img.rayu.me/2019/12/1762203953.png" alt="matlab_41.png"><br><img src="https://img.rayu.me/2019/12/3840496486.png" alt="matlab_42.png"><br>这里使用proteus进行仿真，仿真中流水灯切换速度为5秒，比预定的时间0.5秒慢了10倍，仿真提示” Simulation is not running in real time due to excessive CPU load.”，说明仿真时单片机运行速度不是实时的。<br><img src="https://img.rayu.me/2019/12/242086689.png" alt="matlab_43.png"><br><img src="https://img.rayu.me/2019/12/180339622.png" alt="matlab_44.png"><br>为了进一步验证，再使用一个定时器进行让LED5以1Hz的频率闪烁。配置如下：<br><img src="https://img.rayu.me/2019/12/3325832243.png" alt="matlab_45.png"><br>模型如下：<br><img src="https://img.rayu.me/2019/12/880187229.png" alt="matlab_46.png"><br><img src="https://img.rayu.me/2019/12/2574055910.png" alt="matlab_47.png"><br><img src="https://img.rayu.me/2019/12/473796493.png" alt="matlab_48.png"></p><p>生成代码后编译报错，原因为F1系列的库函数中”__HAL_TIM_SetAutoreload”该函数未定义成” __HAL_TIM_SET_AUTORELOAD”。<br>而在F4系列的库函数中是有该定义的，编译不会报错。<br><img src="https://img.rayu.me/2019/12/1024929787.png" alt="matlab_49.png"><br>因此生成的代码无法正常使用定时器，除非修改生成后的代码，这样并不是我们想要的。</p><h3 id="2、开发板验证"><a href="#2、开发板验证" class="headerlink" title="2、开发板验证"></a>2、开发板验证</h3><p>最后以F429单片机为例，重新生成代码下载到单片机进行验证。IOC文件中，时钟配置为180MHz，其他步骤同第三~六步。<br><img src="https://img.rayu.me/2019/12/1448222278.png" alt="matlab_50.png"><br>代码生成完成后对工程进行配置，设置程序下载完成后重置运行，下载器根据实际情况设置为”CMSIS-DAP-Debugger”。<br><img src="https://img.rayu.me/2019/12/2367682223.png" alt="matlab_51.png"><br><img src="https://img.rayu.me/2019/12/2948411337.png" alt="matlab_52.png"><br>编译完成下载至单片机中，看是否满足设计要求。<br>经过验证该代码无误。</p><h2 id="八、注意事项"><a href="#八、注意事项" class="headerlink" title="八、注意事项"></a>八、注意事项</h2><h3 id="1、代码生成后的处理"><a href="#1、代码生成后的处理" class="headerlink" title="1、代码生成后的处理"></a>1、代码生成后的处理</h3><p>生成代码后，由于使用了systick（系统定时器），但是生成的代码中没有对其进行调用，所以需要在stm32f4xx_it.C中手动添加一行代码，否则程序可能无法正常运行。添加的代码为：HAL_SYSTICK_IRQHandler();<br>该问题具体原因未知，可能和stm32cubemx配置或者版本有关。<br>!<img src="https://img.rayu.me/2019/12/3723966556.png" alt="matlab_53.png"></p><h3 id="2、Matlab工作路径"><a href="#2、Matlab工作路径" class="headerlink" title="2、Matlab工作路径"></a>2、Matlab工作路径</h3><p>建议生成代码之前，将matlab工作路径指定到IOC文件位置，同时将SLX文件也放在同一个文件夹下，这样方便工程管理。</p><h3 id="3、参考文档"><a href="#3、参考文档" class="headerlink" title="3、参考文档"></a>3、参考文档</h3><p>在STM32-MAT安装路径下还有更多示例以及使用说明。<br><img src="https://img.rayu.me/2019/12/4102292915.png" alt="matlab_54.png"></p><h3 id="4、Invalid-index问题"><a href="#4、Invalid-index问题" class="headerlink" title="4、Invalid index问题"></a>4、Invalid index问题</h3><blockquote><p>Invalid index. Component:Simulink | Category:Block diagram error</p></blockquote><p>matlab2018b中生成代码时出现上述问题<br>解决方法如下：<br>在simulink设置选项“hardware implementation”中把设备STM改为“custom processor”<br><img src="https://img.rayu.me/2019/12/565578505.png" alt="matlab_55.png"></p><h2 id="九、小结"><a href="#九、小结" class="headerlink" title="九、小结"></a>九、小结</h2><p>总的来说该方法生成底层代码较复杂，而且配置繁琐。当然优点是基本不需要修改生成的代码，但实际上未能节省太多时间。</p><p>MATLAB自动生成的代码是标准的C代码，支持所有的MCU。因此建议在实际开发中能在Simulink环境下仿真的部分，通过Simulink实现；对于单片机底层这类没法在Simulink下仿真的软件，不应该打包到Simulink环境下。</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;一、整体思路&quot;&gt;&lt;a href=&quot;#一、整体思路&quot; class=&quot;headerlink&quot; title=&quot;一、整体思路&quot;&gt;&lt;/a&gt;一、整体思路&lt;/h2&gt;&lt;p&gt;利用Matlab的simulink搭建模型生成C代码，通过stm32cubemx生成工程，最后在KEIL或者
      
    
    </summary>
    
    
      <category term="matlab" scheme="http://rayuu.com/categories/matlab/"/>
    
    
      <category term="matlab" scheme="http://rayuu.com/tags/matlab/"/>
    
      <category term="simulink" scheme="http://rayuu.com/tags/simulink/"/>
    
  </entry>
  
  <entry>
    <title>【笔记】matlab建模生成代码注意事项</title>
    <link href="http://rayuu.com/2019/12/18/modelcodegennote/"/>
    <id>http://rayuu.com/2019/12/18/modelcodegennote/</id>
    <published>2019-12-18T15:50:30.000Z</published>
    <updated>2019-12-18T15:55:01.984Z</updated>
    
    <content type="html"><![CDATA[<h3 id="一、代码生成后，查看生成报告。"><a href="#一、代码生成后，查看生成报告。" class="headerlink" title="一、代码生成后，查看生成报告。"></a>一、代码生成后，查看生成报告。</h3><p>如下图所示：</p><p><img src="https://img.rayu.me/2019/12/1127673928.png" alt="model_gen_1.png"></p><p>代码文件简介：</p><h4 id="1、ert-main-c"><a href="#1、ert-main-c" class="headerlink" title="1、ert_main.c"></a>1、ert_main.c</h4><p>该文件中会调用 “模型名称_step();”函数，用于单步执行，可以根据实际情况放在定时器中断或者任务调度里面执行该函数。<br>除此之外，该文件中的main函数会初始化模型，调用“模型名称_initialize();”函数。该函数实际使用时也必须在模型执行前初始化。<br>在实际使用时该文件不必添加进工程。</p><h4 id="2、模型名称-Y100-c"><a href="#2、模型名称-Y100-c" class="headerlink" title="2、模型名称_Y100.c"></a>2、模型名称_Y100.c</h4><p>该文件是根据模型生成的代码，包含“模型名称_step();”函数，“模型名称_initialize();”函数，“模型名称_terminate(void);”函数。</p><h4 id="3、模型名称-Y100-h"><a href="#3、模型名称-Y100-h" class="headerlink" title="3、模型名称_Y100.h"></a>3、模型名称_Y100.h</h4><p>该文件包含模型中的模块数据结构定义。</p><h4 id="4、模型名称-Y100-private-h"><a href="#4、模型名称-Y100-private-h" class="headerlink" title="4、模型名称_Y100_private.h"></a>4、模型名称_Y100_private.h</h4><p>该文件包含模型中的私有变量，主要是声明的全局变量。</p><h4 id="5、模型名称-Y100-types-h"><a href="#5、模型名称-Y100-types-h" class="headerlink" title="5、模型名称_Y100_types.h"></a>5、模型名称_Y100_types.h</h4><p>该文件包含模型中的结构体定义。</p><h4 id="6、shared-files"><a href="#6、shared-files" class="headerlink" title="6、shared_files"></a>6、shared_files</h4><p>该文件夹中的文件是一些乘除法的函数方法，需要添加至工程中。文件在./slprj/ert/_sharedutils目录中。<br><img src="https://img.rayu.me/2019/12/3622536141.png" alt="model_gen_2.png"></p><h4 id="7、OtherFiles"><a href="#7、OtherFiles" class="headerlink" title="7、OtherFiles"></a>7、OtherFiles</h4><p>该文件夹中是在配置中的source files，如图所示。需要添加至工程中进行编译。<br><img src="https://img.rayu.me/2019/12/745145657.png" alt="model_gen_3.png"></p><p><img src="https://img.rayu.me/2019/12/865539304.png" alt="model_gen_4.png"></p><h4 id="8、模型中使用C-CALLER或者S-Function模块"><a href="#8、模型中使用C-CALLER或者S-Function模块" class="headerlink" title="8、模型中使用C CALLER或者S-Function模块"></a>8、模型中使用C CALLER或者S-Function模块</h4><p>模型中使用C CALLER或者S-Function模块调用C文件中的函数时，需要将对应的文件添加至simulation target中。<br><img src="https://img.rayu.me/2019/12/333467849.png" alt="model_gen_5.png"></p><h4 id="9、模型中调用其他模型文件"><a href="#9、模型中调用其他模型文件" class="headerlink" title="9、模型中调用其他模型文件"></a>9、模型中调用其他模型文件</h4><p>这种情况生成的代码报告在下图所示中。<br><img src="https://img.rayu.me/2019/12/4209273624.png" alt="model_gen_6.png"></p><p>生成的代码在./slprj/ert目录下，对应的模型名称的文件夹中，生成代码后要在编译环境如KEIL中添加对应的搜索路径。<br><img src="https://img.rayu.me/2019/12/3985406626.png" alt="model_gen_7.png">)<img src="https://img.rayu.me/2019/12/882691414.png" alt="model_gen_8.png"></p><h3 id="二、模型制作中的数据结构"><a href="#二、模型制作中的数据结构" class="headerlink" title="二、模型制作中的数据结构"></a>二、模型制作中的数据结构</h3><h4 id="1、声明使用全局变量"><a href="#1、声明使用全局变量" class="headerlink" title="1、声明使用全局变量"></a>1、声明使用全局变量</h4><p>采用数据字典定义我们的数据结构便于管理，如要想使用全局变量，存储类型要选“importedExtern”，生成的代码会在.h文件中进行声明。<br><img src="https://img.rayu.me/2019/12/3175555895.png" alt="model_gen_9.png"><br>如果是定义全局变量，要选择“exportedGlobal”。<br><img src="https://img.rayu.me/2019/12/1454417923.png" alt="model_gen_10.png"><br>调用如下图所示<br><img src="https://img.rayu.me/2019/12/3867979112.png" alt="model_gen_11.png"></p><h4 id="2、定义全局信号对象"><a href="#2、定义全局信号对象" class="headerlink" title="2、定义全局信号对象"></a>2、定义全局信号对象</h4><p>如下图所示，如果是数组，在dimensions中可以输入[1 8]。<br><img src="https://img.rayu.me/2019/12/4245292262.png" alt="model_gen_12.png"><br>调用如下图所示：<br><img src="https://img.rayu.me/2019/12/3624245579.png" alt="model_gen_13.png"><br>这里选中信号名称和模型信号对象绑定，生成的代码输出也将使用对应的信号对象名称。如果是全局变量可以方便在其他地方调用。<br><img src="https://img.rayu.me/2019/12/367756490.png" alt="model_gen_14.png"></p><h3 id="三、模型制作中的一些其他操作"><a href="#三、模型制作中的一些其他操作" class="headerlink" title="三、模型制作中的一些其他操作"></a>三、模型制作中的一些其他操作</h3><h4 id="1、任务调度"><a href="#1、任务调度" class="headerlink" title="1、任务调度"></a>1、任务调度</h4><p>实际使用过程中，通常会对不同的模块按不同的间隔执行，也就是任务调度，比如taskA需要10ms间隔执行，taskB需要100ms时间间隔执行，所以这里我们利用“Function-Call Generator”模块配合状态机实现任务调度。分别实现10ms、100ms、200ms的任务调度。<br><img src="https://img.rayu.me/2019/12/2483944699.png" alt="model_gen_15.png"><br>Function-Call Generator”模块中的采样时间设为1，不使用小数，提高计算精度，实际调用的时候1ms执行一次本模块。<br>状态机的模型如下：<br><img src="https://img.rayu.me/2019/12/725662904.png" alt="model_gen_16.png"><br>设置对应的输入输出事件，如下图。<br><img src="https://img.rayu.me/2019/12/1732009053.png" alt="model_gen_17.png"><br><img src="https://img.rayu.me/2019/12/4223076155.png" alt="model_gen_18.png"><br>实际测试结果无误。</p><p><img src="https://img.rayu.me/2019/12/4179003459.png" alt="model_gen_19.png"></p><h4 id="2、初始化变量"><a href="#2、初始化变量" class="headerlink" title="2、初始化变量"></a>2、初始化变量</h4><p>在模型设计过程中，可能会出现这样的需求，比如ECU上电后，从EEPROM读出上次断电前保存的数据，而且只赋值一次，后续使用新计算的值。<br>如下图所示，上电后从EEPROM读取的值是SOC_From_EE，然后需要进行第一次累加，不然第一次的值是0，又要从0开始累加，并不是上次断电后的值。<br><img src="https://img.rayu.me/2019/12/959796238.png" alt="model_gen_20.png"><br>这里首先想到的是使用IC模块赋值，如下图所示。<br><img src="https://img.rayu.me/2019/12/2457343830.png" alt="model_gen_21.png"><br>但是IC模块的参数不能是变量，所以放弃了这种操作，使用状态机来进行。<br><img src="https://img.rayu.me/2019/12/2123531105.png" alt="model_gen_22.png"><br>状态机如下图所示：使用一个IF-ELSE模块，上电init_i=0,初始化一次，然后init_i置1，不再执行SOC_From_EE赋值。<br><img src="https://img.rayu.me/2019/12/3409412392.png" alt="model_gen_23.png"><br>下图为状态机的数据和事件。<br><img src="https://img.rayu.me/2019/12/3277404699.png" alt="model_gen_24.png"><br>生成的代码如下：<br><img src="https://img.rayu.me/2019/12/4084268244.png" alt="model_gen_25.png"></p><h4 id="3、Data-Store-Memory"><a href="#3、Data-Store-Memory" class="headerlink" title="3、Data Store Memory"></a>3、Data Store Memory</h4><p>使用data store memory进行局部变量的存储。<br><img src="https://img.rayu.me/2019/12/3967603281.png" alt="model_gen_26.png"><br>然后使用data store write将变量存储，data store read读出变量。<br><img src="https://img.rayu.me/2019/12/2425070745.png" alt="model_gen_27.png"><br><img src="https://img.rayu.me/2019/12/1857402805.png" alt="model_gen_28.png"><br>生成的代码如下：<br><img src="https://img.rayu.me/2019/12/1778249973.png" alt="model_gen_29.png"></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;一、代码生成后，查看生成报告。&quot;&gt;&lt;a href=&quot;#一、代码生成后，查看生成报告。&quot; class=&quot;headerlink&quot; title=&quot;一、代码生成后，查看生成报告。&quot;&gt;&lt;/a&gt;一、代码生成后，查看生成报告。&lt;/h3&gt;&lt;p&gt;如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img
      
    
    </summary>
    
    
      <category term="matlab" scheme="http://rayuu.com/categories/matlab/"/>
    
    
      <category term="matlab" scheme="http://rayuu.com/tags/matlab/"/>
    
      <category term="simulink" scheme="http://rayuu.com/tags/simulink/"/>
    
  </entry>
  
  <entry>
    <title>基于ESP8266的微信门铃</title>
    <link href="http://rayuu.com/2017/11/13/esp8266-wechat-doorbell/"/>
    <id>http://rayuu.com/2017/11/13/esp8266-wechat-doorbell/</id>
    <published>2017-11-13T13:35:31.000Z</published>
    <updated>2017-11-13T13:36:18.277Z</updated>
    
    <content type="html"><![CDATA[<h2 id="基于ESP8266的微信门铃"><a href="#基于ESP8266的微信门铃" class="headerlink" title="基于ESP8266的微信门铃"></a>基于ESP8266的微信门铃</h2><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>最近在学习ESP8266，所以想用他来做个小玩意儿。</p><p>于是就有了这篇文章，其实最终实现的效果很简单。</p><p>就是当门铃按键按下，微信会收到消息提醒。</p><a id="more"></a><p>当然这只是初期，拓展的话可以进一步设计一套协议，添加更多设备，比如开关或者插座之类的电器设备。</p><p>添加用户绑定功能，实现数据双向通信。</p><p>下面介绍怎么完成他。</p><h1 id="一、硬件准备"><a href="#一、硬件准备" class="headerlink" title="一、硬件准备"></a>一、硬件准备</h1><h3 id="1、ESP8266模块"><a href="#1、ESP8266模块" class="headerlink" title="1、ESP8266模块"></a>1、ESP8266模块</h3><p>我选择的是nodemcu。因为他可以直接用micro usb烧录，下载程序方便。实质上他就是一块ESP8266.</p><h3 id="2、其他"><a href="#2、其他" class="headerlink" title="2、其他"></a>2、其他</h3><p>本来准备外接一个按键的，结果发现nodemcu上面自带了两个按键，一个复位键，一个flash键。</p><p>因为是做门铃，所以暂时不需要杜邦线和按键了，一个安卓充电线当做下载线就可以了。</p><h1 id="二、软件准备"><a href="#二、软件准备" class="headerlink" title="二、软件准备"></a>二、软件准备</h1><p>nodemcu原生是lua脚本来开发，但是我还是习惯用C来开发。</p><p>于是我的开发环境就是<code>VS2015+visual micro</code>。</p><p>软件环境的搭建，可以见我博客的前几篇文章。</p><blockquote><p>arduino IDE配置ESP8266开发环境<br><a href="https://blog.rayuu.com/arduinoesp8266.html" target="_blank" rel="noopener">https://blog.rayuu.com/arduinoesp8266.html</a></p></blockquote><blockquote><p>使用VS2015 visual micro安装开发arduino<br><a href="https://blog.rayuu.com/vs2015arduino.html" target="_blank" rel="noopener">https://blog.rayuu.com/vs2015arduino.html</a></p></blockquote><h1 id="三、系统架构"><a href="#三、系统架构" class="headerlink" title="三、系统架构"></a>三、系统架构</h1><ul><li><p>单片机部分：nodemcu采用C来编写；</p></li><li><p>后台：linux平台下使用python来写；</p></li><li><p>数据库：待定。</p></li><li><p>通信协议：基于MQTT+私有协议。</p></li></ul><p>初期计划实现步骤大致如下：</p><ol><li>ESP8266固件开发（NodeMcu）；</li><li>mqtt协议学习；</li><li>python版mqtt开发；</li><li>把wxpy与mqtt融合（后台开发）；</li><li>与web版微信对接。</li></ol><h1 id="使用说明"><a href="#使用说明" class="headerlink" title="使用说明"></a>使用说明</h1><h3 id="1、flash模式"><a href="#1、flash模式" class="headerlink" title="1、flash模式"></a>1、flash模式</h3><p>用户在开机前3秒内按下flash key，系统进入flash模式。</p><p>在该模式下，esp8266是AP模式，会生成一个wifi热点。名称为smledart_xxxxx   xxxxx为芯片ID。</p><p><img src="https://img.rayu.me/2017/11/2095694645.jpg" alt="QQ截图20171113200344.jpg"></p><p>用户连接该热点后，打开浏览器，输入<a href="http://192.168.4.1" target="_blank" rel="noopener" title="192.168.4.1">192.168.4.1</a><br>打开配置wifi界面</p><p><img src="https://img.rayu.me/2017/11/1415696817.jpg" alt="QQ截图20171113200423.jpg"></p><p>输入正确的wifi热点和密码，即你家里的可以上网的wifi热点。<br>服务器地址和端口，后续不会对用户开放。这里仅供测试用。</p><p><img src="https://img.rayu.me/2017/11/3708125702.png" alt="Image.png"></p><p>另外后续可能采用通过smartconfig方式来连接wifi。即通过手机发送UDP报文出来，esp8266通过搜索报文自动建立连接。</p><p>配置完成后，重启esp8266即可。</p><p>热点名称，密码，服务器IP和端口，设备信息等信息 存在flash内，用文件系统spiffs来挂载读写。</p><p>网页同样用文件系统保存，用html,js,css来编写网页</p><h3 id="2、normal模式"><a href="#2、normal模式" class="headerlink" title="2、normal模式"></a>2、normal模式</h3><p>开机，等5~6秒后，esp8266连上第一步配置的wifi后，同时也会连上服务器。</p><p>这时就可以正常使用了。</p><p>按下flashkey后，微信就会收到相应的消息了。这里按下flashkey不同于开机前三秒按下进入flash模式。</p><p><img src="https://img.rayu.me/2017/11/410307182.jpg" alt="QQ截图20171113200547.jpg"></p><p>最后放上录的小视频。</p><p><img src="https://img.rayu.me/2017/11/1714417562.gif" alt="aaa.gif"></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;基于ESP8266的微信门铃&quot;&gt;&lt;a href=&quot;#基于ESP8266的微信门铃&quot; class=&quot;headerlink&quot; title=&quot;基于ESP8266的微信门铃&quot;&gt;&lt;/a&gt;基于ESP8266的微信门铃&lt;/h2&gt;&lt;h1 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h1&gt;&lt;p&gt;最近在学习ESP8266，所以想用他来做个小玩意儿。&lt;/p&gt;
&lt;p&gt;于是就有了这篇文章，其实最终实现的效果很简单。&lt;/p&gt;
&lt;p&gt;就是当门铃按键按下，微信会收到消息提醒。&lt;/p&gt;
    
    </summary>
    
    
    
      <category term="esp8266" scheme="http://rayuu.com/tags/esp8266/"/>
    
  </entry>
  
  <entry>
    <title>最新版visual micro 破解</title>
    <link href="http://rayuu.com/2017/08/08/visualmicrocrack/"/>
    <id>http://rayuu.com/2017/08/08/visualmicrocrack/</id>
    <published>2017-08-08T13:33:30.000Z</published>
    <updated>2017-08-08T13:36:14.230Z</updated>
    
    <content type="html"><![CDATA[<p>安装完成visual micro 会有一个7天的试用期。<br>在网上找了一个dll爆破的帖子，借来参考一下。</p><blockquote><p>参考链接：<a href="http://www.52pojie.cn/forum.php?mod=viewthread&amp;tid=460921" target="_blank" rel="noopener">http://www.52pojie.cn/forum.php?mod=viewthread&amp;tid=460921</a>  visual micro爆破</p></blockquote><p>在安装目录下搜索 </p><p><code>Visual.Micro.Processing.Sketch.dll</code></p><p><img src="https://img.rayu.me/2017/08/4144619126.png" alt="1.png"></p><p>把它复制出来先备份。</p><p>然后 relfector 打开这个dll，</p><h2 id="记住是在原目录下打开哦！"><a href="#记住是在原目录下打开哦！" class="headerlink" title="记住是在原目录下打开哦！"></a><strong>记住是在原目录下打开哦！</strong></h2><p><img src="https://img.rayu.me/2017/08/3080921199.png" alt="2.png"></p><p>Visual.Micro.Utils.LicenseShared  下有一个 ProductActivated(String) : Boolean<br>选中，然后再打开“tools”，选中reflexil v2.1具体版本无所谓</p><p>插件链接分享 </p><p>链接：<a href="http://pan.baidu.com/s/1cAjM5w" target="_blank" rel="noopener">http://pan.baidu.com/s/1cAjM5w</a> 密码：v2hk</p><p>这是reflexil 2.1插件，点击工具tools addins就可以添加了。</p><p><img src="https://img.rayu.me/2017/08/3459621069.png" alt="3.png"></p><p>添加完成后如下图；</p><p><img src="https://img.rayu.me/2017/08/360295244.png" alt="4.png"></p><p>右下角会加载出下图所示：</p><p><img src="https://img.rayu.me/2017/08/1581867039.png" alt="5.png"></p><p>在上图空白处点右键，选中replace all with code,把activationmanager里面改为</p><p><strong>return true</strong></p><p><img src="https://img.rayu.me/2017/08/747689246.png" alt="6.png"></p><p>最后左下角点击compile编译，再点击ok.并保存</p><p><img src="https://img.rayu.me/2017/08/4290066799.png" alt="7.png"></p><p>就会出现一个 </p><p><code>Visual.Micro.Processing.Sketch.Patched.dll</code></p><p>把这个dll在原目录下替换为原来的就可以了。 名称需要和原来的一样。这样就不会提示注册了。</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;安装完成visual micro 会有一个7天的试用期。&lt;br&gt;在网上找了一个dll爆破的帖子，借来参考一下。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考链接：&lt;a href=&quot;http://www.52pojie.cn/forum.php?mod=viewthread&amp;
      
    
    </summary>
    
    
    
      <category term="arduino" scheme="http://rayuu.com/tags/arduino/"/>
    
  </entry>
  
  <entry>
    <title>使用VS2015 visual micro安装开发arduino</title>
    <link href="http://rayuu.com/2017/08/08/vs2015arduino/"/>
    <id>http://rayuu.com/2017/08/08/vs2015arduino/</id>
    <published>2017-08-08T13:31:12.000Z</published>
    <updated>2017-08-08T13:32:59.691Z</updated>
    
    <content type="html"><![CDATA[<p>使用vs2015可以更加高效的开发arduino，所以尝试安装了一下。</p><ul><li>打开VS2015-&gt;菜单栏工具-&gt;扩展和更新。</li></ul><p><img src="https://img.rayu.me/2017/08/2361705456.png" alt="1.png"></p><ul><li>搜索arduino</li></ul><p>安装arduino IDE for visual studio.</p><p><img src="https://img.rayu.me/2017/08/4282969379.png" alt="2.png"></p><ul><li>重新打开VS2015</li></ul><p>配置一下arduino ide的目录即可马上使用。</p><p><img src="https://img.rayu.me/2017/08/2235480008.png" alt="3.png"></p><p>在菜单栏“文件”下面点“新建”，会出现一个arduino project选项。</p><p><img src="https://img.rayu.me/2017/08/1864746094.png" alt="4.png"></p><p>然后输入工程名称即可新建工程。</p><p><img src="https://img.rayu.me/2017/08/1938886152.png" alt="5.png"></p><ul><li>配置</li></ul><p>选板子型号和串口。</p><p><img src="https://img.rayu.me/2017/08/2479133433.png" alt="6.png"></p><p>如果不想下载程序后调试，就可以关闭automatic debugging.<br>具体操作如下图：</p><p><img src="https://img.rayu.me/2017/08/4252945488.png" alt="7.png"></p><p>在菜单栏“工具”-&gt;“选项”，也可以配置visual micro</p><p><img src="https://img.rayu.me/2017/08/4053589983.png" alt="8.png"></p><p>至于这个debugger调试不是很方便，只能在loop那里断点，查看变量参数。</p><p>编译生成的HEX文件在debug或者release下面。</p><p>这个visual micro的破解方法见另一篇文章。</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;使用vs2015可以更加高效的开发arduino，所以尝试安装了一下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开VS2015-&amp;gt;菜单栏工具-&amp;gt;扩展和更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://img.rayu.me/2017/08/236170
      
    
    </summary>
    
    
    
      <category term="arduino" scheme="http://rayuu.com/tags/arduino/"/>
    
  </entry>
  
  <entry>
    <title>gcc编译流程解析</title>
    <link href="http://rayuu.com/2017/03/14/gccanalysis/"/>
    <id>http://rayuu.com/2017/03/14/gccanalysis/</id>
    <published>2017-03-14T14:45:24.000Z</published>
    <updated>2019-12-10T12:53:22.505Z</updated>
    
    <content type="html"><![CDATA[<h2 id="gcc编译流程解析"><a href="#gcc编译流程解析" class="headerlink" title="gcc编译流程解析"></a>gcc编译流程解析</h2><p>[TOC]</p><a id="more"></a><h3 id="1、预处理"><a href="#1、预处理" class="headerlink" title="1、预处理"></a>1、预处理</h3><pre class=" language-C"><code class="language-C">    #include<stdio.h>    int main()    {        printf("Hello! This is our embedded world!\n");        return 0;    }</code></pre><p>在该阶段，对包含的头文件（<code>#include</code>）和宏定义（<code>#define</code>、<code>#ifdef</code>等）进行处理。</p><p>可以通过<code>gcc -E</code>选项进行查看。该选项的作用是让gcc 在预处理结束后停止编译过程。</p><p><code>gcc -E hello.c -o hello.i</code></p><p><code>-o</code>是指目标文件。 <code>.i</code>文件为经预处理后的C程序。</p><h3 id="2、编译阶段"><a href="#2、编译阶段" class="headerlink" title="2、编译阶段"></a>2、编译阶段</h3><p><code>gcc -S hello.i -o hello.s</code><br>上述命令只进行编译不进行汇编，结果生成汇编代码。</p><p>在编译阶段，gcc首先要检查代码的规范性、是否有语法错误。</p><h3 id="3、汇编阶段"><a href="#3、汇编阶段" class="headerlink" title="3、汇编阶段"></a>3、汇编阶段</h3><p>汇编阶段把编译阶段生成的.s文件转成目标文件。</p><p><code>gcc -c hello.s -o hello.o</code></p><p>把汇编代码转为二进制目标代码。</p><h3 id="4、链接阶段"><a href="#4、链接阶段" class="headerlink" title="4、链接阶段"></a>4、链接阶段</h3><p>链接时gcc会到系统默认的搜索路径<code>/usr/lib</code>下进行查找动态库。</p><p>函数库用动态库和静态库两种。</p><p>静态库是指编译链接时，将库文件的代码全部加入到可执行文件中。生成文件比较大。在运行时也就不再需要库文件了。后缀名通常为<code>.a</code></p><p>动态库与之相反，在编译链接时并没有将库文件的代码加入可执行文件中，而是在程序执行时加载库。这样可以减轻系统的开销。一般动态库的后缀名为<code>.so</code> .</p><blockquote><p>gcc编译时默认使用动态库。</p></blockquote><p>完成了链接之后，gcc就可以生成可执行文件。</p><p><code>gcc hello.o -o hello</code></p><p><code>./hello</code></p><blockquote><p>gcc编译选项分析</p></blockquote><h3 id="gcc-常用选项列表"><a href="#gcc-常用选项列表" class="headerlink" title="gcc 常用选项列表"></a>gcc 常用选项列表</h3><table><thead><tr><th>选 项</th><th>含 义</th></tr></thead><tbody><tr><td><code>-c</code></td><td>只编译不链接，生成目标文件“ <code>.o</code>”</td></tr><tr><td><code>-S</code></td><td>只编译不汇编，生成汇编代码</td></tr><tr><td><code>-E</code></td><td>只进行预编译，不做其他处理</td></tr><tr><td><code>-g</code></td><td>在可执行程序中包含标准调试信息</td></tr><tr><td><code>-o file</code></td><td>将 file 文件指定为输出文件</td></tr><tr><td><code>-v</code></td><td>打印出编译器内部编译各过程的命令行信息和编译器的版本</td></tr><tr><td><code>-I dir</code></td><td>在头文件的搜索路径列表中添加 dir 目录</td></tr><tr><td><code>-I dir</code>选项可以在头问价的搜索路径列表中添加dir目录。</td><td></td></tr></tbody></table><p>Linux中默认头文件都放到了“<code>/usr/include/</code>”目录下。因此如果用户希望添加放置在其他位置的头文件时，就可以通过“-I dir”选项来指定。</p><p><code>gcc hello.c -I /home/rayu/cstudy/  -o hello</code></p><p>###　gcc 库选项列表</p><table><thead><tr><th>选 项</th><th>含 义</th></tr></thead><tbody><tr><td>-static</td><td>进行静态编译，即链接静态库，禁止使用动态库</td></tr><tr><td>-shared</td><td>1．可以生成动态库文件 <br> 2．进行动态编译，尽可能地链接动态库，只有当没有动态库时才会链接同名的静态库（默认选项，即可省略）</td></tr><tr><td>-L dir</td><td>在库文件的搜索路径列表中添加 dir 目录-lname链接称为 libname.a（静态库）或者 libname.so（动态库）的库文件。若两个库都存在，则根据编译方式（ -static 还是-shared）而进行链接</td></tr><tr><td>-fPIC(或-fpic)</td><td>生成使用相对地址的位置无关的目标代码（ Position Independent Code）。然后通常使用gcc 的-static 选项从该 PIC 目标文件生成动态库文件</td></tr></tbody></table><h3 id="静态库的创建和使用"><a href="#静态库的创建和使用" class="headerlink" title="静态库的创建和使用"></a>静态库的创建和使用</h3><pre class=" language-C"><code class="language-C">/* unsgn_pow.c：库程序 */unsigned long long unsgn_pow(unsigned int x, unsigned int y){    unsigned long long res = 1;    if (y == 0)    {        res = 1;    }    else if (y == 1)    {        res = x;    }    else    {        res = x * unsgn_pow(x, y - 1);    }    return res;}</code></pre><pre class=" language-C"><code class="language-C">#include<stdio.h>#include<stdlib.h>int main(int argc,char *argv[]){    unsigned int x,y;    unsigned long long res;    if((argc<3) || (sscanf(argv[1],"%u",&x)!=1) || (sscanf(argv[2],"%u",&y))!=1)    {        printf("Usage: pow base exponent\n");        exit(1);    }    res = unsgn_pow(x,y);    printf("%u ^ %u = %u\n",x,y,res);    exit(0);}</code></pre><pre><code>gcc -c unsgn_pow.car rcsv libpow.a unsgn_pow.ogcc -o pow_test pow_test.c -L. -lpow./pow_test 2 10</code></pre><h3 id="动态库的创建和使用"><a href="#动态库的创建和使用" class="headerlink" title="动态库的创建和使用"></a>动态库的创建和使用</h3><p>首先使用 <code>gcc  -fPIC</code>选项为动态库构造一个目标文件</p><p><code>gcc -fPIC -Wall -c unsgn_pow.c</code></p><p>接下来，使用<code>-shared</code>选项和已创建的位置无关目标代码，生成一个动态库<code>libpow.so</code></p><p><code>gcc -shared -o libpow.so unsgn_pow.o</code></p><p>下面编译主程序，它将会链接到刚刚生成的动态库<code>libpow.so</code></p><p><code>gcc -o pow_test pow_test.c -L. -lpow</code></p><p>在运行可执行程序之前，需要注册动态库的路径名。其方法有几种：修改<code>/etc/ld.so.conf</code>文件，或者修改<code>LD_LIBRARY_PATH</code>环境变量，或者将库文件直接复制到<code>/lib</code>或者<code>/usr/lib</code>目录下（这两个目录为同的默认的库路径名）</p><pre><code>cp libpow.so /lib./pow_test 2 10</code></pre><h3 id="告警和出错选项"><a href="#告警和出错选项" class="headerlink" title="告警和出错选项"></a>告警和出错选项</h3><p>gcc 的告警和出错选项。</p><p>gcc 警告和出错选项选项列表</p><table><thead><tr><th>选 项</th><th>含 义</th></tr></thead><tbody><tr><td>-ansi</td><td>支持符合 ANSI 标准的 C 程序</td></tr><tr><td>-pedantic</td><td>允许发出 ANSI C 标准所列的全部警告信息</td></tr><tr><td>-pedantic -error</td><td>允许发出 ANSI C 标准所列的全部错误信息</td></tr><tr><td>-w</td><td>关闭所有告警</td></tr><tr><td>-Wall</td><td>允许发出 gcc 提供的所有有用的报警信息</td></tr><tr><td>-Werror</td><td>把所有的告警信息转化为错误信息，并在告警发生时终止编译过程</td></tr></tbody></table><p><code>gcc –Wall  –O -g –c kang.c -o kang.o</code></p><p><code>-Wall</code> 是打开警告开关，<br><code>-O</code>代表默认优化，可选：-O0不优化，-O1低级优化，-O2中级优化，-O3高级优化，-Os代码空间优化。<br><code>-g</code>是生成调试信息，生成的可执行文件具有和源代码关联的可调试的信息。</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;gcc编译流程解析&quot;&gt;&lt;a href=&quot;#gcc编译流程解析&quot; class=&quot;headerlink&quot; title=&quot;gcc编译流程解析&quot;&gt;&lt;/a&gt;gcc编译流程解析&lt;/h2&gt;&lt;p&gt;[TOC]&lt;/p&gt;
    
    </summary>
    
    
    
      <category term="c/c++" scheme="http://rayuu.com/tags/c-c/"/>
    
  </entry>
  
  <entry>
    <title>浏览器首页被hao.qquu8.com劫持</title>
    <link href="http://rayuu.com/2017/03/09/chromehao123/"/>
    <id>http://rayuu.com/2017/03/09/chromehao123/</id>
    <published>2017-03-09T11:10:55.000Z</published>
    <updated>2017-03-14T14:53:38.924Z</updated>
    
    <content type="html"><![CDATA[<p>昨天帮一个同学找了一个小马激活工具，今天早上电脑一开机，打开浏览器就发现首页变为了</p><p><a href="http://hao.qquu8.com/" target="_blank" rel="noopener">http://hao.qquu8.com/</a> 然后跳转到hao123。</p><a id="more"></a><p>心想还是要支持正版系统啊！</p><p>我首先是改浏览器的配置，把chrome的首页设置为打开新的标签页，结果操作无效。</p><p>紧接着我分别删除了桌面和任务栏chrome的快捷方式，属性快捷方式目标后面跟的<a href="http://hao.qquu8.com/?m=yx&amp;r=j这个链接。" target="_blank" rel="noopener">http://hao.qquu8.com/?m=yx&amp;r=j这个链接。</a></p><p><code>"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"</code>只保留这个，还有任务栏的地址在</p><pre><code>C:\Users\rayu\AppData\Roaming\Microsoft\Internet Explorer\Quick LaunchC:\Users\rayu\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar</code></pre><p>这两个地方的<a href="http://hao.qquu8.com/也删除了。" target="_blank" rel="noopener">http://hao.qquu8.com/也删除了。</a></p><p><img src="http://blog.rayuu.com/usr/uploads/2017/03/1570470093.png" alt="a"></p><p>这时候打开浏览器不会跳转到hao123了，我以为战斗结束了，也就没去管他了。</p><p>过了几个小时，我把浏览器关掉重新打开，发现又出现了hao123首页。</p><p>这我就不淡定了，强迫症又犯了。</p><p>开始网上找解决方案。</p><p>参考文章：<a href="http://xinghao.me/2016/03/01/2016-03-01-kill-hao123/" target="_blank" rel="noopener">http://xinghao.me/2016/03/01/2016-03-01-kill-hao123/</a></p><p>我其实就是按照上面链接里的方法来做的。</p><p>不过还是要自己记录一下是怎么做的。</p><h3 id="1、用WMI-Event-Viewer查看WMI事件。下载地址：http-down-cncrk-com-8080-soft-keygen-WMITools-zip"><a href="#1、用WMI-Event-Viewer查看WMI事件。下载地址：http-down-cncrk-com-8080-soft-keygen-WMITools-zip" class="headerlink" title="1、用WMI Event Viewer查看WMI事件。下载地址：http://down.cncrk.com:8080/soft/keygen/WMITools.zip"></a>1、用WMI Event Viewer查看WMI事件。下载地址：<a href="http://down.cncrk.com:8080/soft/keygen/WMITools.zip" target="_blank" rel="noopener">http://down.cncrk.com:8080/soft/keygen/WMITools.zip</a></h3><h3 id="2、用管理员打开wbemeventviewer-exe，在root-CIMV2里面选择-EventConsumer-gt-ActiveScriptEventConsumer"><a href="#2、用管理员打开wbemeventviewer-exe，在root-CIMV2里面选择-EventConsumer-gt-ActiveScriptEventConsumer" class="headerlink" title="2、用管理员打开wbemeventviewer.exe，在root\CIMV2里面选择_EventConsumer -> ActiveScriptEventConsumer"></a>2、用管理员打开wbemeventviewer.exe，在root\CIMV2里面选择_EventConsumer -&gt; ActiveScriptEventConsumer</h3><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2017/03/1824951337.png" alt="2"></p><p>双击ActiveScriptEventConsumer.Name=”VBScriptKids_consumer”，弹出属性页面：</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2017/03/3738714703.png" alt="3"></p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2017/03/991659301.png" alt="4"></p><p>在 ScriptText里面看见了hao.qquu8.com/?m=yx&amp;r=j这一串代码。</p><p>然后把它删掉，或者直接在WMI event viewer中将“_EventFilter:Name=”unown_filter””项目右键删除！</p><p>这样问题就解决了。</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;昨天帮一个同学找了一个小马激活工具，今天早上电脑一开机，打开浏览器就发现首页变为了&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://hao.qquu8.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://hao.qquu8.com/&lt;/a&gt; 然后跳转到hao123。&lt;/p&gt;
    
    </summary>
    
    
    
      <category term="chrome主页劫持" scheme="http://rayuu.com/tags/chrome%E4%B8%BB%E9%A1%B5%E5%8A%AB%E6%8C%81/"/>
    
  </entry>
  
  <entry>
    <title>换了一个新主题</title>
    <link href="http://rayuu.com/2016/12/08/newtheme/"/>
    <id>http://rayuu.com/2016/12/08/newtheme/</id>
    <published>2016-12-08T14:07:08.000Z</published>
    <updated>2016-12-08T14:07:47.730Z</updated>
    
    <content type="html"><![CDATA[<h1 id="换了一个新主题"><a href="#换了一个新主题" class="headerlink" title="换了一个新主题"></a>换了一个新主题</h1><p>感觉自己萌萌哒！！！！</p><a id="more"></a><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;换了一个新主题&quot;&gt;&lt;a href=&quot;#换了一个新主题&quot; class=&quot;headerlink&quot; title=&quot;换了一个新主题&quot;&gt;&lt;/a&gt;换了一个新主题&lt;/h1&gt;&lt;p&gt;感觉自己萌萌哒！！！！&lt;/p&gt;
    
    </summary>
    
    
    
      <category term="随笔" scheme="http://rayuu.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>利用pyqt4编写cs计算工具</title>
    <link href="http://rayuu.com/2016/12/03/calcspyqt/"/>
    <id>http://rayuu.com/2016/12/03/calcspyqt/</id>
    <published>2016-12-03T14:24:05.000Z</published>
    <updated>2016-12-07T11:32:44.508Z</updated>
    
    <content type="html"><![CDATA[<p>利用pyqt4编写cs计算工具</p><p>之前用Python做了一个通道号查找的小程序，只不过没有做界面。</p><p>最近的一个项目要用到帧校验（CS），为了方便，写了一个计算的小程序。</p><a id="more"></a><p>该程序用了QT4来做界面，也算是我的第一个QT小程序。</p><p>现在来分享一下编写过程中的心得体会，以及遇到的坑。</p><p>Python的环境是2.7。</p><p>CS校验和的C代码如下：</p><pre class=" language-cpp"><code class="language-cpp">    <span class="token comment" spellcheck="true">/******************************************************************    *校验码 将所有相加MOD 256    *******************************************************************/</span>    <span class="token keyword">unsigned</span> <span class="token keyword">char</span> <span class="token function">Get_csckNum</span><span class="token punctuation">(</span> <span class="token keyword">unsigned</span> <span class="token keyword">char</span> <span class="token operator">*</span>Ptr<span class="token punctuation">,</span> <span class="token keyword">unsigned</span> <span class="token keyword">char</span> Len <span class="token punctuation">)</span>    <span class="token punctuation">{</span>        <span class="token keyword">register</span> <span class="token keyword">unsigned</span> <span class="token keyword">char</span> Num<span class="token punctuation">;</span>        Num <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>        <span class="token keyword">while</span><span class="token punctuation">(</span> Len <span class="token operator">></span> <span class="token number">0</span> <span class="token punctuation">)</span>        <span class="token punctuation">{</span>            Num <span class="token operator">+</span><span class="token operator">=</span> <span class="token operator">*</span>Ptr<span class="token punctuation">;</span>            <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d--%d\n"</span><span class="token punctuation">,</span>Len<span class="token punctuation">,</span>Num<span class="token punctuation">)</span><span class="token punctuation">;</span>            Ptr<span class="token operator">++</span><span class="token punctuation">;</span>            Len<span class="token operator">--</span><span class="token punctuation">;</span>        <span class="token punctuation">}</span>        <span class="token keyword">return</span> Num<span class="token punctuation">;</span>    <span class="token punctuation">}</span></code></pre><p>转为Python代码</p><pre class=" language-python"><code class="language-python">    <span class="token keyword">def</span> <span class="token function">CalCS</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span>inputstr<span class="token punctuation">)</span><span class="token punctuation">:</span>        input <span class="token operator">=</span> inputstr<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span>        content <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>        <span class="token keyword">for</span> i <span class="token keyword">in</span> range<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> len<span class="token punctuation">(</span>input<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">:</span>            content<span class="token punctuation">.</span>append<span class="token punctuation">(</span>input<span class="token punctuation">[</span>i<span class="token punctuation">:</span>i <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span>        <span class="token keyword">print</span> content        int_list <span class="token operator">=</span> <span class="token punctuation">[</span>int<span class="token punctuation">(</span>i<span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> content<span class="token punctuation">]</span>        <span class="token keyword">print</span> int_list        num <span class="token operator">=</span> <span class="token number">0</span>        <span class="token keyword">for</span> i <span class="token keyword">in</span> range<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> len<span class="token punctuation">(</span>int_list<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span>            num <span class="token operator">=</span> num <span class="token operator">+</span> int<span class="token punctuation">(</span>int_list<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span>        <span class="token keyword">return</span> hex<span class="token punctuation">(</span>num <span class="token operator">%</span> <span class="token number">256</span><span class="token punctuation">)</span></code></pre><h2 id="一、软件界面设计"><a href="#一、软件界面设计" class="headerlink" title="一、软件界面设计"></a>一、软件界面设计</h2><p>我用的是QT Designer来进行界面的绘制，第一次用。但是感觉直接写代码来绘制图形界面提升的会更快。<br>首先打开QT designer，添加需要用到的小组件。<br>最终我的设计界面如下：</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/12/684297600.png" alt=""></p><p>界面绘制完成后，保存会生成一个后缀名为.ui的文件。</p><h2 id="二、Python程序的编写"><a href="#二、Python程序的编写" class="headerlink" title="二、Python程序的编写"></a>二、Python程序的编写</h2><p>界面完成后，进行框架的导入。<br>开始编写程序。</p><pre class=" language-python"><code class="language-python">    <span class="token keyword">from</span> __future__ <span class="token keyword">import</span> division    <span class="token keyword">import</span> sys    <span class="token keyword">from</span> PyQt4 <span class="token keyword">import</span> QtCore<span class="token punctuation">,</span> QtGui<span class="token punctuation">,</span>uic    <span class="token keyword">from</span> uicode <span class="token keyword">import</span> <span class="token operator">*</span>    qtCreatorFile <span class="token operator">=</span> <span class="token string">"calc.ui"</span> <span class="token comment" spellcheck="true"># Enter file here.</span>    Ui_MainWindow<span class="token punctuation">,</span> QtBaseClass <span class="token operator">=</span> uic<span class="token punctuation">.</span>loadUiType<span class="token punctuation">(</span>qtCreatorFile<span class="token punctuation">)</span>    <span class="token keyword">class</span> <span class="token class-name">MyApp</span><span class="token punctuation">(</span>QtGui<span class="token punctuation">.</span>QMainWindow<span class="token punctuation">,</span> Ui_MainWindow<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>            QtGui<span class="token punctuation">.</span>QMainWindow<span class="token punctuation">.</span>__init__<span class="token punctuation">(</span>self<span class="token punctuation">)</span>            Ui_MainWindow<span class="token punctuation">.</span>__init__<span class="token punctuation">(</span>self<span class="token punctuation">)</span>            self<span class="token punctuation">.</span>setupUi<span class="token punctuation">(</span>self<span class="token punctuation">)</span>            self<span class="token punctuation">.</span>calc_button<span class="token punctuation">.</span>clicked<span class="token punctuation">.</span>connect<span class="token punctuation">(</span>self<span class="token punctuation">.</span>CalculateTax<span class="token punctuation">)</span>        <span class="token keyword">def</span> <span class="token function">CalculateTax</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>            content <span class="token operator">=</span> str<span class="token punctuation">(</span>self<span class="token punctuation">.</span>content_box<span class="token punctuation">.</span>toPlainText<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>            total <span class="token operator">=</span> self<span class="token punctuation">.</span>CalCS<span class="token punctuation">(</span>content<span class="token punctuation">)</span>            total_string <span class="token operator">=</span> <span class="token string">""</span> <span class="token operator">+</span> str<span class="token punctuation">(</span>total<span class="token punctuation">)</span>            self<span class="token punctuation">.</span>results_window<span class="token punctuation">.</span>setText<span class="token punctuation">(</span>total_string<span class="token punctuation">)</span>        <span class="token keyword">def</span> <span class="token function">CalCS</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span>inputstr<span class="token punctuation">)</span><span class="token punctuation">:</span>            input <span class="token operator">=</span> inputstr<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span>            content <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>            <span class="token keyword">for</span> i <span class="token keyword">in</span> range<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> len<span class="token punctuation">(</span>input<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">:</span>                content<span class="token punctuation">.</span>append<span class="token punctuation">(</span>input<span class="token punctuation">[</span>i<span class="token punctuation">:</span>i <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span>            <span class="token comment" spellcheck="true"># print content</span>            int_list <span class="token operator">=</span> <span class="token punctuation">[</span>int<span class="token punctuation">(</span>i<span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> content<span class="token punctuation">]</span>            <span class="token comment" spellcheck="true"># print int_list</span>            num <span class="token operator">=</span> <span class="token number">0</span>            <span class="token keyword">for</span> i <span class="token keyword">in</span> range<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> len<span class="token punctuation">(</span>int_list<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span>                num <span class="token operator">=</span> num <span class="token operator">+</span> int<span class="token punctuation">(</span>int_list<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span>            <span class="token keyword">return</span> hex<span class="token punctuation">(</span>num <span class="token operator">%</span> <span class="token number">256</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span>        app <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QApplication<span class="token punctuation">(</span>sys<span class="token punctuation">.</span>argv<span class="token punctuation">)</span>        window <span class="token operator">=</span> MyApp<span class="token punctuation">(</span><span class="token punctuation">)</span>        window<span class="token punctuation">.</span>show<span class="token punctuation">(</span><span class="token punctuation">)</span>        sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span>app<span class="token punctuation">.</span>exec_<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre><p>至此，最简单的程序就编写完成了。</p><h2 id="三、生成exe可执行程序"><a href="#三、生成exe可执行程序" class="headerlink" title="三、生成exe可执行程序"></a>三、生成exe可执行程序</h2><p>利用pyinstaller直接生成。<br>命令代码：</p><pre><code>pyinstaller -w -F main.py</code></pre><p>具体见下面链接<br><a href="http://blog.rayuu.com/pyinstaller_py2exe_exe.html" target="_blank" rel="noopener">http://blog.rayuu.com/pyinstaller_py2exe_exe.html</a><br>但是在生成的过程中会报错，原因是.ui的界面代码没有打包到exe文件里面去。</p><p>所以不得不另辟蹊径。</p><p>在网上找了好久资料。最后的解决方法如下：</p><blockquote><p>1、首先尝试在QT Designer下直接生成代码。</p></blockquote><p>在菜单栏，窗体，查看代码下。</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/12/2989482191.png" alt=""></p><p>结果运行报错。</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/12/815996677.png" alt=""></p><p>可能实在安装过程中出了错误，安装位置好像不能有中文和空格。</p><p>接着尝试第二种方式。</p><blockquote><p>2、利用uic路径下的pyuic.py生成代码</p></blockquote><p>在生成ui文件后，利用\Python27\Lib\site-packages\PyQt4\uic下面的pyuic.py进行生成代码。</p><pre><code>pyuic4 -o ui_xxx.py xxx.ui</code></pre><p>也可以用pycharm进行转换。</p><p>也可以写一个批处理文件进行快速转换，把下面的批处理文件放置在UIC目录下。</p><p>接着把需要转换的ui文件拖入到批处理文件打开，就可以转换成功了。</p><p>我的是在D盘目录下，所以里面的代码自行修改。</p><pre><code>@echo off@cd /d "%~dp0"pyuic4 %1 &gt; %~n1.py</code></pre><p>这样代码就转换成功了。</p><p>本次生成的界面代码文件名称为 <code>uicode.py</code></p><p>下面修改代码</p><pre class=" language-python"><code class="language-python">    <span class="token keyword">from</span> __future__ <span class="token keyword">import</span> division    <span class="token keyword">import</span> sys    <span class="token keyword">from</span> PyQt4 <span class="token keyword">import</span> QtCore<span class="token punctuation">,</span> QtGui<span class="token punctuation">,</span>uic    <span class="token comment" spellcheck="true"># 从uicode.py里面导入界面代码</span>    <span class="token keyword">from</span> uicode <span class="token keyword">import</span> <span class="token operator">*</span>    <span class="token keyword">class</span> <span class="token class-name">MyApp</span><span class="token punctuation">(</span>QtGui<span class="token punctuation">.</span>QMainWindow<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">def</span> <span class="token function">__init__</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span>parent<span class="token operator">=</span>None<span class="token punctuation">)</span><span class="token punctuation">:</span>            QtGui<span class="token punctuation">.</span>QWidget<span class="token punctuation">.</span>__init__<span class="token punctuation">(</span>self<span class="token punctuation">,</span>parent<span class="token punctuation">)</span>            <span class="token comment" spellcheck="true"># 重载</span>            self<span class="token punctuation">.</span>ui<span class="token operator">=</span>Ui_MainWindow<span class="token punctuation">(</span><span class="token punctuation">)</span>            self<span class="token punctuation">.</span>ui<span class="token punctuation">.</span>setupUi<span class="token punctuation">(</span>self<span class="token punctuation">)</span>            self<span class="token punctuation">.</span>ui<span class="token punctuation">.</span>calc_button<span class="token punctuation">.</span>clicked<span class="token punctuation">.</span>connect<span class="token punctuation">(</span>self<span class="token punctuation">.</span>CalculateTax<span class="token punctuation">)</span>        <span class="token keyword">def</span> <span class="token function">CalculateTax</span><span class="token punctuation">(</span>self<span class="token punctuation">)</span><span class="token punctuation">:</span>            content <span class="token operator">=</span> str<span class="token punctuation">(</span>self<span class="token punctuation">.</span>ui<span class="token punctuation">.</span>content_box<span class="token punctuation">.</span>toPlainText<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>            total <span class="token operator">=</span> self<span class="token punctuation">.</span>CalCS<span class="token punctuation">(</span>content<span class="token punctuation">)</span>            total_string <span class="token operator">=</span> <span class="token string">""</span> <span class="token operator">+</span> str<span class="token punctuation">(</span>total<span class="token punctuation">)</span>            self<span class="token punctuation">.</span>ui<span class="token punctuation">.</span>results_window<span class="token punctuation">.</span>setText<span class="token punctuation">(</span>total_string<span class="token punctuation">)</span>        <span class="token keyword">def</span> <span class="token function">CalCS</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span>inputstr<span class="token punctuation">)</span><span class="token punctuation">:</span>            input <span class="token operator">=</span> inputstr<span class="token punctuation">.</span>replace<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">,</span> <span class="token string">""</span><span class="token punctuation">)</span>            content <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>            <span class="token keyword">for</span> i <span class="token keyword">in</span> range<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> len<span class="token punctuation">(</span>input<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">:</span>                content<span class="token punctuation">.</span>append<span class="token punctuation">(</span>input<span class="token punctuation">[</span>i<span class="token punctuation">:</span>i <span class="token operator">+</span> <span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span>            <span class="token comment" spellcheck="true"># print content</span>            int_list <span class="token operator">=</span> <span class="token punctuation">[</span>int<span class="token punctuation">(</span>i<span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">)</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> content<span class="token punctuation">]</span>            <span class="token comment" spellcheck="true"># print int_list</span>            num <span class="token operator">=</span> <span class="token number">0</span>            <span class="token keyword">for</span> i <span class="token keyword">in</span> range<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> len<span class="token punctuation">(</span>int_list<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span>                num <span class="token operator">=</span> num <span class="token operator">+</span> int<span class="token punctuation">(</span>int_list<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span>            <span class="token keyword">return</span> hex<span class="token punctuation">(</span>num <span class="token operator">%</span> <span class="token number">256</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">"__main__"</span><span class="token punctuation">:</span>        app <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QApplication<span class="token punctuation">(</span>sys<span class="token punctuation">.</span>argv<span class="token punctuation">)</span>        window <span class="token operator">=</span> MyApp<span class="token punctuation">(</span><span class="token punctuation">)</span>        window<span class="token punctuation">.</span>show<span class="token punctuation">(</span><span class="token punctuation">)</span>        sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span>app<span class="token punctuation">.</span>exec_<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre><p>最后重新打包生成exe文件就可以直接运行了。</p><p>只是打包的库比较多，所以最后的程序大小有10几兆。</p><p>最后：</p><p>另外，如果界面需要加载资源文件的话，还要进行另外的操作，把资源文件转为.qrc后缀的文件。</p><p><a href="http://www.cnblogs.com/dcb3688/p/4237121.html" target="_blank" rel="noopener">http://www.cnblogs.com/dcb3688/p/4237121.html</a></p><p>转换资源文件用的是<code>Pyqt</code>的<code>pyrcc4</code>命令</p><pre><code>pyrcc4 qrcfile.qrc -o  pyfile.py</code></pre><blockquote><p>1.Pycharm集成pyrcc4</p></blockquote><p>我们使用Pycharm来集成pyrcc4，这样更利于我们高效开发</p><p>首先在菜单里面找到 <code>File =&gt; settings =&gt; Tools =&gt; External Tools</code>   （外边工具设置）</p><p>选择添加Add </p><p>Name 填写： Rcc2Py</p><p>Group： 自已任意填写，我填写的是PyQt4</p><p>下面的Options默认</p><p>在Tools settings 里面这样填写：</p><p>Program 就是你安装Pyqt4的路径</p><p>Parameters 是指转换的参数      $FileName$ -o $FileNameWithoutExtension$.py</p><p>Working directory 表示输出在当前的工作目录   $FileDir$</p><blockquote><p>2.转换qrc为py</p></blockquote><p>选择要转换的qrc文件，右键，找到group 为（PyQt4） 目录下的Rcc2Py </p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/12/3304270685.jpg" alt=""></p><p>转换完成后，同级目录下就多出一个与qrc文件同命名的py文件。</p><blockquote><p>3、引用资源py文件</p></blockquote><p>py文件生成好了如何来引用使用呢？</p><p>说对了，引用就这么简单</p><pre><code>import uicode</code></pre><p>使用的时候 冒号 “   ： ”  加 图片的路径， 如：</p><pre><code>:/img/firefox.png</code></pre><p>运行试试，发现图片不显示，为什么呢，因为qrc文件添加过程中，我加了一个 “前缀” prefix。<br>所以，如果在qrc文件中不添加前缀 使用   <code>:/img/firefox.png</code> 是可以的，但添加了前缀生成的qrc文件 qresource标签会多一个属性</p><pre><code>qresource prefix="picture"</code></pre><p>在这里，正确的使用是：</p><pre><code>:picture/img/firefox.png</code></pre><p>附：<code>uicode.py</code></p><pre class=" language-python"><code class="language-python">    <span class="token comment" spellcheck="true"># -*- coding: utf-8 -*-</span>    <span class="token comment" spellcheck="true"># Form implementation generated from reading ui file 'C:\Users\jx007\Desktop\PyQt_first-master\calc.ui'</span>    <span class="token comment" spellcheck="true">#</span>    <span class="token comment" spellcheck="true"># Created by: PyQt4 UI code generator 4.11.4</span>    <span class="token comment" spellcheck="true">#</span>    <span class="token comment" spellcheck="true"># WARNING! All changes made in this file will be lost!</span>    <span class="token keyword">from</span> PyQt4 <span class="token keyword">import</span> QtCore<span class="token punctuation">,</span> QtGui    <span class="token comment" spellcheck="true"># 导入资源</span>    <span class="token keyword">import</span> sources    <span class="token keyword">try</span><span class="token punctuation">:</span>         _fromUtf8 <span class="token operator">=</span> QtCore<span class="token punctuation">.</span>QString<span class="token punctuation">.</span>fromUtf8    <span class="token keyword">except</span> AttributeError<span class="token punctuation">:</span>         <span class="token keyword">def</span> <span class="token function">_fromUtf8</span><span class="token punctuation">(</span>s<span class="token punctuation">)</span><span class="token punctuation">:</span>              <span class="token keyword">return</span> s    <span class="token keyword">try</span><span class="token punctuation">:</span>        _encoding <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QApplication<span class="token punctuation">.</span>UnicodeUTF8        <span class="token keyword">def</span> <span class="token function">_translate</span><span class="token punctuation">(</span>context<span class="token punctuation">,</span> text<span class="token punctuation">,</span> disambig<span class="token punctuation">)</span><span class="token punctuation">:</span>            <span class="token keyword">return</span> QtGui<span class="token punctuation">.</span>QApplication<span class="token punctuation">.</span>translate<span class="token punctuation">(</span>context<span class="token punctuation">,</span> text<span class="token punctuation">,</span> disambig<span class="token punctuation">,</span> _encoding<span class="token punctuation">)</span>    <span class="token keyword">except</span> AttributeError<span class="token punctuation">:</span>         <span class="token keyword">def</span> <span class="token function">_translate</span><span class="token punctuation">(</span>context<span class="token punctuation">,</span> text<span class="token punctuation">,</span> disambig<span class="token punctuation">)</span><span class="token punctuation">:</span>              <span class="token keyword">return</span> QtGui<span class="token punctuation">.</span>QApplication<span class="token punctuation">.</span>translate<span class="token punctuation">(</span>context<span class="token punctuation">,</span> text<span class="token punctuation">,</span> disambig<span class="token punctuation">)</span>    <span class="token keyword">class</span> <span class="token class-name">Ui_MainWindow</span><span class="token punctuation">(</span>object<span class="token punctuation">)</span><span class="token punctuation">:</span>         <span class="token keyword">def</span> <span class="token function">setupUi</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> MainWindow<span class="token punctuation">)</span><span class="token punctuation">:</span>               MainWindow<span class="token punctuation">.</span>setObjectName<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"MainWindow"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                MainWindow<span class="token punctuation">.</span>resize<span class="token punctuation">(</span><span class="token number">700</span><span class="token punctuation">,</span> <span class="token number">240</span><span class="token punctuation">)</span>                icon <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QIcon<span class="token punctuation">(</span><span class="token punctuation">)</span>                <span class="token comment" spellcheck="true"># icon.addPixmap(QtGui.QPixmap(_fromUtf8("ico.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)</span>                icon<span class="token punctuation">.</span>addPixmap<span class="token punctuation">(</span>QtGui<span class="token punctuation">.</span>QPixmap<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">":ico/ico.png"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> QtGui<span class="token punctuation">.</span>QIcon<span class="token punctuation">.</span>Normal<span class="token punctuation">,</span> QtGui<span class="token punctuation">.</span>QIcon<span class="token punctuation">.</span>Off<span class="token punctuation">)</span>                MainWindow<span class="token punctuation">.</span>setWindowIcon<span class="token punctuation">(</span>icon<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>centralwidget <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QWidget<span class="token punctuation">(</span>MainWindow<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>centralwidget<span class="token punctuation">.</span>setObjectName<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"centralwidget"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>gridLayout <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QGridLayout<span class="token punctuation">(</span>self<span class="token punctuation">.</span>centralwidget<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>gridLayout<span class="token punctuation">.</span>setObjectName<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"gridLayout"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>label_3 <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QLabel<span class="token punctuation">(</span>self<span class="token punctuation">.</span>centralwidget<span class="token punctuation">)</span>                font <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QFont<span class="token punctuation">(</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setPointSize<span class="token punctuation">(</span><span class="token number">20</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setBold<span class="token punctuation">(</span><span class="token boolean">True</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setWeight<span class="token punctuation">(</span><span class="token number">75</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>label_3<span class="token punctuation">.</span>setFont<span class="token punctuation">(</span>font<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>label_3<span class="token punctuation">.</span>setObjectName<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"label_3"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>gridLayout<span class="token punctuation">.</span>addWidget<span class="token punctuation">(</span>self<span class="token punctuation">.</span>label_3<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>label <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QLabel<span class="token punctuation">(</span>self<span class="token punctuation">.</span>centralwidget<span class="token punctuation">)</span>                font <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QFont<span class="token punctuation">(</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setPointSize<span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setBold<span class="token punctuation">(</span><span class="token boolean">True</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setWeight<span class="token punctuation">(</span><span class="token number">75</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>label<span class="token punctuation">.</span>setFont<span class="token punctuation">(</span>font<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>label<span class="token punctuation">.</span>setObjectName<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"label"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>gridLayout<span class="token punctuation">.</span>addWidget<span class="token punctuation">(</span>self<span class="token punctuation">.</span>label<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>content_box <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QTextEdit<span class="token punctuation">(</span>self<span class="token punctuation">.</span>centralwidget<span class="token punctuation">)</span>                font <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QFont<span class="token punctuation">(</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setFamily<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"Times New Roman"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setPointSize<span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setBold<span class="token punctuation">(</span><span class="token boolean">False</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setWeight<span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>content_box<span class="token punctuation">.</span>setFont<span class="token punctuation">(</span>font<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>content_box<span class="token punctuation">.</span>setObjectName<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"content_box"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>gridLayout<span class="token punctuation">.</span>addWidget<span class="token punctuation">(</span>self<span class="token punctuation">.</span>content_box<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>calc_button <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QPushButton<span class="token punctuation">(</span>self<span class="token punctuation">.</span>centralwidget<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>calc_button<span class="token punctuation">.</span>setObjectName<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"calc_button"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>gridLayout<span class="token punctuation">.</span>addWidget<span class="token punctuation">(</span>self<span class="token punctuation">.</span>calc_button<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>label_2 <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QLabel<span class="token punctuation">(</span>self<span class="token punctuation">.</span>centralwidget<span class="token punctuation">)</span>                font <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QFont<span class="token punctuation">(</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setPointSize<span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setBold<span class="token punctuation">(</span><span class="token boolean">True</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setWeight<span class="token punctuation">(</span><span class="token number">75</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>label_2<span class="token punctuation">.</span>setFont<span class="token punctuation">(</span>font<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>label_2<span class="token punctuation">.</span>setObjectName<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"label_2"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>gridLayout<span class="token punctuation">.</span>addWidget<span class="token punctuation">(</span>self<span class="token punctuation">.</span>label_2<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>results_window <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QTextEdit<span class="token punctuation">(</span>self<span class="token punctuation">.</span>centralwidget<span class="token punctuation">)</span>                font <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QFont<span class="token punctuation">(</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setFamily<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"Times New Roman"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setPointSize<span class="token punctuation">(</span><span class="token number">14</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setBold<span class="token punctuation">(</span><span class="token boolean">False</span><span class="token punctuation">)</span>                font<span class="token punctuation">.</span>setWeight<span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>results_window<span class="token punctuation">.</span>setFont<span class="token punctuation">(</span>font<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>results_window<span class="token punctuation">.</span>setObjectName<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"results_window"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>gridLayout<span class="token punctuation">.</span>addWidget<span class="token punctuation">(</span>self<span class="token punctuation">.</span>results_window<span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>                MainWindow<span class="token punctuation">.</span>setCentralWidget<span class="token punctuation">(</span>self<span class="token punctuation">.</span>centralwidget<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>menubar <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QMenuBar<span class="token punctuation">(</span>MainWindow<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>menubar<span class="token punctuation">.</span>setGeometry<span class="token punctuation">(</span>QtCore<span class="token punctuation">.</span>QRect<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">700</span><span class="token punctuation">,</span> <span class="token number">23</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                self<span class="token punctuation">.</span>menubar<span class="token punctuation">.</span>setObjectName<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"menubar"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                MainWindow<span class="token punctuation">.</span>setMenuBar<span class="token punctuation">(</span>self<span class="token punctuation">.</span>menubar<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>statusbar <span class="token operator">=</span> QtGui<span class="token punctuation">.</span>QStatusBar<span class="token punctuation">(</span>MainWindow<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>statusbar<span class="token punctuation">.</span>setObjectName<span class="token punctuation">(</span>_fromUtf8<span class="token punctuation">(</span><span class="token string">"statusbar"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>                MainWindow<span class="token punctuation">.</span>setStatusBar<span class="token punctuation">(</span>self<span class="token punctuation">.</span>statusbar<span class="token punctuation">)</span>                self<span class="token punctuation">.</span>retranslateUi<span class="token punctuation">(</span>MainWindow<span class="token punctuation">)</span>                QtCore<span class="token punctuation">.</span>QMetaObject<span class="token punctuation">.</span>connectSlotsByName<span class="token punctuation">(</span>MainWindow<span class="token punctuation">)</span>         <span class="token keyword">def</span> <span class="token function">retranslateUi</span><span class="token punctuation">(</span>self<span class="token punctuation">,</span> MainWindow<span class="token punctuation">)</span><span class="token punctuation">:</span>              MainWindow<span class="token punctuation">.</span>setWindowTitle<span class="token punctuation">(</span>_translate<span class="token punctuation">(</span><span class="token string">"MainWindow"</span><span class="token punctuation">,</span> <span class="token string">"CS Calculator By:Rayu 2016-11-24"</span><span class="token punctuation">,</span> None<span class="token punctuation">)</span><span class="token punctuation">)</span>              self<span class="token punctuation">.</span>label_3<span class="token punctuation">.</span>setText<span class="token punctuation">(</span>_translate<span class="token punctuation">(</span><span class="token string">"MainWindow"</span><span class="token punctuation">,</span> <span class="token string">"CS Calculator"</span><span class="token punctuation">,</span> None<span class="token punctuation">)</span><span class="token punctuation">)</span>              self<span class="token punctuation">.</span>label<span class="token punctuation">.</span>setText<span class="token punctuation">(</span>_translate<span class="token punctuation">(</span><span class="token string">"MainWindow"</span><span class="token punctuation">,</span> <span class="token string">"Text"</span><span class="token punctuation">,</span> None<span class="token punctuation">)</span><span class="token punctuation">)</span>              self<span class="token punctuation">.</span>calc_button<span class="token punctuation">.</span>setText<span class="token punctuation">(</span>_translate<span class="token punctuation">(</span><span class="token string">"MainWindow"</span><span class="token punctuation">,</span> <span class="token string">"Calculate"</span><span class="token punctuation">,</span> None<span class="token punctuation">)</span><span class="token punctuation">)</span>              self<span class="token punctuation">.</span>label_2<span class="token punctuation">.</span>setText<span class="token punctuation">(</span>_translate<span class="token punctuation">(</span><span class="token string">"MainWindow"</span><span class="token punctuation">,</span> <span class="token string">"Result"</span><span class="token punctuation">,</span> None<span class="token punctuation">)</span><span class="token punctuation">)</span>              self<span class="token punctuation">.</span>results_window<span class="token punctuation">.</span>setHtml<span class="token punctuation">(</span>_translate<span class="token punctuation">(</span><span class="token string">"MainWindow"</span><span class="token punctuation">,</span> <span class="token string">"&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"</span>    <span class="token string">"&lt;html>&lt;head>&lt;meta name=\"qrichtext\" content=\"1\" />&lt;style type=\"text/css\">\n"</span>    <span class="token string">"p, li { white-space: pre-wrap; }\n"</span>    <span class="token string">"&lt;/style>&lt;/head>&lt;body style=\" font-family:\'Times New Roman\'; font-size:14pt; font-weight:400; font-style:normal;\">\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\">/******************************************************************&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\">*校验码 将所有相加MOD 256 &lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\">*******************************************************************/&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\">unsigned char Get_csckNum( unsigned char *Ptr, unsigned char Len )&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\">{&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\"> register unsigned char Num;&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\"> &lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\"> Num = 0;&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\"> while( Len > 0 )&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\"> {&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\"> Num += *Ptr;&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\"> printf("</span><span class="token operator">%</span>d<span class="token operator">-</span><span class="token operator">-</span><span class="token operator">%</span>d\\n<span class="token string">",Len,Num);&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\"> Ptr++;&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\"> Len--;&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\"> }&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\"> return Num;&lt;/span>&lt;/p>\n"</span>    <span class="token string">"&lt;p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">&lt;span style=\" font-family:\'SimSun\'; font-size:9pt;\">}&lt;/span>&lt;/p>&lt;/body>&lt;/html>"</span><span class="token punctuation">,</span> None<span class="token punctuation">)</span><span class="token punctuation">)</span></code></pre><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;利用pyqt4编写cs计算工具&lt;/p&gt;
&lt;p&gt;之前用Python做了一个通道号查找的小程序，只不过没有做界面。&lt;/p&gt;
&lt;p&gt;最近的一个项目要用到帧校验（CS），为了方便，写了一个计算的小程序。&lt;/p&gt;
    
    </summary>
    
    
    
      <category term="python" scheme="http://rayuu.com/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>单片机串口通讯RXD与TXD如何对接</title>
    <link href="http://rayuu.com/2016/11/30/mcurs232/"/>
    <id>http://rayuu.com/2016/11/30/mcurs232/</id>
    <published>2016-11-30T13:23:43.000Z</published>
    <updated>2016-11-30T13:31:07.017Z</updated>
    
    <content type="html"><![CDATA[<p> 单片机串口通讯RXD与TXD如何对接</p><blockquote><p>串口直通线和交叉线的区别</p></blockquote><h3 id="1：串口交叉线"><a href="#1：串口交叉线" class="headerlink" title="1：串口交叉线"></a>1：串口交叉线</h3><p>串口线两头都一样都相同。都是公对公或者母对母串口线，这种线必须是交叉线。</p><p>一端的第二针与另一端的第三针是通路的，说明此线是交叉线。<br>以下是判断方法：</p><a id="more"></a><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/10/2108422507.jpg" alt=""></p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/10/2023506305.jpg" alt=""></p><h3 id="2：串口直通线"><a href="#2：串口直通线" class="headerlink" title="2：串口直通线"></a>2：串口直通线</h3><p>如果用户串口设备与串口服务器连接使用公对母串口线，那必须使用公对母直通线。</p><p>一端公头的2对应，另一端母头的2，一端母头的3对应另一端公头的3.</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/10/3271306913.jpg" alt=""></p><h3 id="3：公母头定义："><a href="#3：公母头定义：" class="headerlink" title="3：公母头定义："></a>3：公母头定义：</h3><p>公头：</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/10/4086203997.png" alt=""></p><p>母头：</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/10/2966605950.jpg" alt=""></p><h3 id="4："><a href="#4：" class="headerlink" title="4："></a>4：</h3><p>使用WiFi网络串口服务器，或者DTU，我们配套的串口线都是标配的，如果我们的串口服务器的公头的，那我们配套的串口线应该是母对母的交叉线，如果客户的设备的公头，可以直接用我们配套的线，前提是客户的串口母头符合标准母头串口定义。如果客户买的我们的串口服务器是母头，那我们配套的串口线应该是公对母的直通线，如果客户的设备是公头，那使用我们的公对母的直通线应该是可以通信的。前提是客户的公头串口是标准的串口，符合公头串口引脚定义。</p><p>摘自：<a href="http://www.usr.cn/Faq/117.html" target="_blank" rel="noopener">http://www.usr.cn/Faq/117.html</a></p><p>对接方法</p><p>相信很多人都对单片机与计算机或者芯片通信时，RXD与TXD如何连接比较困惑。因为在一些电路图中，有的是直连接法，有的是交叉接法，让人有点摸不着头脑。</p><p>首先需要明白两个概念，就是DTE和DCE。DTE是指数据终端设备，典型的DTE就是计算机和单片机。DCE是指数据通信设备，典型的DCE就是MODEM。RS232串口标准中的RXD和TXD都是站在DTE立场上的，而不是DCE。明白了这一点，再讲下面的接线方法，就很好理解了。</p><p>单片机与计算机进行串口通信时，单片机的RXD接计算机的TXD，单片机的TXD接计算机的RXD。</p><blockquote><p>（1）使用串口直通线。设计电路时，单片机的RXD连接电路板DB9的TXD，单片机的TXD连接电路板DB9的RXD，具体实现可在232电平转换芯片处反接。</p></blockquote><blockquote><p>（2）使用串口交叉线。设计电路时，因为串口线已做交叉，单片机的RXD连接电路板DB9的RXD，单片机的TXD连接电路板DB9的TXD，均直连即可。</p></blockquote><p>这就可以解释为什么有的电路中使用直连接法，有的电路中使用交叉接法，就是因为使用的串口线不同。</p><p>单片机与串口设备（如GPRS模块、载波芯片等）通信时，一律将RXD与TXD反接，即单片机的RXD接设备的TXD，单片机的TXD接设备的RXD。</p><p>摘自： <a href="http://blog.csdn.net/sdwuyulunbi/article/details/6632382" target="_blank" rel="noopener">http://blog.csdn.net/sdwuyulunbi/article/details/6632382</a></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt; 单片机串口通讯RXD与TXD如何对接&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;串口直通线和交叉线的区别&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;1：串口交叉线&quot;&gt;&lt;a href=&quot;#1：串口交叉线&quot; class=&quot;headerlink&quot; title=&quot;1：串口交叉线&quot;&gt;&lt;/a&gt;1：串口交叉线&lt;/h3&gt;&lt;p&gt;串口线两头都一样都相同。都是公对公或者母对母串口线，这种线必须是交叉线。&lt;/p&gt;
&lt;p&gt;一端的第二针与另一端的第三针是通路的，说明此线是交叉线。&lt;br&gt;以下是判断方法：&lt;/p&gt;
    
    </summary>
    
    
    
      <category term="单片机" scheme="http://rayuu.com/tags/%E5%8D%95%E7%89%87%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>ubuntu 16.04下安装arm-linux-gcc</title>
    <link href="http://rayuu.com/2016/11/30/linuxarmgcc/"/>
    <id>http://rayuu.com/2016/11/30/linuxarmgcc/</id>
    <published>2016-11-30T13:20:00.000Z</published>
    <updated>2016-11-30T13:31:06.165Z</updated>
    
    <content type="html"><![CDATA[<p> ubuntu 16.04下安装arm-linux-gcc</p><p>最近在玩<code>micropython</code>，下载了<code>micropython</code>的源码后想进行编译玩一玩。</p><p><a href="https://github.com/micropython/micropython" target="_blank" rel="noopener">https://github.com/micropython/micropython</a></p><p>查看<code>readme.md</code>发现编译stm32的固件需要安装<code>arm-linux-gcc</code>等<code>gnu arm toolchain</code>交叉编译工具.</p><p>说干就干，还好电脑装了双系统，打开<code>ubuntu16.04</code>。</p><p>开始安装。</p><a id="more"></a><h3 id="1）、进入这个网站下载源码"><a href="#1）、进入这个网站下载源码" class="headerlink" title="1）、进入这个网站下载源码"></a>1）、进入这个网站下载源码</h3><p><a href="https://launchpad.net/gcc-arm-embedded" target="_blank" rel="noopener">https://launchpad.net/gcc-arm-embedded</a></p><p>右面有对应的版本下载，</p><p>下载完成后就是安装，查看readme.txt。</p><p>但是我的网速用浏览器下载太慢了。所以，我准备用apt-get 来安装。</p><p><a href="https://launchpadlibrarian.net/287100883/readme.txt" target="_blank" rel="noopener">https://launchpadlibrarian.net/287100883/readme.txt</a></p><h3 id="2）、apt-get-安装gcc-arm-embedded"><a href="#2）、apt-get-安装gcc-arm-embedded" class="headerlink" title="2）、apt-get 安装gcc-arm-embedded"></a>2）、apt-get 安装gcc-arm-embedded</h3><p>参考这篇文章 <a href="http://jingpin.jikexueyuan.com/article/56406.html" target="_blank" rel="noopener">http://jingpin.jikexueyuan.com/article/56406.html</a></p><pre><code>sudo add-apt-repository ppa:terry.guo/gcc-arm-embeddedsudo apt-get updatesudo apt-get install gcc-arm-none-eabi</code></pre><p>这样就安装好了，工具链路径在/usr/bin/目录下，具体可以用 ls | grep arm查看；</p><p>然后搞个链接，像这样</p><pre><code>cd /usr/binsudo ln arm-none-eabi-gcc arm-linux-gccsudo ln arm-none-eabi-ar  arm-linux-ar.....</code></pre><p>最后就安装完成了这个编译工具。</p><h3 id="3）、开始编译micropython"><a href="#3）、开始编译micropython" class="headerlink" title="3）、开始编译micropython"></a>3）、开始编译micropython</h3><pre><code>git clone https://github.com/micropython/micropython.gitcd stmhal/make</code></pre><p>还以为要编译好久，结果一会儿就编译完了。</p><p>在<code>stmhal/build-PYBV10</code>目录下的<code>firmware.hex</code> 和<code>firmware.dfu</code>的就是编译出来的固件咯！</p><p>接下来继续研究源码！！！</p><p><img src="http://p1.bqimg.com/567571/aedc56efbecc1527.png" alt=""></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt; ubuntu 16.04下安装arm-linux-gcc&lt;/p&gt;
&lt;p&gt;最近在玩&lt;code&gt;micropython&lt;/code&gt;，下载了&lt;code&gt;micropython&lt;/code&gt;的源码后想进行编译玩一玩。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/micropython/micropython&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/micropython/micropython&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;查看&lt;code&gt;readme.md&lt;/code&gt;发现编译stm32的固件需要安装&lt;code&gt;arm-linux-gcc&lt;/code&gt;等&lt;code&gt;gnu arm toolchain&lt;/code&gt;交叉编译工具.&lt;/p&gt;
&lt;p&gt;说干就干，还好电脑装了双系统，打开&lt;code&gt;ubuntu16.04&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;开始安装。&lt;/p&gt;
    
    </summary>
    
    
    
      <category term="linux" scheme="http://rayuu.com/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>C++使用sqlite3进行简单的课表管理</title>
    <link href="http://rayuu.com/2016/11/30/cppsqlite3sche/"/>
    <id>http://rayuu.com/2016/11/30/cppsqlite3sche/</id>
    <published>2016-11-30T13:12:46.000Z</published>
    <updated>2016-11-30T13:31:05.212Z</updated>
    
    <content type="html"><![CDATA[<p> C++使用sqlite3进行简单的课表管理</p><h2 id="一、生成sqlite3-lib"><a href="#一、生成sqlite3-lib" class="headerlink" title="一、生成sqlite3.lib"></a>一、生成sqlite3.lib</h2><p>1.在sqlite官网 <a href="http://www.sqlite.org/download.html" target="_blank" rel="noopener">http://www.sqlite.org/download.html</a> 上下载<code>sqlite-amalgamation-3071000.zip</code> 和<code>sqlite-dll-win32-x86-3071000.zip</code>。</p><p>2.分别解压上述两个文件到各自文件夹下（<code>sqlite3.def、sqlite3.dll</code>在同一文件夹<code>sqlite-dll</code>下）。</p><a id="more"></a><p>3.从VS2010的安装目录下<code>Microsoft Visual Studio 10.0\VC\bin</code>找到<code>lib.exe</code>和<code>link.exe</code>，从VS2010的安装目录下<code>\Microsoft Visual Studio 10.0\Common7\IDE</code>找到<code>mspdb100.dll</code>。将<code>lib.exe`` link.exe ``mspdb100.dll</code>放到步骤2中的<code>sqlite-dll</code>文件夹下。</p><p>4.打开cmd窗口，转到上述sqlite-dll文件夹下，在Windows右键添加cmd菜单可以快速到达，详见<a href="http://blog.rayuu.com/cmdhere.html" target="_blank" rel="noopener">http://blog.rayuu.com/cmdhere.html</a></p><p>5.输入命令：</p><pre><code>LIB /DEF:sqlite3.def /machine:ix86</code></pre><p>这时，在sqlite-dll文件夹下会出现sqlite3.lib。</p><h2 id="二、VS2010静态编译生成exe文件"><a href="#二、VS2010静态编译生成exe文件" class="headerlink" title="二、VS2010静态编译生成exe文件"></a>二、VS2010静态编译生成exe文件</h2><p>VS2010静态编译生成的.exe可执行文件，可以免安装在其他电脑直接运行</p><p>静态编译：就是在编译可执行文件的时候，将可执行文件需要调用的对应动态链接库（.so）中的部分提取出来，链接到可执行文件中去，使可执行文件在运行的时候不依赖动态链接库。</p><p>编译方式：</p><blockquote><p>第1种：</p></blockquote><p>设置：</p><p>1、项目-&gt;配置属性-&gt;常规-&gt;MFC的使用：在静态库中使用MFC</p><p>2、项目 -&gt; 配置属性-&gt;C/C++-&gt;代码生成-&gt;运行库 :选择 多线程调试（/MTd）。</p><p>编译时，选择的是debug，win32</p><p>然后执行编译生成方案，在该工程目录下的debug文件中，找到该.exe文件，即可在其他电脑运行。</p><blockquote><p>第2种：</p></blockquote><p>一般可以配置一下两项：</p><p>1.项目 -&gt; 配置属性-&gt;常规-&gt;MFC的使用 :在静态库中使用MFC。</p><p>2.项目 -&gt; 配置属性-&gt;C/C++-&gt;代码生成-&gt;运行库 :选择 多线程调试（/MT）。</p><p>编译时，选择的是release，win32（这个选择项在工具栏的debug选框中，一般我们使用debug方式）</p><p>debug方式产生的文件会比较大，听说它包含了一些调试用的信息，release方式生成的只是该软件所需要的所有功能而已（这个我也不懂，反正大小差不多2:1）。</p><h2 id="三、课表程序编写"><a href="#三、课表程序编写" class="headerlink" title="三、课表程序编写"></a>三、课表程序编写</h2><pre><code>#include&lt;iostream&gt;#include&lt;sstream&gt;#include"lib/sqlite3.h"#include&lt;string&gt;using namespace std;//定义课表结构struct content{    string context;};/**********************************        数据库操作***********************************/bool Connect();//连接数据库并创建表bool Select(int day);//查询单条记录bool Delete(int day);//删除单条记录bool SelectAll();//查询全部bool DeleteAll();//删除全部bool Add(int day,const string&amp; no1,const string&amp; no2,const string&amp; no3,const string&amp; no4,const string&amp; no5);//添加单条记录int AddDay(content *p);//添加某一天记录bool exist_in_db(int pathstr);//判断要添加的数据是否存在/**********************************        其他操作***********************************/string IntToString (int a);//数字转字符void Menu();//菜单void show(content *m);//显示输入的课表内容void Find();//查找void DelDay();//删除某一天的数据//SQLITE_OK 是零sqlite3 *db=NULL;// 回调sqlstatic int callback(void *NotUsed, int argc, char **argv, char **azColName){   int i;   for(i=0; i&lt;argc; i++){      printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");   }   printf("\n");   return 0;}static int feedback(void *NotUsed, int argc, char **argv, char **azColName){   int i;   cout&lt;&lt;"星期 "&lt;&lt;argv[1]&lt;&lt;" 的课表为：\n";   for(i=2; i&lt;argc; i++){      cout&lt;&lt;"第 "&lt;&lt;i-1&lt;&lt;" 节课： ";      printf("%s\n", argv[i] ? argv[i] : "NULL");   }   printf("\n");   return 0;}int main(){    int SetDay;//星期    int MenuChoice;//菜单选择    char *errmsg = 0;    content *p = new content[5];    Connect();    Menu();    while(cin&gt;&gt;MenuChoice)    {        cin.sync();        cin.clear();        switch(MenuChoice)        {        case 1:{                SetDay = AddDay(p);                show(p);                Add(SetDay,p[0].context,p[1].context,p[2].context,p[3].context,p[4].context);               }break;        case 2:{Find();}break;        case 3:{DelDay();}break;        case 0:{exit(0);}break;        default :Menu();break;        }        cout &lt;&lt; "按回车键返回主菜单......";        cin.get();        system("cls");        Menu();    }    sqlite3_close(db);    system("pause");    return 0;}//connect &amp; create tablebool Connect(){    int con;    con = sqlite3_open("schedule.db",&amp;db);    if(con)    {        fprintf(stderr, "Can't open database: %s\n",sqlite3_errmsg(db));        exit(0);    }    else    {        fprintf(stdout,"连接数据库成功\n");    }    char *sql;    char * errmsg=0;    // 新建表 schedule    sql = "CREATE TABLE IF NOT EXISTS schedule("\        "ID INTEGER PRIMARY KEY AUTOINCREMENT,"\        "WEEKLY            INT     NOT NULL,"\        "NO1            TEXT    NOT NULL,"\        "NO2            TEXT    NOT NULL,"\        "NO3            TEXT    NOT NULL,"\        "NO4            TEXT    NOT NULL,"\        "NO5            TEXT    NOT NULL"\        ");";    con = sqlite3_exec(db,sql,callback, 0, &amp;errmsg);    if(con != SQLITE_OK)    {        cout &lt;&lt; "add fail: "&lt;&lt;errmsg&lt;&lt;endl;        return false;    }    return true;}//添加bool Add(int day,const string&amp; no1,const string&amp; no2,const string&amp; no3,const string&amp; no4,const string&amp; no5){    char *errmsg=0;    int res=1;    int  week;    week = day;    string strsql = "";    strsql += "insert into schedule(WEEKLY,NO1,NO2,NO3,NO4,NO5)";    strsql += " values(";    strsql += "'";    strsql += IntToString(day);    strsql += "','";    strsql += no1;    strsql += "','";    strsql += no2;    strsql += "','";    strsql += no3;    strsql += "','";    strsql += no4;    strsql += "','";    strsql += no5;    strsql += "');";    //启动一个事务处理    //cout &lt;&lt;strsql&lt;&lt;endl;    if(!exist_in_db(week))    {        res = sqlite3_exec(db,strsql.c_str(),0,0, &amp;errmsg);             }    else    {        return false;    }    if(res != SQLITE_OK)    {        cout &lt;&lt; "add fail: "&lt;&lt;errmsg&lt;&lt;endl;        return false;    }    else    {        cout &lt;&lt; "add success"&lt;&lt;endl;    }    return true;}//查找某一天的课表bool Select(int day){    stringstream strsql;    char *errmsg = 0;    //启动一个事务处理    int res;     strsql &lt;&lt; "SELECT * FROM schedule WHERE WEEKLY=";    strsql &lt;&lt; day;    string str = strsql.str();    res=sqlite3_exec(db,str.c_str(),feedback, 0, &amp;errmsg);    if(res!=SQLITE_OK)    {        cout &lt;&lt; "查找失败"&lt;&lt;endl;        return false;    }    return true;}// 查找全部bool SelectAll(){    stringstream strsql;    char *errmsg = 0;    //启动一个事务处理    int res;      strsql &lt;&lt; "SELECT * FROM schedule";    string str = strsql.str();    res=sqlite3_exec(db,str.c_str(),feedback, 0, &amp;errmsg);    if(res!=SQLITE_OK)    {        cout &lt;&lt; "查找失败"&lt;&lt;endl;        return false;    }    return true;}// 删除bool Delete(int day){    stringstream strsql;    char *errmsg = 0;    //启动一个事务处理    int res;     strsql &lt;&lt; "DELETE FROM schedule WHERE WEEKLY=";    strsql &lt;&lt; day;    string str = strsql.str();    res=sqlite3_exec(db,str.c_str(),feedback, 0, &amp;errmsg);    if(res!=SQLITE_OK)    {        cout &lt;&lt; "删除失败"&lt;&lt;endl;        return false;    }    return true;}// 删除全部bool DeleteAll(){    stringstream strsql;    char *errmsg = 0;    //启动一个事务处理    int res;      strsql &lt;&lt; "DELETE FROM schedule";    string str = strsql.str();    res=sqlite3_exec(db,str.c_str(),feedback, 0, &amp;errmsg);    if(res!=SQLITE_OK)    {        cout &lt;&lt; "删除全部失败"&lt;&lt;endl;        return false;    }    return true;}//判断星期是否存在bool exist_in_db(int pathstr){    char sql_query[128]={0};    sprintf(sql_query,"select count(*) from schedule where WEEKLY='%d'",pathstr);//    sprintf(sql_query,"select count(*) from schedule where ID='%d'",day);    //cout &lt;&lt; sql_query&lt;&lt;endl;    sqlite3_stmt *pstmt;    sqlite3_prepare(db, sql_query, strlen(sql_query), &amp;pstmt, NULL);    sqlite3_step(pstmt);    int count=sqlite3_column_int(pstmt,0);    sqlite3_finalize(pstmt);    //cout &lt;&lt; count&lt;&lt;endl;    if(count &gt; 0)    {        cout&lt;&lt;"星期 "&lt;&lt;pathstr&lt;&lt;" 的课表已添加，\n请删除后重新添加."&lt;&lt;endl;        return true;    }    return false;}// 输入课表int AddDay(content *p){    int day;    cout &lt;&lt;"请输入星期数： "&lt;&lt;endl;    cin &gt;&gt; day;    cin.get();    int i=0;    for(i=0;i&lt;5;i++)    {        cin.clear();        cin.sync();        cout &lt;&lt; "第 "&lt;&lt;i+1&lt;&lt;" 节课"&lt;&lt;endl;        getline(cin,p[i].context);    }    return day;}// 删除void DelDay(){    int day;    cout &lt;&lt;"Please enter the day(1~7)"&lt;&lt;endl;    cin&gt;&gt;day;    //while(cin&gt;&gt;day)    {        cin.sync();        cin.clear();        switch(day)        {        case 1:Delete(day);break;        case 2:Delete(day);break;        case 3:Delete(day);break;        case 4:Delete(day);break;        case 5:Delete(day);break;        case 6:Delete(day);break;        case 7:Delete(day);break;        default:DeleteAll();break;        }    }    if(!cin)    {        cout &lt;&lt; "请输入数字......"&lt;&lt;endl;    }}// 显示输入的内容void show(content *m){    cout &lt;&lt;"你输入的内容是："&lt;&lt;endl;    int i=0;    for(i=0;i&lt;5;i++)    {        cout &lt;&lt; "第 "&lt;&lt;i+1&lt;&lt;" 节课 "&lt;&lt; m[i].context &lt;&lt; endl;    }    cout &lt;&lt; endl;}// 菜单void Menu(){    cout&lt;&lt;"+++++++++++++++++++++++++++++++++++++++++\n";    cout&lt;&lt;"+               课    表                +\n";    cout&lt;&lt;"+                V1.0                   +\n";    cout&lt;&lt;"+               by:Rayu                 +\n";    cout&lt;&lt;"+             2016.10.18                +\n";    cout&lt;&lt;"+++++++++++++++++++++++++++++++++++++++++\n";    cout&lt;&lt;"\n";    cout&lt;&lt;"【1】添加课表\t";    cout&lt;&lt;"【2】查询课表\n";    cout&lt;&lt;"【3】删除课表\t";    cout&lt;&lt;"【0】退出系统\n";    cout&lt;&lt;"输入对应的数字进入菜单： \n";}void Find(){    int day;    cout &lt;&lt;"Please enter the day(1~7)"&lt;&lt;endl;    cin&gt;&gt;day;    //while(cin&gt;&gt;day)    {        cin.sync();        cin.clear();        switch(day)        {        case 1:Select(day);break;        case 2:Select(day);break;        case 3:Select(day);break;        case 4:Select(day);break;        case 5:Select(day);break;        case 6:Select(day);break;        case 7:Select(day);break;        default:SelectAll();break;        }    }    if(!cin)    {        cout &lt;&lt; "请输入数字......"&lt;&lt;endl;    }}// int to stringstring IntToString (int a){    ostringstream temp;    temp&lt;&lt;a;    return temp.str();}</code></pre><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt; C++使用sqlite3进行简单的课表管理&lt;/p&gt;
&lt;h2 id=&quot;一、生成sqlite3-lib&quot;&gt;&lt;a href=&quot;#一、生成sqlite3-lib&quot; class=&quot;headerlink&quot; title=&quot;一、生成sqlite3.lib&quot;&gt;&lt;/a&gt;一、生成sqlite3.lib&lt;/h2&gt;&lt;p&gt;1.在sqlite官网 &lt;a href=&quot;http://www.sqlite.org/download.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.sqlite.org/download.html&lt;/a&gt; 上下载&lt;code&gt;sqlite-amalgamation-3071000.zip&lt;/code&gt; 和&lt;code&gt;sqlite-dll-win32-x86-3071000.zip&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;2.分别解压上述两个文件到各自文件夹下（&lt;code&gt;sqlite3.def、sqlite3.dll&lt;/code&gt;在同一文件夹&lt;code&gt;sqlite-dll&lt;/code&gt;下）。&lt;/p&gt;
    
    </summary>
    
    
    
      <category term="c/c++" scheme="http://rayuu.com/tags/c-c/"/>
    
  </entry>
  
  <entry>
    <title>pyinstaller和py2exe生成exe文件并添加版本信息和自定义图标</title>
    <link href="http://rayuu.com/2016/09/29/pyinstaller-py2exe-exe/"/>
    <id>http://rayuu.com/2016/09/29/pyinstaller-py2exe-exe/</id>
    <published>2016-09-29T12:45:42.000Z</published>
    <updated>2016-09-29T13:04:56.039Z</updated>
    
    <content type="html"><![CDATA[<h1 id="pyinstaller和py2exe把Python脚本生成exe文件，"><a href="#pyinstaller和py2exe把Python脚本生成exe文件，" class="headerlink" title="pyinstaller和py2exe把Python脚本生成exe文件，"></a>pyinstaller和py2exe把Python脚本生成exe文件，</h1><h1 id="并添加版本信息和自定义图标。"><a href="#并添加版本信息和自定义图标。" class="headerlink" title="并添加版本信息和自定义图标。"></a>并添加版本信息和自定义图标。</h1><p>写了一个查找产品通道号的小程序，目前还没进行异常处理。<br>以下是程序源码。</p><p>另外一个地址<br><a href="http://blog.rayuu.com/pyinstaller_py2exe_exe.html" target="_blank" rel="noopener" title="http://blog.rayuu.com/pyinstaller_py2exe_exe.html">http://blog.rayuu.com/pyinstaller_py2exe_exe.html</a></p><a id="more"></a><pre><code>    # -*- coding:UTF-8 -*-    import serial    import time    # import argparse    import serial.tools.list_ports    from time import sleep    # 串口    class Serial(object):        def __init__(self):            print u"+++++++++++++++++++++++++++++++++++++++++"            print u"+            通道号查找程序             +"            print u"+                V1.0                   +"            print u"+               by:Rayu                 +"            print u"+             2016.09.27                +"            print u"+++++++++++++++++++++++++++++++++++++++++"        # 查找串口        def serial_find(self):            plist = list(serial.tools.list_ports.comports())            if len(plist) &lt;= 0:                print u"串口未发现！"            else:                print u"找到的串口如下:"                for i in range(0, len(plist)):                    print [i+1], plist[i]            print u"请输入对应的数字选择你想要使用的串口：&lt;默认为1&gt;"            number = raw_input()            if not number:                number = 1            number = int(number)            while number &gt; len(plist):                print u"串口未找到，请重新输入。"                print u"请输入对应的数字选择你想要使用的串口："                number = raw_input()                number = int(number)            if number &lt;= len(plist):                uart_choose = plist[number-1][0]            return uart_choose        # 串口波特率        def serial_baudrate(self):            print u"请输入串口波特率：&lt;默认115200&gt;"            baudrate = raw_input()            if not baudrate:                baudrate = 115200            baudrate = int(baudrate)            return baudrate        # 获取设备地址        def input_dev_addr(self):            print u'请输入设备地址：&lt;如：dc00000233&gt;'            data_dev = raw_input()            # print data_dev, type(data_dev)            return data_dev        # 打开串口        def serial_open(self, com, baud):            try:                ser = serial.Serial(com, baud, timeout=0.1)            except Exception, e:                print u"打开串口失败，请检查串口是否被占用。\n5秒后自动退出程序"                time.sleep(5)                exit(1)            print u"串口", com, u"打开成功......波特率为：", baud            sleep(0.5)            return ser        # 更改通道号        def serial_send_channel(self, com, baud, dev, sta):            #             data_comm = "AB"            data_sum = "01"            # 通道号修改            ser = self.serial_open(com, baud)            start = time.clock()            for data_channel in range(0, 256):                # 转换为十六进制字符串                dev_channel = hex(data_channel)                # 把0x删掉                dev_channel = dev_channel[2:4]                if len(dev_channel) == 1:                    dev_channel = '0' + dev_channel                # 连接字符串                content_addr = data_comm+dev_channel+data_sum                # print content_addr,"content_addr",type(content_addr)                # 十六进制发送                content_addr = content_addr.decode("hex")                # print content_addr                # print u"开始发送数据..."                ser.write(content_addr)                lowerpower = int(sta)                # sta = self.serial_send_order(ser,DEV)                re_str = []                cou = 0                find_time = data_channel + 1                print u"进行第 %s" % find_time, u"次查找....."                i = 1                while i &lt;= 10:                    i += 1                    for c in ser.read():                        # re_str += c                        re_str.append(c)                        cou += 1                        if cou == 10:                            # print re_str,"re_str"                            re_str = []                            break                content_order = self.serial_send_order(dev)                if lowerpower == 1:                    print u"低功耗设备，6秒发一次"                    ser.write(content_order)                    time.sleep(6)                else:                    # time.sleep(0)                    ser.write(content_order)                line = []                cnt = 0                j = 1                while j &lt;= 10:                    j += 1                    for d in ser.read():                        line.append(d)                        cnt += 1                        if cnt == 10:                            # print "line",line                            # line = []                            # print data_channel                            print u"查找结束......"                            end = time.clock()                            print u"用时: %f s" % (end-start)                            line[8] = ord(line[8])                            # print ord(line[8])                            ser.close()                            return line[8]            end = time.clock()            print u"用时: %f s" % (end - start)            print u"未找到通道号，请确定设备地址和工装是否正常......"            ser.close()            return -1        # 发送通信命令        def serial_send_order(self, dev):            # 发送通信测试命令            data_head = "F01"            data_dev = dev            data_tail = "E3"            # print data_dev            data_addr = data_head + data_dev + data_tail            # data_addr = "F0"            data_addr = data_addr.decode("hex")            return data_addr    if __name__ == '__main__':        comm = Serial()        # 获取COM口        COMM = comm.serial_find()        # print COMM        BAUD = comm.serial_baudrate()        while True:            DEV = comm.input_dev_addr()            if DEV == 'q':                exit()            print u"低功耗设备请输入1,否则请直接按回车......\n输入q结束程序......"            sta = raw_input()            if not sta:                sta = 0            channel = comm.serial_send_channel(COMM, BAUD, DEV, sta)            if channel == -1:                print u"查找失败......请重新尝试......"            else:                channel = hex(channel)                print u"通道号为: ", channel            # comm.serial_send_order(DEV)            # print BAUD            # comm.serial_open(COMM, BAUD)            # parser = argparse.ArgumentParser(description="通道号查找程序")            # parser.add_argument('--port', action='store', dest='port', type=int, required=True)            # given_args = parser.parse_args()            # port = given_args.port</code></pre><h2 id="程序编写完成后，生成exe可执行文件。"><a href="#程序编写完成后，生成exe可执行文件。" class="headerlink" title="程序编写完成后，生成exe可执行文件。"></a>程序编写完成后，生成exe可执行文件。</h2><h3 id="首先利用py2exe进行转换。"><a href="#首先利用py2exe进行转换。" class="headerlink" title="首先利用py2exe进行转换。"></a>首先利用py2exe进行转换。</h3><blockquote><p>1).新建setup.py</p></blockquote><pre><code>    # -*- coding: utf-8 -*-    __author__ = 'Rayu'    from distutils.core import setup    import py2exe    includes = ["encodings", "encodings.*"]    options = {"py2exe": {"compressed": 1, "optimize": 2, "includes": includes, "bundle_files": 1}}    setup(    version = "0.1.0",    description = u"[利用工装查找设备通道号]",    name = "FindChannel",    options = options,    zipfile = None,    # 生成有指定图标的exe    console = [{"script": "main.py",                "icon_resources": [(1, u"833.ico")]               }]    # 生成无图标exe    # windows = [{"script": "[源码文件名].py"}]    )    # from distutils.core import setup    # import py2exe    #    # setup(console=['main.py'])</code></pre><p>然后运行程序  <code>python setup.py py2exe</code></p><p>在64位系统下运行会报错： <code>bundle_files:1</code> 在64位操作系统下无效。 这句话的意思就是生成单文件程序。</p><p>所以64位操作系统下想生成单文件程序的可以改用<code>pyinstaller</code>.</p><blockquote><p>2).利用<code>pip install PyInstaller</code>  或者去官网下载安装包。</p></blockquote><p>我安装的<code>PyInstaller3.2</code>版本。</p><p>安装完成后，在命令窗口下执行：</p><pre><code>pyinstaller main.py</code></pre><p>会在当前文件夹的<code>dist</code>目录下生成<code>main</code>文件夹，里面的<code>main.exe</code>就是生成的可执行文件。</p><p>把<code>main</code>文件夹整个复制出来就可以在其他地方运行了。</p><p>如果想为程序添加自定义图标和版本信息，那么在<code>main.py</code>的目录下，会有一个<code>main.spec</code>文件，使用<code>notepad++</code>打开进行编辑。</p><pre><code>    # -*- mode: python -*-    block_cipher = None    a = Analysis(['main.py'],                 pathex=['C:\\Users\\jx007\\Desktop\\commserial'],                 binaries=None,                 datas=None,                 hiddenimports=[],                 hookspath=[],                 runtime_hooks=[],                 excludes=[],                 win_no_prefer_redirects=False,                 win_private_assemblies=False,                 cipher=block_cipher)    pyz = PYZ(a.pure, a.zipped_data,                 cipher=block_cipher)    exe = EXE(pyz,              a.scripts,              a.binaries,              a.zipfiles,              a.datas,              name='FindChannel',              version='version.txt',              debug=False,              strip=False,              upx=True,              console=True , icon='833.ico')</code></pre><p>在<code>a.datas</code>, 下面添加</p><pre><code>      version='version.txt',      icon='833.ico',</code></pre><p>然后保存。</p><p>先不要执行，然后把你心仪的<code>ico</code>图标放到和<code>main.py</code>同一目录下，<code>version</code>是版本信息路径。</p><p>名称为<code>version.txt</code></p><p>这时候我们需要编写<code>version.txt</code></p><p>下面是一个例子：</p><pre><code>    # UTF-8    #    VSVersionInfo(      ffi=FixedFileInfo(        # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)        # Set not needed items to zero 0.        filevers=(6, 1, 7600, 16385),        prodvers=(6, 1, 7600, 16385),        # Contains a bitmask that specifies the valid bits 'flags'r        mask=0x3f,        # Contains a bitmask that specifies the Boolean attributes of the file.        flags=0x0,        # The operating system for which this file was designed.        # 0x4 - NT and there is no need to change it.        OS=0x40004,        # The general type of file.        # 0x1 - the file is an application.        fileType=0x1,        # The function of the file.        # 0x0 - the function is not defined for this fileType        subtype=0x0,        # Creation date and time stamp.        date=(0, 0)        ),      kids=[        StringFileInfo(          [          StringTable(            u'040904B0',            [StringStruct(u'CompanyName', u'Microsoft Corporation'),            StringStruct(u'FileDescription', u'Windows Command Processor'),            StringStruct(u'FileVersion', u'6.1.7600.16385 (win7_rtm.090713-1255)'),            StringStruct(u'InternalName', u'cmd'),            StringStruct(u'LegalCopyright', u'© Microsoft Corporation. All rights reserved.'),            StringStruct(u'OriginalFilename', u'Cmd.Exe'),            StringStruct(u'ProductName', u'Microsoft® Windows® Operating System'),            StringStruct(u'ProductVersion', u'6.1.7600.16385')])          ]),         VarFileInfo([VarStruct(u'Translation', [1033, 1200])])      ]    )</code></pre><p>如果你想要自己找这个文件的话，可以参考<code>pyinstaller3</code>的文档，里面写的很详细。</p><p>下面简单介绍一下如何获取这个文件。</p><p>首先在文档里面写到了，利用 <code>pyi-grab_version executable_with_version_resource</code> 这个命令来获取命令的版本信息。</p><p>我们运行 <code>pyi-grab_version c:/windows/system32/cmd.exe</code></p><p>然后会把一个<code>file_version_info.txt</code>记事本文件保存在你cmd命令运行时候的路径下面。<br>找到并打开它，就是上面所列出的内容了。<br>然后根据自己的需要进行修改就可以了。<br>最后在<code>main.py</code>的路径下执行</p><pre><code>pyinstaller main.spec</code></pre><p>在<code>dist</code>文件夹下就产生了一个<code>exe</code>文件，图标也是我们想要的那个图标了，至于程序的详细信息可以通过右键查看详细信息进行查看了。</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/09/1746137199.jpg" alt="详细信息"></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;pyinstaller和py2exe把Python脚本生成exe文件，&quot;&gt;&lt;a href=&quot;#pyinstaller和py2exe把Python脚本生成exe文件，&quot; class=&quot;headerlink&quot; title=&quot;pyinstaller和py2exe把Python脚本生成exe文件，&quot;&gt;&lt;/a&gt;pyinstaller和py2exe把Python脚本生成exe文件，&lt;/h1&gt;&lt;h1 id=&quot;并添加版本信息和自定义图标。&quot;&gt;&lt;a href=&quot;#并添加版本信息和自定义图标。&quot; class=&quot;headerlink&quot; title=&quot;并添加版本信息和自定义图标。&quot;&gt;&lt;/a&gt;并添加版本信息和自定义图标。&lt;/h1&gt;&lt;p&gt;写了一个查找产品通道号的小程序，目前还没进行异常处理。&lt;br&gt;以下是程序源码。&lt;/p&gt;
&lt;p&gt;另外一个地址&lt;br&gt;&lt;a href=&quot;http://blog.rayuu.com/pyinstaller_py2exe_exe.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;http://blog.rayuu.com/pyinstaller_py2exe_exe.html&quot;&gt;http://blog.rayuu.com/pyinstaller_py2exe_exe.html&lt;/a&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="python" scheme="http://rayuu.com/categories/python/"/>
    
    
      <category term="python" scheme="http://rayuu.com/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>瑞萨单片机系统低功耗的设计</title>
    <link href="http://rayuu.com/2016/08/13/microcontrollerslowpower/"/>
    <id>http://rayuu.com/2016/08/13/microcontrollerslowpower/</id>
    <published>2016-08-13T14:57:16.000Z</published>
    <updated>2016-08-13T15:17:05.282Z</updated>
    
    <content type="html"><![CDATA[<p>经过一周多的单片机设计，功能基本完成。但是发现运行功耗非常大，电流在5mA左右，无线发射和接收时更是高达15mA。</p><p>这和要求的功耗设计都不在一个数量级，要求的功耗是在微安级别的。所以需要一个方法降低系统的功耗。</p><a id="more"></a><p>单片机系统的功耗是由MCU和其他外围电路的功耗共同决定。所以首先要对单片机系统的工作特点非常熟悉。<br>查阅手册发现，现在用的瑞萨单片机，有STOP,HALT,SNOOZE三种模式可以降低功耗。</p><p>以下是用户手册的说明</p><blockquote><p>(1) HALT 模式</p></blockquote><p>通过执行 HALT 指令进入 HALT 模式。 HALT 模式是停止 CPU 运行时钟的模式。在设定 HALT 模式前，如果高速系统时钟振荡电路、高速内部振荡器或者副系统时钟振荡电路正在振荡，各时钟就继续振荡。虽然此模式无法让工作电流降到 STOP 模式的程度，但是在想要通过中断请求立即重新开始处理或者想要频繁地进行间歇运行时是一种有效的模式。</p><blockquote><p>(2) STOP 模式</p></blockquote><p>通过执行 STOP 指令进入 STOP 模式。 STOP 模式是停止高速系统时钟振荡电路和高速内部振荡器的振荡并且停止整个系统的模式。能大幅度地降低 CPU 的工作电流。<br>因为 STOP 模式能通过中断请求来解除，所以也能进行间歇运行。但是，在 X1 时钟的情况下，因为在解除STOP 模式时需要确保振荡稳定的等待时间，所以如果一定要通过中断请求立即开始处理，就必须选择 HALT 模式。</p><blockquote><p>(3) SNOOZE 模式</p></blockquote><p>通过 CSIp 或者 UARTq 的数据接收以及由定时器触发信号 （中断请求信号 （ INTRTC/INTIT））产生的 A/D转换请求，解除 STOP 模式，不需要 CPU 运行而进行 CSIp 或者 UARTq 的数据接收，或者进行 A/D 转换。只有在选择高速内部振荡器作为 CPU/ 外围硬件时钟 （ fCLK）时才能设定 SNOOZE 模式。</p><p>在任何一种模式中，寄存器、标志和数据存储器全部保持设定为待机模式前的内容，并且还保持输入 / 输出端口的输出锁存器和输出缓冲器的状态。</p><p>最后决定使用STOP模式来进行功耗设计，使功耗尽可能降低到最低。</p><p>以单片机为核心构成的系统，其系统的总能耗是由单片机能耗及其外围电路能耗共同构成。</p><p>所以为了降低整个系统的功耗，除了要降低单片机自身的运行恭号外，还要降低外围电路的功耗。</p><p>如果要在STOP模式下工作，首先要把单片机外围的IO设备最大程度上禁用。</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/08/2578120507.png" alt="&quot;STOP模式中的运行状态&quot;"></p><blockquote><p>在本系统中，除了单片机，还有无线模块，蜂鸣器和一个LED灯耗电。</p></blockquote><p>下面进行分步描述</p><h3 id="1、首先要做的是对无线模块休眠，因为射频在工作的时候，电流高达15mA左右。"><a href="#1、首先要做的是对无线模块休眠，因为射频在工作的时候，电流高达15mA左右。" class="headerlink" title="1、首先要做的是对无线模块休眠，因为射频在工作的时候，电流高达15mA左右。"></a>1、首先要做的是对无线模块休眠，因为射频在工作的时候，电流高达15mA左右。</h3><p>Si24R1芯片内部有状态机，控制着芯片在不同工作模式的切换。<br>Si24R1可配置为Shutdown,Standby,Idle-TX,TX,Rx五种工作模式。</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/08/4010025032.png" alt="无线工作模式"></p><p>为了降低无线模块的功耗，也要让无线模块在Shutdown模式下工作。</p><p>在Shutdown工作模式下，Si24R1所有收发功能模块关闭，芯片停止工作，消耗电流最小，<br>但所有内部寄存器值和FIFO值保持不变，仍可通过SPI实现对寄存器的读写。</p><p>设置CONFIG寄存器的PWR_UP位的值为0，芯片立即返回到Shutdown工作模式。</p><p>查看CONFIG寄存器的配置如下：</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/08/3292061551.png" alt="CONFIG寄存器"></p><p>PWR_UP在CONFIG寄存器的第一位，所以把该位拉低即可。</p><p>编写子函数如下：</p><pre><code>    /******************************************************************    SPI Shutdown 关断模式    把config 配置寄存器的第一位PWR_up拉低    ********************************************************************/    void SI24R1_Shutdown(void )    {                     SI24R1_CEL;                    SPI_Write_Reg(NRF_WRITE_REG + CONFIG, 0x00);                    SI24R1_Delay_ms(2);                    SI24R1_CEH;    }</code></pre><p>然后在必要的时候需要对无线模块进行唤醒。所以编写无线开启子函数。</p><pre><code>/******************************************************************SPI 上电模式        ********************************************************************/void SI24R1_PowerOn(void ){                SI24R1_CEL;                SPI_Write_Reg(NRF_WRITE_REG + CONFIG, 0x71);//发射模式                SI24R1_Delay_us(120);                SPI_Write_Reg(NRF_WRITE_REG + CONFIG, 0x3F);  // Set PWR_UP bit, enable CRC(2 bytes)                SI24R1_Delay_ms(2);                SI24R1_CEH;                RX_Mode(WireComm.Addr,WireComm.CommChannel);}</code></pre><p>至此无线低功耗设计完成。</p><h3 id="2、单片机I-O的处理"><a href="#2、单片机I-O的处理" class="headerlink" title="2、单片机I/O的处理"></a>2、单片机I/O的处理</h3><p>该系统对单片机I/O的利用有A/D转换，蜂鸣器，LED灯，EEPROM等。所以在进入STOP模式时，要把这些引脚给拉高。</p><p>蜂鸣器的话要根据硬件情况拉低或拉高。</p><h3 id="3、编写STOP模式函数"><a href="#3、编写STOP模式函数" class="headerlink" title="3、编写STOP模式函数"></a>3、编写STOP模式函数</h3><p>进入STOP模式很简单，一条STOP();就可以进入，所以在进入STOP模式之前要把单片机系统外围的I/O进行处理。没有用到的I/O最好也要设为输出拉高。</p><p>但是没有用到I/O对电流影响不大。</p><p>对于唤醒stop模式，打开单片机的内部定时器，周期为200ms。根据用户手册进行时序设计。它可以用来唤醒STOP模式。</p><p>内部定时器是一个12位间隔定时器。我们按事先设定的任意时间间隔产生中断 （ INTIT），能用于从 STOP 模式的唤醒以及 A/D 转换器的 SNOOZE模式的触发。</p><p>在定时器里面设定无线为休眠状态，主函数里面调用STOP模式。</p><p>无线的状态为每5s唤醒一次，工作50ms，然后重新进入休眠。</p><p>定时器中断和STOP模式部分程序如下：</p><pre><code>/************************************************************************************************************************ Function Name: r_it_interrupt* Description  : This function is INTIT interrupt service routine.* Arguments    : None* Return Value : None***********************************************************************************************************************/__interrupt static void r_it_interrupt( void){    /* Start user code. Do not edit comment generated here */                 if(Envent.Si24R1Sleep&lt; 0xF0) Envent.Si24R1Sleep++;                 if(Envent.DoorSleep&lt; 0xF0) Envent.DoorSleep++;                 //按键扫描                KeyScan();               ....................................    /* End user code. Do not edit comment generated here */}</code></pre><pre><code>    /**********************************************************************************    Function Name :   Stop_mode(void)    Description             : 睡眠模式    Parameters               : none    Return value  : none    ***********************************************************************************/    void Stop_mode(void )    {                     if((Envent.Si24R1Work&gt; 0) || (WIRREC !=WireComm.WorkSta) ) return ;                    SI24R1_Shutdown();                    R_ADC_Set_OperationOff();                    P6.0 =1;                    P6.1 =1;                    BELLOFF;                    P2.2 =1;                    P7.0 =1;                    Envent.Si24R1Sleep =1;                     while(Envent.Si24R1Sleep)                    {                                     STOP();                                     NOP();                                     NOP();                                     NOP();                                     NOP();                        ....................                                       ...............                                     if(Envent.DoorSleep&gt;= 5)                                    {                                                    Envent.DoorSleep =0;                                                     //状态改变上报一次                                                     if(ReedSwitch!= Envent.DoorSta)                                                    {                                                                    Envent.DoorSta =ReedSwitch;                                                                     if(WirPro.ParaMode== 1 &amp;&amp; ReedSwitchOn ==ReedSwitch)                                                                    {                                                                                     BELLON;                                                                                     delay_ms(200);                                                                                     delay_ms(100);                                                                                     BELLOFF;                                                                                     TimeDelayUp=0;                                                                    }                                                                    Envent.DeviceUp =0;                                                                    Envent.CtrlUpSend =VALID_FLAG;                                                                    Envent.Si24R1Sleep =25;                                                    }                                    }                                     else if (Envent.Si24R1Sleep&gt;=25) //5s                                    {                                                    Envent.Si24R1Sleep =0;                                                    Envent.Si24R1Work =50;//50ms                                    }                                    R_WDT_Restart();                   }                    SI24R1_PowerOn();                    ...............    }</code></pre><p>最后对系统的功能进行整体调试，得到的待机模式下工作电流为6微安左右。无线发射和接收时有15mA，蜂鸣器工作时，最高有37mA。</p><p>基本满足要求设计。不过还需要继续完善。</p><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/08/3328869344.png" alt="效果图"></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;经过一周多的单片机设计，功能基本完成。但是发现运行功耗非常大，电流在5mA左右，无线发射和接收时更是高达15mA。&lt;/p&gt;
&lt;p&gt;这和要求的功耗设计都不在一个数量级，要求的功耗是在微安级别的。所以需要一个方法降低系统的功耗。&lt;/p&gt;
    
    </summary>
    
    
      <category term="单片机" scheme="http://rayuu.com/categories/%E5%8D%95%E7%89%87%E6%9C%BA/"/>
    
    
      <category term="瑞萨 低功耗 单片机" scheme="http://rayuu.com/tags/%E7%91%9E%E8%90%A8-%E4%BD%8E%E5%8A%9F%E8%80%97-%E5%8D%95%E7%89%87%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>git基本命令推送到github</title>
    <link href="http://rayuu.com/2016/07/29/git-ji-ben-ming-ling/"/>
    <id>http://rayuu.com/2016/07/29/git-ji-ben-ming-ling/</id>
    <published>2016-07-29T12:03:54.000Z</published>
    <updated>2016-07-29T13:40:47.794Z</updated>
    
    <content type="html"><![CDATA[<h1 id="使用git上传下载github上的代码"><a href="#使用git上传下载github上的代码" class="headerlink" title="使用git上传下载github上的代码"></a>使用git上传下载github上的代码</h1><blockquote><p>1、安装git<br>2、在本地创建ssh key</p></blockquote><a id="more"></a><pre><code>ssh-keygen -t rsa -C "your_email@youremail.com"</code></pre><p>比如 <code>ssh-keygen -t rsa -C "rayu@engineer.com"</code></p><p>邮箱就是你的github邮箱。<br>之后会要求确认路径和输入密码，我们这使用默认的一路回车就行。<br>成功的话会在~/下生成.ssh文件夹，进去，打开id_rsa.pub，复制里面的key。<br>回到github，进入Account Settings，左边选择SSH Keys，Add SSH Key,title随便填，粘贴key。<br>添加完成。</p><blockquote><p>3、连接到github</p></blockquote><pre><code> ssh -T git@github.com</code></pre><p>输入一个yes,会看到：<code>You’ve successfully authenticated, but GitHub does not provide shell access</code> 。这就表示已成功连上github。</p><blockquote><p>4、设置常用的用户名和密码</p></blockquote><pre><code>git config --global user.name "your name"git config --global user.email "your_email@youremail.com"</code></pre><p>这里的用户名和邮箱分别是github的用户名和邮箱。</p><blockquote><p>5、进入仓库</p></blockquote><pre><code>git remote add origin git@github.com:yourName/yourRepo.git</code></pre><p> 后面的yourName和yourRepo表示你再github的用户名和刚才新建的仓库，加完之后进入.git目录，打开config，这里会多出一个remote “origin”内容，这就是刚才添加的远程地址，也可以直接修改config来配置远程地址。</p><blockquote><p>6、提交上传</p></blockquote><p>接下来在本地仓库里添加一些文件，比如README，</p><pre><code>    git add README    #git add .    touch git.md    git commit -m "first commit"</code></pre><p>上传到github：</p><pre><code>   git push origin master</code></pre><p>   <code>git push</code>命令会将本地仓库推送到远程服务器。<br>   <code>git pull</code>命令则相反。</p><p>使用<code>git status</code>可以查看文件的差别，<br>使用<code>git add</code>添加要commit的文件，<br>之后<code>git commit</code>提交本次修改，<code>git push</code>上传到github。<br>或者<code>git push origin master</code></p><blockquote><p>7、克隆仓库</p></blockquote><p>找到想要克隆的仓库。</p><pre><code>git clone git@github.com:AloneMonkey/weekly.git</code></pre><p>提交上传的命令见第六步。</p><h1 id="PS"><a href="#PS" class="headerlink" title="PS:"></a>PS:</h1><h3 id="一、hexo新建md文件的命令是："><a href="#一、hexo新建md文件的命令是：" class="headerlink" title="一、hexo新建md文件的命令是："></a>一、hexo新建md文件的命令是：</h3><pre><code>hexo new "git"</code></pre><p>会自带md后缀，哈哈，然后<code>hexo d -g</code></p><h3 id="二、出现错误解决方法"><a href="#二、出现错误解决方法" class="headerlink" title="二、出现错误解决方法"></a>二、出现错误解决方法</h3><pre><code>Please, commit your changes or stash them before you can merge.Aborting</code></pre><p><code>git pull</code>时出现上述情况，解决方法如下：</p><p>这是因为如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候,<br>在发布这个配置文件的时候,会发生代码冲突:</p><p>如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:</p><pre><code>git stash git pull git stash pop</code></pre><p>然后可以使用<code>git diff -w +文件名</code> 来确认代码自动合并的情况.</p><p>反过来,如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:</p><pre><code>git reset --hard git pull</code></pre><p>其中git reset是针对版本,如果想针对文件回退本地修改,使用<br> git checkout HEAD file/to/restore  </p><p> 进阶：</p><pre><code>git stash save "work in progress for foo feature"</code></pre><p>当你多次使用’git stash’命令后，你的栈里将充满了未提交的代码，这时候你会对将哪个版本应用回来有些困惑，</p><p>’<code>git stash list</code>’ 命令可以将当前的Git栈信息打印出来，<br>你只需要将找到对应的版本号，<br>例如使用’git stash apply stash@{1}’<br>就可以将你指定版本号为stash@{1}的工作取出来，<br>当你将所有的栈都应用回来的时候，可以使用’<code>git stash clear</code>’来将栈清空。</p><p>转自：<a href="http://blog.csdn.net/wh_19910525/article/details/7784901" target="_blank" rel="noopener">http://blog.csdn.net/wh_19910525/article/details/7784901</a></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;使用git上传下载github上的代码&quot;&gt;&lt;a href=&quot;#使用git上传下载github上的代码&quot; class=&quot;headerlink&quot; title=&quot;使用git上传下载github上的代码&quot;&gt;&lt;/a&gt;使用git上传下载github上的代码&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;1、安装git&lt;br&gt;2、在本地创建ssh key&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="git" scheme="http://rayuu.com/categories/git/"/>
    
    
      <category term="git" scheme="http://rayuu.com/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>windows右键添加cmd菜单</title>
    <link href="http://rayuu.com/2016/06/01/cmdhere/"/>
    <id>http://rayuu.com/2016/06/01/cmdhere/</id>
    <published>2016-06-01T04:09:55.000Z</published>
    <updated>2016-06-01T04:22:37.642Z</updated>
    
    <content type="html"><![CDATA[<p>windows右键添加cmd菜单</p><p>在windows右键添加cmd菜单，如下图。<br>原文地址：<a href="http://blog.rayuu.com/cmdhere.html" target="_blank" rel="noopener">http://blog.rayuu.com/cmdhere.html</a></p><a id="more"></a><p><img src="http://7xlqnm.com1.z0.glb.clouddn.com/2016/06/3150704417.jpg" alt="效果图"></p><p>这样使用cmd进入某个路径就方便多了！！！！</p><h1 id="步骤："><a href="#步骤：" class="headerlink" title="步骤："></a>步骤：</h1><h1 id="1、创建一个记事本文件，将以下文字复制进去，然后保存。"><a href="#1、创建一个记事本文件，将以下文字复制进去，然后保存。" class="headerlink" title="1、创建一个记事本文件，将以下文字复制进去，然后保存。"></a>1、创建一个记事本文件，将以下文字复制进去，然后保存。</h1><pre class=" language-bash"><code class="language-bash">Windows Registry Editor Version 5.00 <span class="token punctuation">[</span>HKEY_CLASSES_ROOT\*\shell\cmdhere<span class="token punctuation">]</span> @<span class="token operator">=</span><span class="token string">"Cmd&amp;Here"</span><span class="token punctuation">[</span>HKEY_CLASSES_ROOT\*\shell\cmdhere\command<span class="token punctuation">]</span> @<span class="token operator">=</span><span class="token string">"cmd.exe /c start cmd.exe /k pushd \"%l \\..\" "</span><span class="token punctuation">[</span>HKEY_CLASSES_ROOT\Folder\shell\cmdhere<span class="token punctuation">]</span> @<span class="token operator">=</span><span class="token string">"Cmd&amp;Here"</span><span class="token punctuation">[</span>HKEY_CLASSES_ROOT\Folder\shell\cmdhere\command<span class="token punctuation">]</span> @<span class="token operator">=</span><span class="token string">"cmd.exe /c start cmd.exe /k pushd \"%l\" "</span></code></pre><h1 id="2、将记事本的文件的后缀-txt-改成-reg。"><a href="#2、将记事本的文件的后缀-txt-改成-reg。" class="headerlink" title="2、将记事本的文件的后缀 txt 改成 reg。"></a>2、将记事本的文件的后缀 txt 改成 reg。</h1><h1 id="3、双击运行这个文件，提示添加注册表项，选择“是”。"><a href="#3、双击运行这个文件，提示添加注册表项，选择“是”。" class="headerlink" title="3、双击运行这个文件，提示添加注册表项，选择“是”。"></a>3、双击运行这个文件，提示添加注册表项，选择“是”。</h1><h1 id="4、然后再随便找个文件，点击右键，可以看见多了一个“cmdhere”的菜单，如上图所示！"><a href="#4、然后再随便找个文件，点击右键，可以看见多了一个“cmdhere”的菜单，如上图所示！" class="headerlink" title="4、然后再随便找个文件，点击右键，可以看见多了一个“cmdhere”的菜单，如上图所示！"></a>4、然后再随便找个文件，点击右键，可以看见多了一个“cmdhere”的菜单，如上图所示！</h1><p>点进去就是命令行了。</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;windows右键添加cmd菜单&lt;/p&gt;
&lt;p&gt;在windows右键添加cmd菜单，如下图。&lt;br&gt;原文地址：&lt;a href=&quot;http://blog.rayuu.com/cmdhere.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://blog.rayuu.com/cmdhere.html&lt;/a&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="技术分享" scheme="http://rayuu.com/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
      <category term="windows" scheme="http://rayuu.com/tags/windows/"/>
    
  </entry>
  
  <entry>
    <title>将hexo博客同时托管到github和coding</title>
    <link href="http://rayuu.com/2016/05/29/git-coding/"/>
    <id>http://rayuu.com/2016/05/29/git-coding/</id>
    <published>2016-05-29T05:57:09.000Z</published>
    <updated>2016-05-31T13:46:12.098Z</updated>
    
    <content type="html"><![CDATA[<h1 id="将hexo博客同时托管到github和coding"><a href="#将hexo博客同时托管到github和coding" class="headerlink" title="将hexo博客同时托管到github和coding"></a>将hexo博客同时托管到github和coding</h1><p>发现百度的sitemap.xml抓取不到github上面的，所以今天又弄了一个coding。</p><p>在个人设置里面添加好公钥后，本地git登录</p><p>然后在站点配置文件<code>_config.yml</code>里面配置如下：</p><a id="more"></a><pre class=" language-bash"><code class="language-bash"><span class="token comment" spellcheck="true"># Deployment</span><span class="token comment" spellcheck="true">## Docs: https://hexo.io/docs/deployment.html</span>deploy:  type: <span class="token function">git</span>  <span class="token comment" spellcheck="true">#repository: https://github.com/Rayuu/Rayuu.github.io.git</span>  <span class="token comment" spellcheck="true">#branch: master</span>  repo:    github: git@github.com:Rayuu/Rayuu.github.io.git,master    coding: git@git.coding.net:chay/chay.git,coding-pages</code></pre><p>接下来<code>git bash</code>到站点目录</p><p>最后</p><pre class=" language-bash"><code class="language-bash">hexo d -g</code></pre><p>没有报错说明完成，添加密钥后也不用每次输入密码了。</p><p>这样就完美了哦！</p><h1 id="—————我是分割线—————"><a href="#—————我是分割线—————" class="headerlink" title="—————我是分割线—————"></a>—————我是分割线—————</h1><p>今天重装了系统，感觉整个人都好多了。哈哈哈（#滑稽）<br>重新部署hexo</p><p>先安装<code>hexo</code>，<br>再安装<code>nodejs,git</code><br>接着安装<code>npm install -g cnpm --registry=https://registry.npm.taobao.org</code></p><pre class=" language-bash"><code class="language-bash">cnpm <span class="token function">install</span> -g hexo</code></pre><p>找个文件夹打开 git bash here</p><pre class=" language-bash"><code class="language-bash">hexo initcnpm <span class="token function">install</span> hexo-deployer-git --savecnpm <span class="token function">install</span> hexo-generator-sitemap --savecnpm <span class="token function">install</span> hexo-generator-baidu-sitemap --savecnpm <span class="token function">install</span> hexo-generator-search --save</code></pre><p>把备份的公钥文件夹放到<code>C:\Users\用户名\.ssh</code>下面</p><pre class=" language-bash"><code class="language-bash"><span class="token function">ssh</span> -T git@git.coding.net<span class="token function">ssh</span> -T git@github.com</code></pre><p>让服务器使用<code>ssh</code>协议。<br>成功的话就一切正常。</p><pre class=" language-bash"><code class="language-bash">hexo d -g</code></pre><p>上传！！！搞定。。。</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;将hexo博客同时托管到github和coding&quot;&gt;&lt;a href=&quot;#将hexo博客同时托管到github和coding&quot; class=&quot;headerlink&quot; title=&quot;将hexo博客同时托管到github和coding&quot;&gt;&lt;/a&gt;将hexo博客同时托管到github和coding&lt;/h1&gt;&lt;p&gt;发现百度的sitemap.xml抓取不到github上面的，所以今天又弄了一个coding。&lt;/p&gt;
&lt;p&gt;在个人设置里面添加好公钥后，本地git登录&lt;/p&gt;
&lt;p&gt;然后在站点配置文件&lt;code&gt;_config.yml&lt;/code&gt;里面配置如下：&lt;/p&gt;
    
    </summary>
    
    
      <category term="git" scheme="http://rayuu.com/categories/git/"/>
    
    
      <category term="git" scheme="http://rayuu.com/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>随笔</title>
    <link href="http://rayuu.com/2016/05/28/2015-03-19-first/"/>
    <id>http://rayuu.com/2016/05/28/2015-03-19-first/</id>
    <published>2016-05-27T16:00:00.000Z</published>
    <updated>2016-05-28T08:24:17.352Z</updated>
    
    <content type="html"><![CDATA[<p>一年后，我又在<code>github</code>上搭起了博客，虽然搬瓦工也买了一年的服务器。<br>它的地址是<a href="http://blog.rayuu.com/" target="_blank" rel="noopener" title="rayu技术分享">http://blog.rayuu.com/</a></p><a id="more"></a><ul><li>Rayu 2016-05-28 </li></ul><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;一年后，我又在&lt;code&gt;github&lt;/code&gt;上搭起了博客，虽然搬瓦工也买了一年的服务器。&lt;br&gt;它的地址是&lt;a href=&quot;http://blog.rayuu.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;rayu技术分享&quot;&gt;http://blog.rayuu.com/&lt;/a&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="随笔" scheme="http://rayuu.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="随笔" scheme="http://rayuu.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>centos6.4从python2.6升级python2.7.9</title>
    <link href="http://rayuu.com/2016/05/25/cetos-python-update/"/>
    <id>http://rayuu.com/2016/05/25/cetos-python-update/</id>
    <published>2016-05-24T16:00:00.000Z</published>
    <updated>2016-05-28T09:09:09.807Z</updated>
    
    <content type="html"><![CDATA[<h1 id="原文地址：-http-blog-rayuu-com-86-html"><a href="#原文地址：-http-blog-rayuu-com-86-html" class="headerlink" title="原文地址： http://blog.rayuu.com/86.html"></a>原文地址： <a href="http://blog.rayuu.com/86.html" target="_blank" rel="noopener" title="centos6.4从python2.6升级python2.7.9">http://blog.rayuu.com/86.html</a></h1><p>centos6.4系统自带的python版本是2.6，用起来不是很方便。</p><p>于是今天我又开始折腾了。</p><p>首先看一下系统的版本</p><h1 id="lsb-release-a"><a href="#lsb-release-a" class="headerlink" title="lsb_release -a"></a>lsb_release -a</h1><p>发现是centos6.4</p><a id="more"></a><p>再查看python版本</p><h1 id="python-V"><a href="#python-V" class="headerlink" title="python  -V"></a>python  -V</h1><p>Python 2.6.6<br>下面开始升级，下载源码自己编译。。。。。</p><p>操作步骤如下：</p><p>1）安装devtoolset</p><p>yum groupinstall “Development tools”<br>2）安装编译Python需要的包包</p><p>yum install zlib-devel<br>yum install bzip2-devel<br>yum install openssl-devel<br>yum install ncurses-devel<br>yum install sqlite-devel</p><p>3）下载并解压Python 2.7.9的源代码</p><p>cd /opt<br>wget –no-check-certificate <a href="https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz" target="_blank" rel="noopener">https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tar.xz</a><br>tar xf Python-2.7.9.tar.xz<br>cd Python-2.7.9<br>4）编译与安装Python 2.7.9</p><p>./configure –prefix=/usr/local<br>make &amp;&amp; make altinstall<br>5）将python命令指向Python 2.7.9</p><p>ln -s /usr/local/bin/python2.7 /usr/local/bin/python   //这句好像没什么用。。。<br>#mv /usr/bin/python /usr/bin/python2.6<br>#ln -s /usr/local/bin/python2.7 /usr/bin/python<br>6）重新检验Python 版本</p><p>#python -V<br>7）解决系统 Python 软链接指向 Python2.7 版本后，因为yum是不兼容 Python 2.7的，所以yum不能正常工作，我们需要指定 yum 的Python版本</p><p>#vi /usr/bin/yum  </p><p>将文件头部的</p><p>#!/usr/bin/python</p><p>改成<br>#!/usr/bin/python2.6<br>保存并退出大功告成。。。。</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;原文地址：-http-blog-rayuu-com-86-html&quot;&gt;&lt;a href=&quot;#原文地址：-http-blog-rayuu-com-86-html&quot; class=&quot;headerlink&quot; title=&quot;原文地址： http://blog.rayuu.com/86.html&quot;&gt;&lt;/a&gt;原文地址： &lt;a href=&quot;http://blog.rayuu.com/86.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; title=&quot;centos6.4从python2.6升级python2.7.9&quot;&gt;http://blog.rayuu.com/86.html&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;centos6.4系统自带的python版本是2.6，用起来不是很方便。&lt;/p&gt;
&lt;p&gt;于是今天我又开始折腾了。&lt;/p&gt;
&lt;p&gt;首先看一下系统的版本&lt;/p&gt;
&lt;h1 id=&quot;lsb-release-a&quot;&gt;&lt;a href=&quot;#lsb-release-a&quot; class=&quot;headerlink&quot; title=&quot;lsb_release -a&quot;&gt;&lt;/a&gt;lsb_release -a&lt;/h1&gt;&lt;p&gt;发现是centos6.4&lt;/p&gt;
    
    </summary>
    
    
      <category term="python" scheme="http://rayuu.com/categories/python/"/>
    
    
      <category term="python" scheme="http://rayuu.com/tags/python/"/>
    
  </entry>
  
  <entry>
    <title>cordova+ionic跨平台应用</title>
    <link href="http://rayuu.com/2016/05/22/cordova2/"/>
    <id>http://rayuu.com/2016/05/22/cordova2/</id>
    <published>2016-05-21T16:00:00.000Z</published>
    <updated>2016-05-28T09:13:55.253Z</updated>
    
    <content type="html"><![CDATA[<h1 id="原文地址：-http-blog-rayuu-com-cordova2-html"><a href="#原文地址：-http-blog-rayuu-com-cordova2-html" class="headerlink" title="原文地址： http://blog.rayuu.com/cordova2.html"></a>原文地址： <a href="http://blog.rayuu.com/cordova2.html" target="_blank" rel="noopener" title="cordova+ionic跨平台应用">http://blog.rayuu.com/cordova2.html</a></h1><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;原文地址：-http-blog-rayuu-com-cordova2-html&quot;&gt;&lt;a href=&quot;#原文地址：-http-blog-rayuu-com-cordova2-html&quot; class=&quot;headerlink&quot; title=&quot;原文地址： http://b
      
    
    </summary>
    
    
      <category term="cordova" scheme="http://rayuu.com/categories/cordova/"/>
    
    
      <category term="cordova" scheme="http://rayuu.com/tags/cordova/"/>
    
  </entry>
  
  <entry>
    <title>cordova入门</title>
    <link href="http://rayuu.com/2016/05/18/cordova1/"/>
    <id>http://rayuu.com/2016/05/18/cordova1/</id>
    <published>2016-05-17T16:00:00.000Z</published>
    <updated>2016-05-28T09:24:20.274Z</updated>
    
    <content type="html"><![CDATA[<h1 id="原文地址：-http-blog-rayuu-com-cordova1-html"><a href="#原文地址：-http-blog-rayuu-com-cordova1-html" class="headerlink" title="原文地址： http://blog.rayuu.com/cordova1.html"></a>原文地址： <a href="http://blog.rayuu.com/cordova1.html" target="_blank" rel="noopener" title="cordova入门">http://blog.rayuu.com/cordova1.html</a></h1><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;原文地址：-http-blog-rayuu-com-cordova1-html&quot;&gt;&lt;a href=&quot;#原文地址：-http-blog-rayuu-com-cordova1-html&quot; class=&quot;headerlink&quot; title=&quot;原文地址： http://b
      
    
    </summary>
    
    
      <category term="cordova" scheme="http://rayuu.com/categories/cordova/"/>
    
    
      <category term="cordova" scheme="http://rayuu.com/tags/cordova/"/>
    
  </entry>
  
  <entry>
    <title>51单片机三线串行驱动12864液晶</title>
    <link href="http://rayuu.com/2016/05/17/12864lecd/"/>
    <id>http://rayuu.com/2016/05/17/12864lecd/</id>
    <published>2016-05-16T16:00:00.000Z</published>
    <updated>2016-05-28T09:17:43.408Z</updated>
    
    <content type="html"><![CDATA[<h1 id="原文地址：-http-blog-rayuu-com-12864lcd-html"><a href="#原文地址：-http-blog-rayuu-com-12864lcd-html" class="headerlink" title="原文地址： http://blog.rayuu.com/12864lcd.html"></a>原文地址： <a href="http://blog.rayuu.com/12864lcd.html" target="_blank" rel="noopener" title="51单片机三线串行驱动12864液晶">http://blog.rayuu.com/12864lcd.html</a></h1><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;原文地址：-http-blog-rayuu-com-12864lcd-html&quot;&gt;&lt;a href=&quot;#原文地址：-http-blog-rayuu-com-12864lcd-html&quot; class=&quot;headerlink&quot; title=&quot;原文地址： http://b
      
    
    </summary>
    
    
      <category term="单片机" scheme="http://rayuu.com/categories/%E5%8D%95%E7%89%87%E6%9C%BA/"/>
    
    
      <category term="lcd12864" scheme="http://rayuu.com/tags/lcd12864/"/>
    
  </entry>
  
  <entry>
    <title>typecho微信助手</title>
    <link href="http://rayuu.com/2016/05/12/wechat/"/>
    <id>http://rayuu.com/2016/05/12/wechat/</id>
    <published>2016-05-11T16:00:00.000Z</published>
    <updated>2016-05-28T09:19:05.503Z</updated>
    
    <content type="html"><![CDATA[<h1 id="原文地址：-http-blog-rayuu-com-typewechat-html"><a href="#原文地址：-http-blog-rayuu-com-typewechat-html" class="headerlink" title="原文地址： http://blog.rayuu.com/typewechat.html"></a>原文地址： <a href="http://blog.rayuu.com/typewechat.html" target="_blank" rel="noopener" title="typecho微信助手">http://blog.rayuu.com/typewechat.html</a></h1><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;原文地址：-http-blog-rayuu-com-typewechat-html&quot;&gt;&lt;a href=&quot;#原文地址：-http-blog-rayuu-com-typewechat-html&quot; class=&quot;headerlink&quot; title=&quot;原文地址： http
      
    
    </summary>
    
    
      <category term="微信" scheme="http://rayuu.com/categories/%E5%BE%AE%E4%BF%A1/"/>
    
    
      <category term="微信助手" scheme="http://rayuu.com/tags/%E5%BE%AE%E4%BF%A1%E5%8A%A9%E6%89%8B/"/>
    
  </entry>
  
  <entry>
    <title>16led摇摇棒</title>
    <link href="http://rayuu.com/2016/05/09/16led/"/>
    <id>http://rayuu.com/2016/05/09/16led/</id>
    <published>2016-05-08T16:00:00.000Z</published>
    <updated>2016-05-28T09:16:23.530Z</updated>
    
    <content type="html"><![CDATA[<h1 id="原文地址：-http-blog-rayuu-com-16led-html"><a href="#原文地址：-http-blog-rayuu-com-16led-html" class="headerlink" title="原文地址： http://blog.rayuu.com/16led.html"></a>原文地址： <a href="http://blog.rayuu.com/16led.html" target="_blank" rel="noopener" title="16led摇摇棒">http://blog.rayuu.com/16led.html</a></h1><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;原文地址：-http-blog-rayuu-com-16led-html&quot;&gt;&lt;a href=&quot;#原文地址：-http-blog-rayuu-com-16led-html&quot; class=&quot;headerlink&quot; title=&quot;原文地址： http://blog.ra
      
    
    </summary>
    
    
      <category term="单片机" scheme="http://rayuu.com/categories/%E5%8D%95%E7%89%87%E6%9C%BA/"/>
    
    
      <category term="led摇摇棒" scheme="http://rayuu.com/tags/led%E6%91%87%E6%91%87%E6%A3%92/"/>
    
  </entry>
  
  <entry>
    <title>CET4、6级无证查询99接口</title>
    <link href="http://rayuu.com/2016/05/03/cetnoticket/"/>
    <id>http://rayuu.com/2016/05/03/cetnoticket/</id>
    <published>2016-05-02T16:00:00.000Z</published>
    <updated>2016-05-28T09:19:51.599Z</updated>
    
    <content type="html"><![CDATA[<h1 id="原文地址：-http-blog-rayuu-com-cetnoticket-html"><a href="#原文地址：-http-blog-rayuu-com-cetnoticket-html" class="headerlink" title="原文地址： http://blog.rayuu.com/cetnoticket.html"></a>原文地址： <a href="http://blog.rayuu.com/cetnoticket.html" target="_blank" rel="noopener" title="CET4、6级无证查询99接口">http://blog.rayuu.com/cetnoticket.html</a></h1><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h1 id=&quot;原文地址：-http-blog-rayuu-com-cetnoticket-html&quot;&gt;&lt;a href=&quot;#原文地址：-http-blog-rayuu-com-cetnoticket-html&quot; class=&quot;headerlink&quot; title=&quot;原文地址： ht
      
    
    </summary>
    
    
      <category term="cet" scheme="http://rayuu.com/categories/cet/"/>
    
    
      <category term="cet" scheme="http://rayuu.com/tags/cet/"/>
    
  </entry>
  
  <entry>
    <title>树莓派折腾之旅（三）</title>
    <link href="http://rayuu.com/2015/08/05/2015-08-05-pi3/"/>
    <id>http://rayuu.com/2015/08/05/2015-08-05-pi3/</id>
    <published>2015-08-04T16:00:00.000Z</published>
    <updated>2016-05-28T08:20:30.387Z</updated>
    
    <content type="html"><![CDATA[<p>###暑假放假了，做了一个wifi小车。</p><p>先是搭硬件，小车，电机驱动，稳压，电池什么的。</p><p>此处略去很多字。</p><p>既然是wifi小车，首先要让车跑起来。</p><p>让车跑，首先要控制I/O口。</p><p>用的是python的GPIO口的库。</p><pre class=" language-bash"><code class="language-bash">    <span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> python-dev    <span class="token comment" spellcheck="true"># 下载 </span>    $ <span class="token function">wget</span> http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.5.3a.tar.gz    <span class="token comment" spellcheck="true"># 解压缩 </span>    $ <span class="token function">tar</span> xvzf RPi.GPIO-0.5.3a.tar.gz     <span class="token comment" spellcheck="true"># 进入解压之后的目录 </span>    $ <span class="token function">cd</span> RPi.GPIO-0.5.3a     <span class="token comment" spellcheck="true"># 启动安装 </span>    $ <span class="token function">sudo</span> python setup.py <span class="token function">install</span></code></pre><a id="more"></a><p>然后进入python界面</p><pre class=" language-python"><code class="language-python">    <span class="token keyword">import</span> RPi<span class="token punctuation">.</span>GPIO <span class="token keyword">as</span> GPIO</code></pre><p>没有报错则说明安装成功。</p><p>下面就是用I/O口控制小车了。</p><pre class=" language-python"><code class="language-python">    <span class="token keyword">import</span> RPi<span class="token punctuation">.</span>GPIO <span class="token keyword">as</span> GPIO      <span class="token keyword">import</span> time      GPIO<span class="token punctuation">.</span>setmode<span class="token punctuation">(</span>GPIO<span class="token punctuation">.</span>BOARD<span class="token punctuation">)</span>       GPIO<span class="token punctuation">.</span>setup<span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">,</span> GPIO<span class="token punctuation">.</span>OUT<span class="token punctuation">)</span>     GPIO<span class="token punctuation">.</span>setup<span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">,</span> GPIO<span class="token punctuation">.</span>OUT<span class="token punctuation">)</span>     GPIO<span class="token punctuation">.</span>setup<span class="token punctuation">(</span><span class="token number">15</span><span class="token punctuation">,</span> GPIO<span class="token punctuation">.</span>OUT<span class="token punctuation">)</span>     GPIO<span class="token punctuation">.</span>setup<span class="token punctuation">(</span><span class="token number">16</span><span class="token punctuation">,</span> GPIO<span class="token punctuation">.</span>OUT<span class="token punctuation">)</span>    in11 <span class="token operator">=</span> GPIO<span class="token punctuation">.</span>PWM<span class="token punctuation">(</span><span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span>    in12 <span class="token operator">=</span> GPIO<span class="token punctuation">.</span>PWM<span class="token punctuation">(</span><span class="token number">12</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span>    in21 <span class="token operator">=</span> GPIO<span class="token punctuation">.</span>PWM<span class="token punctuation">(</span><span class="token number">15</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span>    in22 <span class="token operator">=</span> GPIO<span class="token punctuation">.</span>PWM<span class="token punctuation">(</span><span class="token number">16</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span>     shudu<span class="token operator">=</span><span class="token number">30</span>    <span class="token keyword">def</span> <span class="token function">yanshi</span><span class="token punctuation">(</span>t<span class="token punctuation">)</span><span class="token punctuation">:</span>        <span class="token keyword">while</span> t<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">:</span>            t<span class="token operator">=</span>t<span class="token number">-1</span>    <span class="token keyword">def</span> <span class="token function">houtui</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        in11<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span>        in12<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>        in21<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span>        in22<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">tingzhi</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        in11<span class="token punctuation">.</span>stop<span class="token punctuation">(</span><span class="token punctuation">)</span>        in12<span class="token punctuation">.</span>stop<span class="token punctuation">(</span><span class="token punctuation">)</span>        in21<span class="token punctuation">.</span>stop<span class="token punctuation">(</span><span class="token punctuation">)</span>        in22<span class="token punctuation">.</span>stop<span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">zhizou1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        in11<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>        in12<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span>        in21<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>        in22<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">zhizou</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        in11<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>        in12<span class="token punctuation">.</span>start<span class="token punctuation">(</span>shudu<span class="token punctuation">)</span>        in21<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>        in22<span class="token punctuation">.</span>start<span class="token punctuation">(</span>shudu<span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">youzhuan</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        in11<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>        in12<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span>        in21<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span>        in22<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>    <span class="token keyword">def</span> <span class="token function">zuozhuan</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>        in11<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span>        in12<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>        in21<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>        in22<span class="token punctuation">.</span>start<span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span>      <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span>         fangxiang<span class="token operator">=</span>raw_input<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">if</span> fangxiang<span class="token operator">==</span><span class="token string">'q'</span><span class="token punctuation">:</span>            shudu<span class="token operator">=</span>shudu<span class="token operator">+</span><span class="token number">10</span>            zhizou<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">elif</span> fangxiang<span class="token operator">==</span><span class="token string">'e'</span><span class="token punctuation">:</span>            shudu<span class="token operator">=</span>shudu<span class="token number">-10</span>            zhizou<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">elif</span> fangxiang<span class="token operator">==</span><span class="token string">'w'</span><span class="token punctuation">:</span>            zhizou1<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">elif</span> fangxiang<span class="token operator">==</span><span class="token string">'a'</span><span class="token punctuation">:</span>            t<span class="token operator">=</span><span class="token number">30000</span>            <span class="token keyword">while</span> t<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">:</span>                t<span class="token operator">=</span>t<span class="token number">-1</span>                zuozhuan<span class="token punctuation">(</span><span class="token punctuation">)</span>                tingzhi<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">elif</span> fangxiang<span class="token operator">==</span><span class="token string">'s'</span><span class="token punctuation">:</span>            houtui<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">elif</span> fangxiang<span class="token operator">==</span><span class="token string">'d'</span><span class="token punctuation">:</span>            t<span class="token operator">=</span><span class="token number">30000</span>            <span class="token keyword">while</span> t<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">:</span>                t<span class="token operator">=</span>t<span class="token number">-1</span>                youzhuan<span class="token punctuation">(</span><span class="token punctuation">)</span>                tingzhi<span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">else</span> <span class="token punctuation">:</span>            tingzhi<span class="token punctuation">(</span><span class="token punctuation">)</span></code></pre><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;###暑假放假了，做了一个wifi小车。&lt;/p&gt;
&lt;p&gt;先是搭硬件，小车，电机驱动，稳压，电池什么的。&lt;/p&gt;
&lt;p&gt;此处略去很多字。&lt;/p&gt;
&lt;p&gt;既然是wifi小车，首先要让车跑起来。&lt;/p&gt;
&lt;p&gt;让车跑，首先要控制I/O口。&lt;/p&gt;
&lt;p&gt;用的是python的GPIO口的库。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;bash&quot;&gt;    sudo apt-get install python-dev
    # 下载 
    $ wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.5.3a.tar.gz
    # 解压缩 
    $ tar xvzf RPi.GPIO-0.5.3a.tar.gz 
    # 进入解压之后的目录 
    $ cd RPi.GPIO-0.5.3a 
    # 启动安装 
    $ sudo python setup.py install&lt;/code&gt;&lt;/pre&gt;
    
    </summary>
    
    
      <category term="树莓派" scheme="http://rayuu.com/categories/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
    
    
      <category term="树莓派" scheme="http://rayuu.com/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
    
  </entry>
  
  <entry>
    <title>树莓派折腾之旅（二）</title>
    <link href="http://rayuu.com/2015/06/06/2015-06-06-pi2/"/>
    <id>http://rayuu.com/2015/06/06/2015-06-06-pi2/</id>
    <published>2015-06-05T16:00:00.000Z</published>
    <updated>2016-05-28T08:18:30.612Z</updated>
    
    <content type="html"><![CDATA[<p>######昨天说到了GPIO口的配置，今天有空就再说一说摄像头吧。</p><p>######我是参考的这个帖子做的</p><p><a href="http://www.shumeipai.net/forum.php?mod=viewthread&amp;tid=18882" target="_blank" rel="noopener">http://www.shumeipai.net/forum.php?mod=viewthread&amp;tid=18882</a></p><p>插上摄像头可以看见usbvideo0.</p><p>接下来安装</p><pre><code>sudo apt-get install subversionsudo apt-get install libv4l-devsudo apt-get install libjpeg8-devsudo apt-get install imagemagick</code></pre><a id="more"></a><p>到上面这些步骤都没有错。</p><p>下面下载的是<code>mipg-steamer</code>软件，编译并安装。</p><p>那个帖子里面的下载地址都过期了，所以我就重新百度 google找啊找。</p><p>在网上搜<code>mjpg-streamer</code>搜出一个mjpg-streamer-r63，这个包始终编译不成功，有郁闷了很久。</p><p>终于在github上面有一个和帖子说的一样的。</p><p>还有在这里也有一个链接<a href="http://pan.baidu.com/share/link?shareid=507341537&amp;uk=84253138" target="_blank" rel="noopener">http://pan.baidu.com/share/link?shareid=507341537&amp;uk=84253138</a></p><p>于是希望重新燃起，</p><p>开始编译，建立软连接：<code>sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h</code></p><p>进入目录并编译：</p><pre><code>cd mjpg-streamermake USE_LIBV4L2=true clean all</code></pre><p>编译好像是成功了，因为没有报错。</p><p>然后执行 <code>sudo  ./start.sh</code></p><p>打开浏览器访问，树莓派ip地址:<code>8080</code></p><p>发现并没有成功，摄像头并没有出来，多么痛的领悟啊。</p><p>很忧桑有木有。</p><p>于是又开始找问题，</p><p>分析得出以下结论：</p><p>摄像头没有打开，但是这不科学啊，设备可以检查到usbvideo0。</p><p>摄像头驱动问题，我把摄像头放到windows下发现可以使用。</p><p>就是环境问题咯。</p><p>所以我一个一个尝试，首先看用摄像头拍照可以不。</p><p>结果发现摄像头没有问题。</p><p>就是拍出来的照片有点失真。图片如下：</p><p><img src="http://imglf0.ph.126.net/kvnPMluEeM1YSALtPk3uBg==/6630796186327897140.jpg" alt=""><br>然后又各种找资料。</p><p>找到一个用motion软件做的摄像头识别。好像是专门的网络摄像头监控软件。</p><p>嘿嘿，希望还是有的。</p><pre><code>sudo apt-get install motion </code></pre><p>配置motion，编辑motion.conf文件<br>    sudo vi /etc/motion/motion.conf</p><p>找到”control_localhost on “和”webcam_localhost on“这两行，改为以下两行后，保存退出<br>    control_localhost off<br>    webcam_localhost off</p><p>运行motion软件，输入<code>motion -n</code></p><p>在pc上用浏览器打开 树莓派ip地址:8080</p><p>经过我的测试 ie11  和chrome 不可以实现，火狐浏览器可以哦</p><p><img src="http://imglf1.ph.126.net/HGjYV7U08iEfU8aLBA2PyQ==/2834453015494321729.jpg" alt=""><br>画面就是上面的这样子咯。</p><p>昨天弄了一天效果还可以，感觉很满意。</p><p>总结一下吧：</p><p>树莓派和以前玩过全志A20差不多，都是烧入操作系统。</p><p>直接上操作系统，因为有过这方面的经验，所以折腾起来也就不费事了。</p><p>摄像头监控还做的不好，有时间再玩一玩，可能是因为昨天折腾了一天，头很晕，所以后面摄像头的思路不是很清晰。</p><p>等暑假再做个wifi小车玩一玩。嘿嘿~~！</p><p>还有就是最近的微信公众号效果不错，800多粉丝了。</p><p>这几天查成绩功能不可用，还是很不爽的，所以就传了2个游戏让大家玩。</p><p>嘿嘿，另外发现小米路由器还是很坑的。</p><p>星期五服务器莫名其妙的无法访问，使用的云监控没有报警，原因很奇怪，后来发现是小米路由器不知道什么时候自己把硬盘自动休眠给开启了。害的我找了半天，还以为是网络问题呢。结果把小米路由器的硬盘休眠功能一关闭，服务器就不挂了，正常运行了一天。等查成绩功能教务系统开放了再看一看效果。实在不行就用树莓派当web服务器了。刷个openwrt玩一玩。</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;######昨天说到了GPIO口的配置，今天有空就再说一说摄像头吧。&lt;/p&gt;
&lt;p&gt;######我是参考的这个帖子做的&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.shumeipai.net/forum.php?mod=viewthread&amp;amp;tid=18882&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.shumeipai.net/forum.php?mod=viewthread&amp;amp;tid=18882&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;插上摄像头可以看见usbvideo0.&lt;/p&gt;
&lt;p&gt;接下来安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt-get install subversion

sudo apt-get install libv4l-dev

sudo apt-get install libjpeg8-dev

sudo apt-get install imagemagick&lt;/code&gt;&lt;/pre&gt;
    
    </summary>
    
    
      <category term="树莓派" scheme="http://rayuu.com/categories/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
    
    
      <category term="树莓派" scheme="http://rayuu.com/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
    
  </entry>
  
  <entry>
    <title>树莓派折腾之旅（一）</title>
    <link href="http://rayuu.com/2015/06/06/2015-06-06-pi1/"/>
    <id>http://rayuu.com/2015/06/06/2015-06-06-pi1/</id>
    <published>2015-06-05T16:00:00.000Z</published>
    <updated>2016-05-28T08:21:48.290Z</updated>
    
    <content type="html"><![CDATA[<h6 id="买了一星期的树莓派今天终于有时间折腾了。"><a href="#买了一星期的树莓派今天终于有时间折腾了。" class="headerlink" title="买了一星期的树莓派今天终于有时间折腾了。"></a>买了一星期的树莓派今天终于有时间折腾了。</h6><h6 id="早上一大早就起来，弄了一天。嘿嘿！"><a href="#早上一大早就起来，弄了一天。嘿嘿！" class="headerlink" title="早上一大早就起来，弄了一天。嘿嘿！"></a>早上一大早就起来，弄了一天。嘿嘿！</h6><h6 id="昨天把系统下载下来了。"><a href="#昨天把系统下载下来了。" class="headerlink" title="昨天把系统下载下来了。"></a>昨天把系统下载下来了。</h6><h6 id="树莓派官方-Raspbian-系统下载：http-www-raspberrypi-org-downloads"><a href="#树莓派官方-Raspbian-系统下载：http-www-raspberrypi-org-downloads" class="headerlink" title="树莓派官方 Raspbian 系统下载：http://www.raspberrypi.org/downloads"></a>树莓派官方 Raspbian 系统下载：<a href="http://www.raspberrypi.org/downloads" target="_blank" rel="noopener">http://www.raspberrypi.org/downloads</a></h6><p>首先开始烧系统到内存卡。用win32disk imager</p><a id="more"></a><p>官网下载地址 <a href="http://sourceforge.net/projects/win32diskimager/" target="_blank" rel="noopener">http://sourceforge.net/projects/win32diskimager/</a></p><p><img src="http://imglf0.ph.126.net/uaBktU2DB37gHaRr8Zqs7w==/6630829171676724435.jpg" alt=""></p><p>然后就到上图所示的界面了。</p><p>点击<code>write</code>就开始烧写到内存卡了。</p><p>我开始还很二逼的点了<code>read</code>，苦苦的等了十几分钟发现内存卡还是空的，我的内心几乎是崩溃的。</p><p>记得一定要点<code>write</code>哦！</p><p>烧写完成，把内存卡插到树莓派上面。</p><p>插上网线，通电。</p><p>通过路由器查看raspberry设备的ip地址，然后ssh登上raspberry。</p><p>因为树莓派默认开启了ssh，所以可以直接连上哦！</p><p>默认账号和密码分别是：<code>pi</code>和<code>raspberry</code> </p><p>接着可以把root权限打开</p><pre><code>sudo passwd root</code></pre><p>输入2次密码就行了。</p><p>然后进入如下界面：</p><p>第一次用 root 登录，会自动弹出树莓派的高级设置面板（以后也可以通过 <code>raspi-config</code> 命令进入）：</p><p><img src="http://imglf1.ph.126.net/vGsx9c9n3n4o8LNBnvAzwQ==/6630619164955821229.jpg" alt=""></p><p>选择第一项 <code>Expand Filesystem</code> 扩展 SD 卡上可用的空间，不然以后会有很多大软件，不能安装（提示空间不足，例如 mysql）。<br>扩展之后可以通过 <code>df -h</code> 命令看到效果~</p><p>第二项是修改密码。</p><p><img src="http://imglf1.ph.126.net/YXUYDk6Ycyt4_QVifKwFcg==/6630867654583694509.jpg" alt=""></p><p>第五项是开启摄像头。可以自己都试一试。</p><p>然后最好更改一下软件源，因为在国内毕竟要快一些。</p><p>树莓派官方有提供一个镜像列表：<a href="http://www.raspbian.org/RaspbianMirrors" target="_blank" rel="noopener">http://www.raspbian.org/RaspbianMirrors</a>  里面有很多中国的镜像。</p><p>然后 <code>vi /etc/apt/sources.list</code></p><p>改为</p><pre><code>deb http://mirrors.ustc.edu.cn/raspbian/raspbian/ wheezy main contrib non-free rpideb-src http://mirrors.ustc.edu.cn/raspbian/raspbian/ wheezy main contrib non-free rpi</code></pre><p>按下ESC键，再按下wq  回车，就保存退出了。</p><p>下面<code>apt-get update</code>一下吧。</p><p><img src="http://imglf1.ph.126.net/ZcSUFGPHOZ3BchkYanQRjA==/6630282714397345666.jpg" alt=""></p><p>然后我觉得网线连着不方便，所以就配置了无线网卡。</p><pre><code>vi /etc/network/interfaces</code></pre><p>修改下面的代码，自行配制连上你的路由器。</p><pre><code>iface wlan0 inet staticwpa-ssid Your_Wifi_SSIDwpa-psk Your_Wifi_Passwordaddress 192.168.1.200 # 设定的静态IP地址netmask 255.255.255.0 # 网络掩码gateway 192.168.1.1   # 网关network 192.168.1.1   # 网络地址#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf</code></pre><p>然后拔掉网线，重启restart，开机就是无线上网了。很高兴是吧。</p><p>后面我又安装了lamp</p><p>步骤如下：</p><p>搭建lamp环境，<code>apt-get install apache2 mysql-server php5</code></p><p>修改apache2权限，<code>chmod 777 /var/www/</code></p><p>安装phpmyadmin,<code>apt-get intstall phpmyadmin</code></p><p>选apache2 </p><p>链接到apache2目录，<code>ln -s /usr/share/phpmyadmin /var/www/</code></p><p>在浏览器访问树莓派ip地址检查是否成功。并检查phpmyadmin可以进否。</p><p>下面我开始研究GPIO口的配置。说出来又是一把心酸一把泪。</p><p><img src="http://imglf0.ph.126.net/d4xawoSjs6x4LCvm75neOw==/6630780793165104597.jpg" alt=""><br>上面是GPIO口的分布。</p><p>我在网上找了一下python的程序。</p><p>先要安装RPi.GPIO</p><p><a href="http://sourceforge.net/projects/raspberry-gpio-python/" target="_blank" rel="noopener">http://sourceforge.net/projects/raspberry-gpio-python/</a></p><p>从这上面下载</p><p>然后我是通过winscp把文件复制到板子里面去的。</p><p>后来发现<code>sudo apt-get install python-rpi.gpio</code>这个命令也可以安装</p><p>安装成功以后运行python</p><p>输入</p><pre><code>import RPi.GPIO as GPIO  </code></pre><p>注意RPi  i是小写的，白天就找了半天的错误。</p><p>没有错误的话就说明安装成功了。</p><p>然后就可以写个简单的程序。点亮一个流水灯。</p><p>开始在网上找的程序都不能用，我也恨郁闷啊。</p><p>因为</p><pre><code>GPIO.setmode(GPIO.BOARD)</code></pre><p>这句话报错。</p><p>后来想一想还是靠自己，于是我用python help  对RPi.GPIO的用法进行查看，发现这个函数都没有了。可能是因为硬件的更新吧。</p><p>于是我就注释了这条代码。</p><p>发现下面还有几条不能用。</p><p>这是多么的纠结啊。</p><p>所以我又继续改。</p><p>最后</p><pre><code>GPIO.setup(11, GPIO.OUT)  while True:      GPIO.output(11, 1)      time.sleep(1)      GPIO.output(11, 0)      time.sleep(1)</code></pre><p>这样写就没问题了，接在板子上的led灯也一秒一秒的闪烁了。</p><p>真是喜大普奔啊。啊哈哈<del>~</del>！</p><p>好吧就先写到这里。</p><p>其实我下午还弄了摄像头监控。</p><p>但是效果不太好。晚上如果还有时间的话我就继续写。</p><p>先吃个饭洗个澡去啦。</p><p>啦啦啦！！~</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;h6 id=&quot;买了一星期的树莓派今天终于有时间折腾了。&quot;&gt;&lt;a href=&quot;#买了一星期的树莓派今天终于有时间折腾了。&quot; class=&quot;headerlink&quot; title=&quot;买了一星期的树莓派今天终于有时间折腾了。&quot;&gt;&lt;/a&gt;买了一星期的树莓派今天终于有时间折腾了。&lt;/h6&gt;&lt;h6 id=&quot;早上一大早就起来，弄了一天。嘿嘿！&quot;&gt;&lt;a href=&quot;#早上一大早就起来，弄了一天。嘿嘿！&quot; class=&quot;headerlink&quot; title=&quot;早上一大早就起来，弄了一天。嘿嘿！&quot;&gt;&lt;/a&gt;早上一大早就起来，弄了一天。嘿嘿！&lt;/h6&gt;&lt;h6 id=&quot;昨天把系统下载下来了。&quot;&gt;&lt;a href=&quot;#昨天把系统下载下来了。&quot; class=&quot;headerlink&quot; title=&quot;昨天把系统下载下来了。&quot;&gt;&lt;/a&gt;昨天把系统下载下来了。&lt;/h6&gt;&lt;h6 id=&quot;树莓派官方-Raspbian-系统下载：http-www-raspberrypi-org-downloads&quot;&gt;&lt;a href=&quot;#树莓派官方-Raspbian-系统下载：http-www-raspberrypi-org-downloads&quot; class=&quot;headerlink&quot; title=&quot;树莓派官方 Raspbian 系统下载：http://www.raspberrypi.org/downloads&quot;&gt;&lt;/a&gt;树莓派官方 Raspbian 系统下载：&lt;a href=&quot;http://www.raspberrypi.org/downloads&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://www.raspberrypi.org/downloads&lt;/a&gt;&lt;/h6&gt;&lt;p&gt;首先开始烧系统到内存卡。用win32disk imager&lt;/p&gt;
    
    </summary>
    
    
      <category term="树莓派" scheme="http://rayuu.com/categories/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
    
    
      <category term="树莓派" scheme="http://rayuu.com/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
    
  </entry>
  
  <entry>
    <title>linux复习笔记（一）</title>
    <link href="http://rayuu.com/2015/03/22/2015-03-26-linux1/"/>
    <id>http://rayuu.com/2015/03/22/2015-03-26-linux1/</id>
    <published>2015-03-21T16:00:00.000Z</published>
    <updated>2016-05-28T08:21:24.124Z</updated>
    
    <content type="html"><![CDATA[<h6 id="从今天开始，准备复习一下一些以前学过的linux命令。"><a href="#从今天开始，准备复习一下一些以前学过的linux命令。" class="headerlink" title="从今天开始，准备复习一下一些以前学过的linux命令。"></a>从今天开始，准备复习一下一些以前学过的linux命令。</h6><h6 id="然后好进行后面的学习。"><a href="#然后好进行后面的学习。" class="headerlink" title="然后好进行后面的学习。"></a>然后好进行后面的学习。</h6><ul><li>——————————————-<br></li></ul><h6 id="首先我是在自己的电脑上面安装的虚拟机，因为方便用ssh远程登录。"><a href="#首先我是在自己的电脑上面安装的虚拟机，因为方便用ssh远程登录。" class="headerlink" title="首先我是在自己的电脑上面安装的虚拟机，因为方便用ssh远程登录。"></a>首先我是在自己的电脑上面安装的虚拟机，因为方便用ssh远程登录。</h6><h6 id="系统安装完成后-首先更新源。"><a href="#系统安装完成后-首先更新源。" class="headerlink" title="系统安装完成后,首先更新源。"></a>系统安装完成后,首先更新源。</h6><h6 id="吼吼吼！"><a href="#吼吼吼！" class="headerlink" title="吼吼吼！"></a>吼吼吼！</h6><a id="more"></a><pre><code>sudo apt-get update</code></pre><pre><code>su passwd root</code></pre><pre><code>su xcy</code></pre><p>然后是安装ssh<br></p><pre><code>sudo apt-get install openssh-server openssh -client</code></pre><p>安装完成服务端和客户端后，用电脑进行ssh远程登录。<br><br>连接成功。<br><br>回忆起来了一些命令。</p><pre><code>chmod 777 filename</code></pre><pre><code>groupadd testgroup</code></pre><pre><code>useradd test1 -g testgroup</code></pre><pre><code>adduser test2 -g testgroup   </code></pre><p>其中useradd新建用户在home目录下面没有文件夹，而adduser则有。<br><br>ps -e  查看进程<br><br>kill 3400杀死3400进程<br><br>kill -9 pid process<br><br>mkdir 目录名         =&gt; 创建一个目录<br><br>rmdir 空目录名      =&gt; 删除一个空目录<br><br>rm 文件名 文件名   =&gt; 删除一个文件或多个文件<br><br>rm –rf 非空目录名 =&gt; 删除一个非空目录下的一切<br><br>touch 文件名        =&gt; 创建一个空文件<br><br>重命名文件（夹） / 移动文件（夹）到指定文件夹<br><br>执行格式： mv source destination<br><br>mv file1 file2    =&gt; 将文件 file1，更改文件名为 file2。<br><br>mv file1 dir1    =&gt; 将文件 file1，移到目录 dir1下，文件名仍为 file1。<br><br>mv dir1 dir2    =&gt; 若目录 dir2 存在，则将目录 dir1，及其所有文件和子目录，移到<br>目录 dir2 下，新目录名称为 dir1。若目录 dir2 不存在，则将dir1，及其所有文件和<br>子目录，更改为目录 dir2。<br><br>今天就练到这里。明天继续！加油！<br></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;h6 id=&quot;从今天开始，准备复习一下一些以前学过的linux命令。&quot;&gt;&lt;a href=&quot;#从今天开始，准备复习一下一些以前学过的linux命令。&quot; class=&quot;headerlink&quot; title=&quot;从今天开始，准备复习一下一些以前学过的linux命令。&quot;&gt;&lt;/a&gt;从今天开始，准备复习一下一些以前学过的linux命令。&lt;/h6&gt;&lt;h6 id=&quot;然后好进行后面的学习。&quot;&gt;&lt;a href=&quot;#然后好进行后面的学习。&quot; class=&quot;headerlink&quot; title=&quot;然后好进行后面的学习。&quot;&gt;&lt;/a&gt;然后好进行后面的学习。&lt;/h6&gt;&lt;ul&gt;
&lt;li&gt;——————————————-&lt;br&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id=&quot;首先我是在自己的电脑上面安装的虚拟机，因为方便用ssh远程登录。&quot;&gt;&lt;a href=&quot;#首先我是在自己的电脑上面安装的虚拟机，因为方便用ssh远程登录。&quot; class=&quot;headerlink&quot; title=&quot;首先我是在自己的电脑上面安装的虚拟机，因为方便用ssh远程登录。&quot;&gt;&lt;/a&gt;首先我是在自己的电脑上面安装的虚拟机，因为方便用ssh远程登录。&lt;/h6&gt;&lt;h6 id=&quot;系统安装完成后-首先更新源。&quot;&gt;&lt;a href=&quot;#系统安装完成后-首先更新源。&quot; class=&quot;headerlink&quot; title=&quot;系统安装完成后,首先更新源。&quot;&gt;&lt;/a&gt;系统安装完成后,首先更新源。&lt;/h6&gt;&lt;h6 id=&quot;吼吼吼！&quot;&gt;&lt;a href=&quot;#吼吼吼！&quot; class=&quot;headerlink&quot; title=&quot;吼吼吼！&quot;&gt;&lt;/a&gt;吼吼吼！&lt;/h6&gt;
    
    </summary>
    
    
      <category term="linux" scheme="http://rayuu.com/categories/linux/"/>
    
    
      <category term="linux" scheme="http://rayuu.com/tags/linux/"/>
    
  </entry>
  
</feed>
