| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- #!/usr/bin/python3
- # -*- coding: UTF-8 -*-
- import os
- import sys
- import platform
- import multiprocessing
- import serial
- import time
- import traceback
- from tools.Download import build
- def usage():
- print('''
- ZeusOS版本SDK的编译命令如下:
- python zos.py [action]
- <-menu> 功能描述: 开启图形化代码裁剪功能
- <-dl> 功能描述: 往UE下载程序
- 参数: <PortNo.>: 串口号(例如com4)
- <-s> 功能描述: 拆分文件
- 示例1, 开启图形化代码裁剪功能
- python zos.py -menu
- 示例2, 下载固件到模组
- python zos.py -dl com3
- 示例3, 拆分固件
- python zos.py -s
-
- ''')
- def enter_download_mode(com):
- print(com)
- dev = serial.Serial(com, 9600,timeout=1, parity=serial.PARITY_NONE, stopbits=1)
- if dev.isOpen(): # 判断串口是否打开
- print("open success")
- else :
- dev.open()
- dev.write('AT\r\n'.encode("utf8"))
- data = dev.read(50)
- time.sleep(1)
- dev.write('AT\r\n'.encode("utf8"))
- data = dev.read(50)
- if ( "OK" in str(data)):
- print("当前是AT固件\r\n")
- dev.write('AT+NV=SET,STANDBY,0\r\n'.encode("utf8"))
- time.sleep(2)
- dev.write('AT+NV=SET,WDT,0\r\n'.encode("utf8"))
- time.sleep(2)
- dev.write('AT+FORCEDL\r\n'.encode("utf8"))
- time.sleep(2)
- data = dev.read(4)
- print(data)
- else :
- dev.baudrate = 115200
- dev.write('AT\r\n'.encode("utf8"))
- data = dev.read(50)
- dev.write('enter_download_mode\r\n'.encode("utf8"))
- data = dev.read(50)
- if ( "OK" in str(data)):
- print("当前已经进入二次开发模式,即将下载固件\r\n")
- else :
- print("设备连接失败\r\n")
- dev.close()
- time.sleep(3)
- def run_menuconfig():
- """运行菜单配置并捕获可能的异常"""
- try:
- menu_cmd = "python ./../../tools/config/menuconfig.py"
- os_ver = platform.system()
-
- if os_ver == "Windows":
- # Windows下直接运行,不使用start命令,以便捕获输出
- result = os.system(menu_cmd)
- if result != 0:
- raise Exception(f"菜单配置命令返回非零状态: {result}")
- else:
- # Linux/Mac使用subprocess代替os.system以便获取输出
- import subprocess
- result = subprocess.run(menu_cmd, shell=True, capture_output=True, text=True)
- if result.returncode != 0:
- print("标准输出:", result.stdout)
- print("错误输出:", result.stderr)
- raise Exception(f"菜单配置命令失败,返回代码: {result.returncode}")
- except Exception as e:
- print(f"\n执行菜单配置时发生错误: {str(e)}")
- traceback.print_exc() # 打印完整的错误堆栈
- input("\n按回车键退出...") # 确保用户能看到错误信息
- def main():
- argc = 1
- test_list = ['-menu','-b','-c','-m','-mdl','-dl','-s','-h']
- os_ver = platform.system()
-
- while len(sys.argv) > argc:
- if sys.argv[argc] == "-menu":
- print("Zeusos menuconfig 配置已开启")
- if os_ver == "Windows":
- print("如果在windows下看不到图形化配置界面,请使用调用以下命令安装python包:")
- print("pip install windows-curses ")
-
- # 使用新的函数运行菜单配置并处理错误
- run_menuconfig()
-
- elif sys.argv[argc] == '-m':
- if len(sys.argv) > argc+1:
- if sys.argv[argc+1] in test_list:
- passward = ''
- else :
- passward = sys.argv[argc+1]
- argc +=1
- else :
- passward = ''
- print(passward)
- build.do_pack(passward)
- print('\r\n固件合并完成,现在可以执行以下命令进行下载固件了.')
- print('\r\n当前程序为AT固件或者shell命令可以正常运行,请使用 python zos.py -dl com3 进行下载')
- print('\r\n如果程序处于死机状态请按住boot按键后再上电,然后使用 python zos.py -mdl com3 进行下载')
- elif sys.argv[argc] == '-mdl':
- cmd_list = []
- if len(sys.argv) > argc+1:
- if sys.argv[argc+1] in test_list:
- print("执行下载命令,需要输入串口信息。")
- print("例如:python zos.py -dl com3")
- return
- else :
- cmd_list.append(sys.argv[argc+1])
- if len(sys.argv) > argc+2:
- if sys.argv[argc+2] not in test_list:
- cmd_list.append(sys.argv[argc+2])
- build.do_download(cmd_list)
- argc +=1
- else :
- print("执行下载命令,需要输入串口信息。")
- print("例如:python zos.py -dl com3")
- return
- elif sys.argv[argc] == '-dl':
- cmd_list = []
- if len(sys.argv) > argc+1:
- if sys.argv[argc+1] in test_list:
- print("执行下载命令,需要输入串口信息。")
- print("例如:python zos.py -dl com3")
- return
- else :
- cmd_list.append(sys.argv[argc+1])
- if len(sys.argv) > argc+2:
- if sys.argv[argc+2] not in test_list:
- cmd_list.append(sys.argv[argc+2])
- enter_download_mode(cmd_list[0])
- build.do_download(cmd_list)
- argc +=1
- else :
- print("执行下载命令,需要输入串口信息。")
- print("例如:python zos.py -dl com3")
- return
- elif sys.argv[argc] == '-s':
-
- if len(sys.argv) > argc+1:
- if sys.argv[argc+1] in test_list:
- passward = ''
- else :
- passward = sys.argv[argc+1]
- argc +=1
- else :
- passward = ''
- print(passward)
- build.do_unpack(passward)
- print('\r\n固件拆分完成')
- elif sys.argv[argc] == '-h':
- usage()
- else :
- usage()
- argc += 1
- print("***********************************************************************")
-
- # 仅在非菜单命令下显示此消息
- if "-menu" not in sys.argv:
- print("操作已完成,再见")
- if len(sys.argv) == 1 :
- usage()
- else :
- main()
|