• 【移远QuecPython】EC800M物联网开发板的硬件PWM和PWM输出BUG


    【移远QuecPython】EC800M物联网开发板的硬件PWM和PWM输出BUG

    导入库

    from misc import PWM_V2
    
    • 1

    或者

    from misc import PWM
    
    • 1

    但我觉得PWM_V2好用

    初始化PWM

    misc.PWM_V2
    
    • 1
    class misc.PWM_V2(PWM_V2.PWMn,frequency, duty)
    
    • 1

    参数描述:

    PWM_V2.PWMn-PWM通道,int类型,点此查看支持的通道与对应引脚;
    frequency,频率,float类型,注意要输入浮点数据:100.0表示100Hz;
    duty,占空比,int类型,输入范围0~100,输入50代表占空比50%。
    EC600U/EC200U/EG912U/EG915U不支持占空比设置为0。

    from misc import PWM_V2
    pwm1 = PWM_V2(PWM_V2.PWM1, 100.0, 50)#频率100Hz,占空比50%
    
    • 1
    • 2

    开启PWM

    PWM_V2.open([frequency],[duty])
    
    • 1

    该方法用于开启PWM输出,frequency,duty为可缺省参数,只允许参数都缺省或传入2个参数;若缺省,按照初始化时的参数输出;若传参,按照传入的参数输出。

    参数描述:

    参照构造函数说明。
    返回值描述:

    0表示开启成功,-1表示开启失败。

    PWM硬件BUG

    PWM的IO口驱动能力只有180mV
    在这里插入图片描述
    但是GPIO正常 所以不建议用 除非自己加外部上下拉
    应该是PWM写成开漏输出了

    硬件BUG复现原因

    1. 开启GNSS 调用GNSS init函数
    2. 插上GNSS接收天线
    3. 开启PWM
      必须要满足以上几点 才会导致180mV 跟之前的BUG一样与GNSS有关
      【移远QuecPython】EC800M物联网开发板的内置GNSS定位的恶性BUG(目前没有完全的解决方案)

    附录:列表的赋值类型和py打包

    列表赋值

    BUG复现

    闲来无事写了个小程序 代码如下:

    # -*- coding: utf-8 -*-
    """
    Created on Fri Nov 19 19:47:01 2021
    
    @author: 16016
    """
    
    a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
    #print(len(a_list))
    #b_list = ['','','','','','','','','','','','','','','','']
    c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
    #for i in range(16):
    if len(a_list):
        for j in range(16):
            a_list[j]=str(a_list[j])+'_'+str(j)
            print("序号:",j)
            print('a_list:\n',a_list)
            
            
            c_list[j]=a_list
            print('c_list[0]:\n',c_list[0])
            print('\n')
    #        b_list[j]=a_list[7],a_list[8]
    #        print(b_list[j])
            # 写入到Excel:
    #print(c_list,'\n')    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    我在程序中 做了一个16次的for循环 把列表a的每个值后面依次加上"_"和循环序号
    比如循环第x次 就是把第x位加上_x 这一位变成x_x 我在输出测试中 列表a的每一次输出也是对的
    循环16次后列表a应该变成[‘0_0’, ‘1_1’, ‘2_2’, ‘3_3’, ‘4_4’, ‘5_5’, ‘6_6’, ‘7_7’, ‘8_8’, ‘9_9’, ‘10_10’, ‘11_11’, ‘12_12’, ‘13_13’, ‘14_14’, ‘15_15’] 这也是对的

    同时 我将每一次循环时列表a的值 写入到空列表c中 比如第x次循环 就是把更改以后的列表a的值 写入到列表c的第x位
    第0次循环后 c[0]的值应该是[‘0_0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘10’, ‘11’, ‘12’, ‘13’, ‘14’, ‘15’] 这也是对的
    但是在第1次循环以后 c[0]的值就一直在变 变成了c[x]的值
    相当于把c_list[0]变成了c_list[1]…以此类推 最后得出的列表c的值也是每一项完全一样
    我不明白这是怎么回事
    我的c[0]只在第0次循环时被赋值了 但是后面它的值跟着在改变

    如图:
    在这里插入图片描述
    第一次老出bug 赋值以后 每次循环都改变c[0]的值 搞了半天都没搞出来
    无论是用appen函数添加 还是用二维数组定义 或者增加第三个空数组来过渡 都无法解决

    代码改进

    后来在我华科同学的指导下 突然想到赋值可以赋的是个地址 地址里面的值一直变化 导致赋值也一直变化 于是用第二张图的循环套循环深度复制实现了

    代码如下:

    # -*- coding: utf-8 -*-
    """
    Created on Fri Nov 19 19:47:01 2021
    
    @author: 16016
    """
    
    a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
    #print(len(a_list))
    #b_list = ['','','','','','','','','','','','','','','','']
    c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
    #for i in range(16):
    if len(a_list):
        for j in range(16):
            a_list[j]=str(a_list[j])+'_'+str(j)
            print("序号:",j)
            print('a_list:\n',a_list)
            
            
            for i in range(16):
                c_list[j].append(a_list[i])
            print('c_list[0]:\n',c_list[0])
            print('\n')
    #        b_list[j]=a_list[7],a_list[8]
    #        print(b_list[j])
            # 写入到Excel:
    print(c_list,'\n')    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    解决了问题

    在这里插入图片描述

    优化

    第三次是请教了老师 用copy函数来赋真值

    代码如下:

    # -*- coding: utf-8 -*-
    """
    Created on Fri Nov 19 19:47:01 2021
    
    @author: 16016
    """
    
    a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
    #print(len(a_list))
    #b_list = ['','','','','','','','','','','','','','','','']
    c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
    #for i in range(16):
    if len(a_list):
        for j in range(16):
            a_list[j]=str(a_list[j])+'_'+str(j)
            print("序号:",j)
            print('a_list:\n',a_list)
            
            
            c_list[j]=a_list.copy()
            print('c_list[0]:\n',c_list[0])
            print('\n')
    #        b_list[j]=a_list[7],a_list[8]
    #        print(b_list[j])
            # 写入到Excel:
    #print(c_list,'\n')    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    同样能解决问题
    在这里插入图片描述
    最后得出问题 就是指针惹的祸!

    a_list指向的是个地址 而不是值 a_list[i]指向的才是单个的值 copy()函数也是复制值而不是地址

    如果这个用C语言来写 就直观一些了 难怪C语言是基础 光学Python不学C 遇到这样的问题就解决不了

    C语言yyds Python是什么垃圾弱智语言

    总结

    由于Python无法单独定义一个值为指针或者独立的值 所以只能用列表来传送
    只要赋值是指向一个列表整体的 那么就是指向的一个指针内存地址 解决方法只有一个 那就是将每个值深度复制赋值(子列表内的元素提取出来重新依次连接) 或者用copy函数单独赋值

    如图测试:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    部分代码:

    # -*- coding: utf-8 -*-
    """
    Created on Sat Nov 20 16:45:48 2021
    
    @author: 16016
    """
    
    def text1():
        A=[1,2,3]
        B=[[],[],[]]
        for i in range(len(A)):
            A[i]=A[i]+i
            B[i]=A
            print(B)
    
    def text2():
        A=[1,2,3]
        B=[[],[],[]]
        
        A[0]=A[0]+0
        B[0]=A
        print(B)
        A[1]=A[1]+1
        B[1]=A
        print(B)
        A[2]=A[2]+2
        B[2]=A
        print(B)
        
    if __name__ == '__main__':
        text1()
        print('\n')
        text2()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    py打包

    Pyinstaller打包exe(包括打包资源文件 绝不出错版)

    依赖包及其对应的版本号

    PyQt5 5.10.1
    PyQt5-Qt5 5.15.2
    PyQt5-sip 12.9.0

    pyinstaller 4.5.1
    pyinstaller-hooks-contrib 2021.3

    Pyinstaller -F setup.py 打包exe

    Pyinstaller -F -w setup.py 不带控制台的打包

    Pyinstaller -F -i xx.ico setup.py 打包指定exe图标打包

    打包exe参数说明:

    -F:打包后只生成单个exe格式文件;

    -D:默认选项,创建一个目录,包含exe文件以及大量依赖文件;

    -c:默认选项,使用控制台(就是类似cmd的黑框);

    -w:不使用控制台;

    -p:添加搜索路径,让其找到对应的库;

    -i:改变生成程序的icon图标。

    如果要打包资源文件
    则需要对代码中的路径进行转换处理
    另外要注意的是 如果要打包资源文件 则py程序里面的路径要从./xxx/yy换成xxx/yy 并且进行路径转换
    但如果不打包资源文件的话 最好路径还是用作./xxx/yy 并且不进行路径转换

    def get_resource_path(relative_path):
        if hasattr(sys, '_MEIPASS'):
            return os.path.join(sys._MEIPASS, relative_path)
        return os.path.join(os.path.abspath("."), relative_path)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    而后再spec文件中的datas部分加入目录
    如:

    a = Analysis(['cxk.py'],
                 pathex=['D:\\Python Test\\cxk'],
                 binaries=[],
                 datas=[('root','root')],
                 hiddenimports=[],
                 hookspath=[],
                 hooksconfig={},
                 runtime_hooks=[],
                 excludes=[],
                 win_no_prefer_redirects=False,
                 win_private_assemblies=False,
                 cipher=block_cipher,
                 noarchive=False)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    而后直接Pyinstaller -F setup.spec即可

    如果打包的文件过大则更改spec文件中的excludes 把不需要的库写进去(但是已经在环境中安装了的)就行

    这些不要了的库在上一次编译时的shell里面输出
    比如:
    在这里插入图片描述

    在这里插入图片描述
    然后用pyinstaller --clean -F 某某.spec

  • 相关阅读:
    多任务爬虫(多线程和多进程)
    使用Handsontable展示表格数据
    java学习第177天,javaWeb学习第36天,p248-255(07/30)
    想升级Mac新版本,无奈内存空间不够该怎么办?
    MySql ocp认证之主从复制(三)
    记录一次用Navicat的保存表结构的sql文件的功能,运行后造成整个表数据丢失
    vue - vue基础/vue核心内容(2)
    图解|勒索软件防范指南
    MyBatis的缓存机制(包含一级缓存和二级缓存等所有配置)
    2022年《财富》世界500强企业
  • 原文地址:https://blog.csdn.net/weixin_53403301/article/details/134235451