<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>MicroPython :: 标签 :: yafeng 的博客</title><link>http://yafengabc.github.io/tags/micropython/index.html</link><description/><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 19 Sep 2026 14:36:30 +0800</lastBuildDate><atom:link href="http://yafengabc.github.io/tags/micropython/index.xml" rel="self" type="application/rss+xml"/><item><title>INA226折腾笔记（二）</title><link>http://yafengabc.github.io/cnblogs/p18622825/index.html</link><pubDate>Mon, 23 Dec 2024 00:09:00 +0800</pubDate><guid>http://yafengabc.github.io/cnblogs/p18622825/index.html</guid><description>接上文，接个500欧的电阻作为负载：&#10;&gt;&gt;&gt; i2c.readfrom_mem(64,1,2).hex() '005a' &gt;&gt;&gt; int(0x5a) 90 按照模块上采样电阻0.01欧来算：&#10;90*81.92mV/32768=0.225mV&#10;0.225mV/0.01Ω=22.5mA&#10;但是，5V，500欧，应该是10mA，所以……&#10;电阻大了一倍有余，放大系数为2.25……&#10;电阻换成100欧&#10;&gt;&gt;&gt; i2c.readfrom_mem(64,1,2).hex() '01ba' &gt;&gt;&gt; int(0x1ba) 442 442*81.92mV/32768 = 1.105mV&#10;1.105/0.01 = 110.05mA&#10;实际应该是50ma，放大系数为2.21&#10;继续改变电阻，为200欧&#10;&gt;&gt;&gt; i2c.readfrom_mem(64,1,2).hex() '00dd' &gt;&gt;&gt; int(0xdd) 221 系数2.21&#10;改编为50欧：&#10;&gt;&gt;&gt; i2c.readfrom_mem(64,1,2).hex() '0367' &gt;&gt;&gt; int(0x367) 871 系数为2.177&#10;因为负载也有精度问题。经多次测量，系数大约2.2左右。&#10;所以程序如下：&#10;import micropython i2c = I2C(0, scl=Pin(8), sda=Pin(9), freq=1000000) i2c.writeto_mem(64,0,b"\x41\x27") @micropython.native def read_ina226(): while True: ret1 = i2c.readfrom_mem(64,1,2) ret2 = i2c.readfrom_mem(64,2,2) current = struct.unpack("&gt;h",ret1)[0]*0.113 voltage = struct.unpack("&gt;h",ret2)[0]*1.25/1000 print("voltage={0}V,current={1}mA,power={2}mW,R={3}".format(voltage,current,voltage*current,1000*voltage/current)) time.sleep(1) read_ina226() MPY: soft reboot&#10;voltage=5.07125V,current=25.086mA,power=127.2174mW,R=202.1546&#10;voltage=5.07125V,current=24.973mA,power=126.6443mW,R=203.0693&#10;voltage=5.07125V,current=24.973mA,power=126.6443mW,R=203.0693&#10;voltage=5.0725V,current=25.086mA,power=127.2487mW,R=202.2044&#10;voltage=5.07125V,current=24.973mA,power=126.6443mW,R=203.0693&#10;voltage=5.07125V,current=24.973mA,power=126.6443mW,R=203.0693&#10;voltage=5.07125V,current=24.973mA,power=126.6443mW,R=203.0693&#10;voltage=5.07125V,current=24.86mA,power=126.0713mW,R=203.9924&#10;voltage=5.07125V,current=24.86mA,power=126.0713mW,R=203.9924</description></item><item><title>INA226折腾笔记（一）</title><link>http://yafengabc.github.io/cnblogs/p18573281/index.html</link><pubDate>Sun, 22 Dec 2024 23:02:00 +0800</pubDate><guid>http://yafengabc.github.io/cnblogs/p18573281/index.html</guid><description>其实也算不上折腾，这个模块很简单就一个简单的I2C模块。随便搞个单片机就能读写，之所以玩这个，主要还是对手上的USB表不满意（换句话说就是达不到我的需求）&#10;我手上有几个USB表&#10;左边那个高仿版FNB58，右边那个是科维斯的CC表型号为KWS-1902C，平时就是测测手机充电功率之类的，也够用，FNB58还带了个客户端，如下图：&#10;平时用绝对够用了，并且精度还可以（特别小的负载下精度不是很理想）。&#10;最所以自己折腾INA226，主要是我最近玩耳机测小尾巴的功耗（20mw-1W）那两个U表精度不够，寨板FNB58精度还算可以，但是因为不是直通表，插上小尾巴（USB声卡）会有严重的噪音。另外一个CC表低功耗下（&lt;50mw）直接显示0，网上虽然有一堆堆的U表卖，但具体什么情况还未可知，所以嘛，自己动手搞起。&#10;淘宝上INA226的模块巨便宜，几块钱&#10;一共16块钱，为了标定板子，我还买了块电阻板，如下：&#10;然后画了块电路板，去淘宝5块钱打印了5块，最后一顿焊，成品如下：&#10;INA226买的时候，注意那个采样电阻，上边两个板子一个是R100（0.1欧），一个是R010（0.01欧），理论上说，这个电阻越大，精度越高，代价就是量程变小。INA226通过测量电阻两边的电压来测量电流。最大电压是81.92mv，所以可以简单地通过电压/电阻来确定最大量程，0.08192/0.1=0.8192A 0.08192/0.01=8.192A。也就是这两个板子一个量程是0.8A，一个是8A。&#10;但是我上边的板子设计失误了，为啥呢？可以看到我的红圈处的那两个接线柱是没有供电的。&#10;我一开始的想法是：反正我也不测量大电流，所以没必要从这两个点取电，所以就从右上角的IN+ IN-代替了这两个大焊盘。但是我忽略了电路也是有电阻的！因为电路板的铜层很薄，电阻相对0.01欧来说不可忽略。&#10;结果就是导致：采样电阻阻值改变了。0.1欧版本还好，0.01欧版本直接量程减半（标定为0.0226欧左右）所以我现在这两个板子，一个量程是0.73A，一个是3.6A左右（虽然变相提高了精度）。&#10;关于INA226的寄存器：&#10;寄存器0 配置寄存器，默认1次采样，采样周期1.1ms，连续采样（0x4127）。通常情况下，这个配置已经可以用了&#10;寄存器1 采样电压，也就是采样电阻两端的电压，电阻足够精确的话，这个值*0.08192/采样电阻/32768就是电流值了。&#10;寄存器2 VBUS电压，也就是电源电压，比如5V，10V，读出值*0.0025就是电压。&#10;寄存器3 功率，如果标定寄存器不设置，这个值默认是0</description></item><item><title>Arduino UNO ESP8266 ESP32 MicroBit IO操作速度对比记录</title><link>http://yafengabc.github.io/cnblogs/p11197001/index.html</link><pubDate>Tue, 16 Jul 2019 19:32:00 +0800</pubDate><guid>http://yafengabc.github.io/cnblogs/p11197001/index.html</guid><description>ESP8266 Arduino C编程&#10;void setup(){ pinMode(13, OUTPUT); } void loop(){ digitalWrite(13,HIGH); digitalWrite(13,LOW); digitalWrite(13,HIGH); digitalWrite(13,LOW); } 可以看到，相邻的两次digitalWrite之间是958ns(纳秒)，而两次loop之间是6.6us(微秒)，速度还是很快的，而Arduino UNO得到了如下结果：&#10;可以看到无论是loop内的，还是loop之间的间隔，都是接近的，都在3.25-3.7之间，速度比ESP8266慢几倍的水平（考虑到时序都是在loop内完成）&#10;下边是同样的代码ESP32得到的结果&#10;相比ESP8266，还是有很大进步的（综合估计得有10倍）&#10;下边是Micropython的：&#10;import machine pin13 = machine.Pin(13, machine.Pin.OUT) while True: pin13.value(1) pin13.value(0) pin13.value(1) pin13.value(0) 先上ESP32的：&#10;嗯，Arduino水平。&#10;再看ESP8266：</description></item><item><title>MicroPython与Python速度对比</title><link>http://yafengabc.github.io/cnblogs/p9034158/index.html</link><pubDate>Mon, 14 May 2018 08:33:00 +0800</pubDate><guid>http://yafengabc.github.io/cnblogs/p9034158/index.html</guid><description>首先说明，micropython跟python是没有任何可比性的，python作为一种通用的语言，在扩展性上不是micropython能比的，比如大量的库，可以方便的用C语言加模块提升速度，有pypy这样的带JIT的解释器，micropython是适合于单片机的系统虽然可以用C写lib，但是需要重新编译整个固件，此外，micropython也缺乏加载本地代码的功能，比如加载C便宜的so库。所以不要试图用micropython代替python，这不是一个好主意，除非micropython支持的库满足你的使用了。&#10;这篇文章主要是简单的对比这两个不同的实现的性能有何差别。&#10;测试代码有两个，一个是一个大循环，一个是递归计算斐波那契数列，例子比较简单，代码如下：&#10;try: import utime as time except: import time def bigloop(): s=0 for i in range(1000000000): s+=i def fib(n): if n==0: return 0 if n==1: return 1 return fib(n-1)+fib(n-2) t=time.time() bigloop() print("bigloop time:",time.time()-t) t=time.time() print("The 40th fibric is:",fib(40)) print("fibn time:",time.time()-t) 结果如下：&#10;[yafeng@ArchV ~]$ python micromark.py bigloop time: 60.44254755973816 The 40th fibric is: 102334155 fibn time: 48.39746880531311 [yafeng@ArchV ~]$ micropython micromark.py bigloop time: 51.92846608161926 The 40th fibric is: 102334155 fibn time: 65.70703196525574 可以看到，效率基本是一样的，循环micropython稍快一点，递归cpython稍快一点，顺便贴一下pypy pypy3的结果： [yafeng@ArchV ~]$ pypy micromark.py ('bigloop time:', 1.7053859233856201) ('The 40th fibric is:', 102334155) ('fibn time:', 7.795623064041138) [yafeng@ArchV ~]$ pypy3 micromark.py bigloop time: 1.2033970355987549 The 40th fibric is: 102334155 fibn time: 7.820451974868774 可以看到，pypy速都还是很明显的，喜闻乐见的是，pypy3甚至超过了pypy。</description></item><item><title>MicroPython入坑记(四)利用MQTT实现0编程远程控制（下）（用安卓手机）</title><link>http://yafengabc.github.io/cnblogs/p8685028/index.html</link><pubDate>Sun, 01 Apr 2018 01:02:00 +0800</pubDate><guid>http://yafengabc.github.io/cnblogs/p8685028/index.html</guid><description>先介绍下这个APP（ioT MQTT Panel）怎么用：&#10;安装我就不怎么说了，安装完打开软件是这个样子的：&#10;提示没有连接，点那个红色按钮创建一个连接：&#10;前两项都是随便填的，值得注意的的是那个Broker Web/IP Address，这个最好自己架个服务器，而不是用我填的这个测试用服务器，当然这里做个例子，先用这个凑数了，填完后点那个CREATE：&#10;可以看到名为”测试连接“的项目建成了。然后点近去：&#10;这理解释下：Topic可以理解为一个通道，比如开关，按下后会往ledctl这个通道里发ledon这个信息，再按一下会往ledctl通道里发ledoff这个信息，最终界面如下：&#10;下面，我们在MicroPython里边编写一点程序，用来接收这个界面发出的消息：&#10;首先，下载micropython的MQTT库：&#10;https://github.com/micropython/micropython-lib&#10;下找到：umqtt.simple&#10;这个目录下有几个例子，以及一个umqtt的目录(里边的simple.py就是库了)</description></item><item><title>MicroPython入坑记(四)利用MQTT实现0编程远程控制（上）（用安卓手机）</title><link>http://yafengabc.github.io/cnblogs/p8684755/index.html</link><pubDate>Sat, 31 Mar 2018 23:33:00 +0800</pubDate><guid>http://yafengabc.github.io/cnblogs/p8684755/index.html</guid><description>其实你被标题党骗了，0编程那是不可能的(￣▽￣)"&#10;不过也算近似零编程了哈哈&#10;MQTT我就不详细介绍了，毕竟看到这个标题进来的一般也就有些基础知识了。简单说说：&#10;MQTT是IBM发布的一个物联网协议，怎么说呢，微信大家都知道，微信是大家互相联系用的，MQTT其实就类似一个物联网的微信，各个设备间可以通过MQTT来沟通信息。&#10;其实设备间联系的协议有很多，比如TCP/UDP，HTTP等。MQTT作为很晚才出现的后辈，当然是解决以前协议的痛点的。&#10;1.TCP/UDP（SOCKET通讯）这个是物联网甚至是互联网的基础。在应用层面，这算底层了，优点当然是灵活，其实灵活，往往就意味着难用（比如C++就很灵活）你如果想开发一个基于TCP通讯，你需要考虑通讯的方方面面，比如断线重连，比如心跳包，比如加密传输，这些都得自己来实现，可能会占用你大量的调优时间。&#10;2.HTTP，HTTP协议大家都知道是网页传输协议，其实网页传输是HTTP的一种应用而已，HTTP属于对TCP的高层封装，是一种短链接协议，可用于设备间连接。基于HTTP协议的连接方式又有个名字叫RESTful，这个编程就简单了，因为短链接么，就不用考虑啥断线重连之类的了，并且python有urllib，requsets等库，通讯就是一句代码的事，简单至极，但也有缺点:包头太长，每次通讯都要重新连接一次。如果几秒或者几分钟以上通讯一次还差不多，如果太过频繁，不但浪费资源，也太占带宽。&#10;MQTT完美解决了上边这些协议的痛点，并且由于是个标准，现在各种语言，乃至安卓、IOS上都有现成的客户端，特别适合我这种懒得开发JAVA APP的懒人。这里介绍一个好用的安卓APP：ioT MQTT Panel，装了这个APP，设置一下，就能通过MQTT控制设备了，下边是我随便做了个界面：&#10;怎么样？是不是有点意思，值得说的是: 这是完全不需要编写代码的装上这个APP，设置一下就可以了，嗯这是跟我的树莓派连接的：&#10;树莓派上我接了一个继电器，一个超声波测距仪，手机客户端则是实时显示树莓派CPU温度、超声波测距的距离，以及控制继电器吸合、断开。&#10;下一篇，我会实战介绍下用这个APP控制ESP8266（nodemcu）来实现无线控制LED灯的亮灭。</description></item><item><title>MicroPython入坑记（四）关于MicroPython的代码保护</title><link>http://yafengabc.github.io/cnblogs/p8682910/index.html</link><pubDate>Sat, 31 Mar 2018 16:47:00 +0800</pubDate><guid>http://yafengabc.github.io/cnblogs/p8682910/index.html</guid><description>脚本开发东西，可能面临的第一个问题就是：拷给别人，代码怎么写的他不就都知道了？不行，我要保住我的小秘密！&#10;先说下结果：没有攻不破的堡垒，即使你写成C语言，只要能拿到二进制结果，都可以反汇编逆向出你是怎么实现的，关键是值不值得&#10;另外，这跟逆向者对系统的了解程度有关，比如对方连代码都不会上传，那你即使把源文件放进去也他也无可奈何。&#10;好了，言归正传，我们知道普通python有个编译成字节码的功能，也就是源代码会在解释时先编译成一个类似java中间代码的结果，这是不可读的（但是这也不排除反编译的可能，毕竟JAVA的class文件是有反编译软件的）。&#10;micropython也有这个功能，不过这个文件的扩展名是mpy，也不能在运行时自动生成，需要一款软件：mpy-cross.exe，这是micropython官方提供的，可以用python pip直接安装，安装完成后，可以运行mpy-cross.exe pythonfile,py，就可以生成一个pythonfile.mpy的字节码文件，这文件使用跟py文件是等效的。把所有文件生成mpy，可以在一定程度上保护你的代码。&#10;更进一步的方式：把mpy文件藏到固件中去，这不光能保护代码，还能降低程序的内存占用，官方的描述如下：&#10;Cross-installing packages with freezing For the low-memory MicroPython ports, the process described in the previous section does not provide the most efficient resource usage,because the packages are installed in the source form, so need to be compiled to the bytecome on each import. This compilation requires RAM, and the resulting bytecode is also stored in RAM, reducing its amount available for storing application data. Moreover, the process above requires presence of the filesystem on a device, and the most resource-constrained devices may not even have it.</description></item><item><title>MicroPython入坑记（三）板子上的Python到底有多快？</title><link>http://yafengabc.github.io/cnblogs/p8681713/index.html</link><pubDate>Sat, 31 Mar 2018 12:26:00 +0800</pubDate><guid>http://yafengabc.github.io/cnblogs/p8681713/index.html</guid><description>前几篇都是直接在命令上操作，然而执行py文件才是王道，其实类似nodemcu的lua固件，MicroPython也提供了一个简单的文件系统用来存代码。并自动在开机时执行：&#10;boot.py&#10;main,py&#10;两个文件&#10;windows用户的话，推荐一个软件：uPyLoader界面如下&#10;可以看到，左边是本地的文件，右边是ESP8266的文件，两边可以互相传输，也可以删除上边的文件，其他功能自行探索，这个软件自带了一个编辑器，不过很弱。&#10;还是推荐用vim或者vscode来写代码，然后用这个软件把代码传进去。&#10;测试代码么，先来个循环：&#10;import time import micropython def loop1(): t1=t2=0 for i in range(5): t1=time.ticks_us() for i in range(100): pass t2=time.ticks_us() print(t2-t1) time.sleep(2) loop1() 默认工作在80MHZ下，结果是：&#10;=== with open("test_loop.py") as f: === exec(f.read(), globals()) === 4715 4695 4742 4698 4697 &gt;&gt;&gt; 脚本确实不快，100次循环足足用了4.5ms，即使把速度调成160MHZ，也就2.5ms左右也就一次循环25us左右，而ESP32下速度就很赞了：&#10;paste mode; Ctrl-C to cancel, Ctrl-D to finish === with open("test_loop.py") as f: === exec(f.read(), globals()) === 346 262 274 267 278 &gt;&gt;&gt; 10多倍的提速2us-3us循环一次，甚至可以写dht11那样的时序驱动了。esp8266就没办法了吗？当然有!&#10;MicroPython官方文档上专门有篇代码提速的文章，其中提到了可以用装饰器micropython.native micropython.viper来给代码打鸡血（编译成机器码）&#10;import time import micropython @micropython.native def loop1(): t1=t2=0 for i in range(5): t1=time.ticks_us() for i in range(100): pass t2=time.ticks_us() print(t2-t1) time.sleep(2) loop1() 加了个@micropython.native装饰器，速度立马鸡血：</description></item><item><title>MicroPython入坑记（二）刷固件（ESP8266 ESP32）</title><link>http://yafengabc.github.io/cnblogs/p8681380/index.html</link><pubDate>Sat, 31 Mar 2018 11:13:00 +0800</pubDate><guid>http://yafengabc.github.io/cnblogs/p8681380/index.html</guid><description>先来个刷写过程：&#10;其实各种刷ESP8266/ESP32的软件都可以搞（比如刷NodeMCU的软件），不过我这还是出问题了：刷完后无限输出乱码。然后参照Micropython官方的教程，用esptool先清除所有的FLASH，然后重新刷入，正常运行：&#10;pip install esptool 安装esptool（当然，电脑上要先装好python） esptool.py --port /dev/ttyUSB0 erase_flash 擦除所有的flash，如果是windows系统，则改为具体的COM口，比如我的电脑是COM4： esptool.py --port COM4 erase_flash刷入固件这个命令比较长，可以不熟悉命令行的可以用其他GUI软件代替： esptool.py --port COM4 --baud 460800 write_flash --flash_size=detect 0 esp8266.bin（这个改为具体固件文件名） 刷完后，用putty连接板子会出现以下界面（如果没有显示就先按一下RST键）： 现在就可以执行Python代码了，支持命令补全哦列出所有的模块：继续探索：在ESP8266上，跟板子相关的代码主要在esp machine两个模块上： import esp&#10;import machine&#10;dir(esp)&#10;[’__class__’, ‘__name__’, ‘SLEEP_LIGHT’, ‘SLEEP_MODEM’, ‘SLEEP_NONE’, ‘apa102_write’, ‘check_fw’, ‘deepsleep’, ‘dht_readinto’, ’esf_free_bufs’, ‘flash_erase’, ‘flash_id’, ‘flash_read’, ‘flash_size’, ‘flash_user_start’, ‘flash_write’, ‘free’, ‘freemem’, ‘info’, ‘malloc’, ‘meminfo’, ’neopixel_write’, ‘osdebug’, ‘set_native_code_location’, ‘sleep_type’]&#10;dir(machine)&#10;[’__class__’, ‘__name__’, ‘ADC’, ‘DEEPSLEEP’, ‘DEEPSLEEP_RESET’, ‘HARD_RESET’, ‘I2C’, ‘PWM’, ‘PWRON_RESET’, ‘Pin’, ‘RTC’, ‘SOFT_RESET’, ‘SPI’, ‘Signal’, ‘Timer’, ‘UART’, ‘WDT’, ‘WDT_RESET’, ‘deepsleep’, ‘disable_irq’, ’enable_irq’, ‘freq’, ‘idle’, ‘mem16’, ‘mem32’, ‘mem8’, ‘reset’, ‘reset_cause’, ‘sleep’, ’time_pulse_us’, ‘unique_id’]</description></item><item><title>MicroPython入坑记（一）（ESP8266 ESP32）</title><link>http://yafengabc.github.io/cnblogs/p8680938/index.html</link><pubDate>Sat, 31 Mar 2018 08:55:00 +0800</pubDate><guid>http://yafengabc.github.io/cnblogs/p8680938/index.html</guid><description>手上有块基于ESP8266的NodeMCU板子，没错，就是那个10块钱的带WIFI的芯片，当时感觉又便宜又又有wifi，并且可以用脚本lua写代码，果断买买买，然后玩了一下WIFI跟树莓派通讯（树莓派开Http Server，然后用lua通过socket模拟http指令定期获取树莓派的指令）。控制了个继电器加灯泡玩了玩，手头上的dht11也能直接读出来（nodemcu内置驱动了），然后就没有然后了，感觉lua不是我的菜，用惯了python，写lua还是十分别扭的.嗯对lua的吐槽开始：&#10;1.没有高层次的封装，缺少轮子，虽然有cjson，socket等可用，然而没有httpclient之类更高层次的封装，搞个rest 请求还得自己写http头，虽然也不麻烦，然而用惯了urllib的python用户自然不是很爽。lua本身是作为C的嵌语言设计的，所以基本库太有限，虽然网上配合lua的C库众多，然而想搞进nodemcu的固件里，我这半吊子水平还是有难度的，一句话就是nodemcu提供的功能，可以很好的搞，没提供的功能干瞪眼。&#10;2.一些语法上的吐槽，比如默认全局变量，局部变量要加local之类的，年代久远，记不清了总之用惯了python习惯了优雅的设计，就不习惯丑陋了（引战了引战了）&#10;3.固件开发不活跃，现在github上的代码基本都是几年前的了，虽然最新的2.1.0发布于2017年8月，看看changelog，其实就是一个18B20驱动的重写，没有什么大改进。这也是国人类似项目的一贯作风：为了卖板子然后找个大神移植下固件，然后能把东西卖出去就OK了，至于固件的演进，看大神的的心情了……&#10;4.nodemcu只能用在esp8266上，当然esp32也可以跑了，然而也就这样了，参照上边那条，开发不活跃啊，不像micropython或者espruino（一个跑在单片机的javascript固件），官方就支持好多的MCU&#10;所以后来有了Arduino for ESP8266，就用Arduino IDE耍去了，那个支持的MCU多(lll￢ω￢)，以前其实也知道有MicroPython，但大神说因为8266资源有限，被裁减的太厉害（其实当然完全不是那么回事）啥也干不了，不如等ESP32（然后我就真等ESP32了）。&#10;经过漫长的等待，ESP32的板子终于价格降到心理价位，然后果断入坑，当然是刷MicroPython了，然后为了对比，顺便把手上的8266也刷上了MicroPython固件，搞起来，先看可用内存：&#10;ESP8266：&#10;micropython.mem_info()&#10;stack: 2112 out of 8192&#10;GC: total: 35968, used: 9376, free: 26592&#10;No. of 1-blocks: 50, 2-blocks: 10, max blk sz: 264, max free sz: 1261&#10;嗯，8K的的栈，36K的堆确实小了些，然而……esp32也好不到哪儿去&#10;micropython.mem_info()&#10;stack: 736 out of 15360&#10;GC: total: 111168, used: 6864, free: 104304&#10;No. of 1-blocks: 26, 2-blocks: 8, max blk sz: 264, max free sz: 6402&#10;纳尼？说好的400+Kb的内存呢，怎么只有110K左右？（虽然比8266是好多了）&#10;经过探索gayhub上的代码，终于明白了原因：</description></item></channel></rss>