#!/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下载程序 参数: : 串口号(例如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()