基于ESP32的MicroPython项目量产烧写指南
背景
前段时间用MicroPython开发了一个项目,硬件是ESP32-C3,目前准备量产,我需要提供固件以供加工厂批量烧录,需要把我有程序的板子里的程序读出来,然后下到别的板子上,以下做这件事情的过程记录。
1.固件读取烧录
在准备ESP32-C3硬件的量产过程中,将MicroPython程序固化到设备中,有以下步骤:
1.读出固件:
对于已经烧录到某个ESP32-C3板子上的固件,要读出并复制到其他板子上,可以使用esptool.py或其他串行通信工具来做这个工作。以下是使用esptool.py读取固件的一个基本示例:
esptool.py --chip esp32c3 --port /dev/ttyUSB0 read_flash 0x10000 0x100000 firmware.bin
--chip esp32c3指定了芯片类型;
--port /dev/ttyUSB0指定了ESP32-C3连接到计算机的串行端口;
read_flash是要执行的操作,0x10000是开始读取的起始地址,0x100000是要读取的长度(这个长度需要您根据实际的固件大小来决定);
firmware.bin是读取的内容保存到的文件;
2.烧录到新的ESP32-C3板子:
在获取了固件镜像文件后,您可以使用esptool.py将这个镜像烧录到新的ESP32-C3板子上。烧录命令类似于:
esptool.py --chip esp32c3 --port /dev/ttyUSB0 write_flash 0x10000 firmware.bin
在这里,write_flash是烧录操作,0x10000是烧录的起始地址,firmware.bin是固件文件。
2.烧录图形界面
接下来,要用PysimpleGUI来做个烧录界面,包含串口设置,文件选择,擦除和烧录的按钮,用于执行以上的烧录代码。
要使用 PySimpleGUI 创建一个图形界面,用于设置串口,选择文件以及执行擦除和烧录操作,可以参考下面的代码示例。这个示例提供了一个基本的界面框架,并使用了 esptool.py 的命令行操作。

要用到 PySimpleGUI 和 pyserial 库。如果没有安装,可以使用 pip 进行安装:
pip install PySimpleGUI pyserial
接下来是代码示例:
import os
try:import PySimpleGUI as sgimport serial
except:os.system('pip install PySimpleGUI pyserial')import PySimpleGUI as sgimport serial
import subprocess
from serial.tools import list_ports # 修正导入# 获取系统中的串口列表
def get_serial_ports():ports = list_ports.comports() # 修正使用list_portsreturn [port.device for port in ports]# 获取系统中的串口列表
def get_serial_ports():ports = list_ports.comports() # 修正使用list_portsreturn [port.device for port in ports]# 执行esptool的命令
def run_esptool_cmd(cmd):try:process = subprocess.run(cmd, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)return process.stdout.decode()except subprocess.CalledProcessError as e:return e.stderr.decode()# GUI Layout
layout = [[sg.Text('串口:'), sg.Combo(get_serial_ports(), size=(10, 1), key='PORT'), sg.Button('刷新串口')],[sg.Text('固件文件:'), sg.Input("./firmware.bin",size=(25, 1), key='FIRMWARE'), sg.FileBrowse('浏览')],[sg.Button('读取'), sg.Button('擦除'), sg.Button('烧录')],[sg.Output(size=(60, 5))]
]# Create the window
window = sg.Window('ESP32-C3 烧录工具', layout)# Event Loop
while True:event, values = window.read()if event == sg.WIN_CLOSED:breakelif event == '刷新串口':window['PORT'].update(values=get_serial_ports())elif event == '擦除':if values['PORT']:cmd = f'esptool.py --chip esp32c3 --port {values["PORT"]} erase_flash'print("发送擦除指令"+cmd+run_esptool_cmd(cmd)我想用PYSIMPLEGUI来做个烧录界面,包含串口设置,文件选择,擦除和烧录的按钮,用于执行以上的烧录代码,请给出代码示例)else:print("请先选择一个串口")elif event == '读取':if values['PORT'] and values['FIRMWARE']:cmd = f'esptool.py --chip esp32c3 --port {values["PORT"]} read_flash 0x10000 0x100000 {values["FIRMWARE"]}'print("读取返回"+cmd+run_esptool_cmd(cmd))else:print("请先选择一个串口和文件保存路径")elif event == '烧录':if values['PORT'] and values['FIRMWARE'] and os.path.exists(values['FIRMWARE']):firmware_path = values['FIRMWARE']cmd = f'esptool.py --chip esp32c3 --port {values["PORT"]} write_flash 0x10000 "{firmware_path}"'print("发送烧录指令"+cmd+run_esptool_cmd(cmd))else:print("请确保选择了串口和固件文件,并且固件文件路径正确")# Close the window
window.close()
代码说明:
-
list_ports.comports()函数用来获取当前系统上可用的串口。 -
run_esptool_cmd函数用来执行esptool.py的相关命令并捕捉输出。 -
界面布局定义了串口选择、文件选择和操作按钮。
-
事件循环在接收到事件时执行相关操作,比如刷新串口列表,执行擦除和烧录操作。
如果有任何疑问,可以微信联系我,全网同名。
相关文章:
基于ESP32的MicroPython项目量产烧写指南
背景 前段时间用MicroPython开发了一个项目,硬件是ESP32-C3,目前准备量产,我需要提供固件以供加工厂批量烧录,需要把我有程序的板子里的程序读出来,然后下到别的板子上,以下做这件事情的过程记录。 1.固件…...
线性规划的标准型转换
对于任意给定的线性规划的问题,其实其本身可能是不符合线性规划标准型的需求的,但是如果通过一系列的等价变化的话,是可以将该问题转换为标准型的线性规划问题,例如如下的线性规划问题: 添加图片注释,不超过 140 字&am…...
机器学习:探寻智能化时代的科技奇迹
在数字化浪潮席卷全球的今天,机器学习已然成为科技领域的一颗璀璨明星,引领着人工智能不断向前发展。那么,机器学习究竟是什么?它为何能在众多科技中脱颖而出,成为改变世界的力量?本文将带您一探究竟&#…...
《Flask入门教程》学习笔记
《Flask入门教程》官网:https://tutorial.helloflask.com/ 目录 第一章:准备工作第二章:Hello, Flask!第三章:模板第四章:静态文件第五章:数据库第六章:模板优化第七章:表单第八章&a…...
go语言基础 -- map的定义与使用
map的定义与使用 map声明基础语法map的基本使用map的遍历map切片map排序 map声明基础语法 // map的声明 var xxx_map map[key_type]value_typemap的key可以是基本数据类型,channel,接口,结构体,数组,但不能是slice&am…...
讯方·智汇云校第五期名师班火热报名中!
第三期名师班回顾 授课情况 课堂上,同学们热情高涨,积极参与互动。他们紧跟名师的步伐,深入探索云服务的奥秘。张梁老师在为同学们讲述完知识点后,会根据所讲知识给同学们布置对应的实验,由同学们分组讨论练习。 每…...
为什么企业需要使用云电子邮箱?
作为一家机构的负责人,您比大多数人都清楚,您的工作日不会在下午5点就结束。很可能,当您的员工已经打卡下班回家很久之后,您还在以这样或那样的方式继续工作。作为一名企业主,埋头苦干对您来说并不是什么新鲜事&#x…...
[DEBUG] spring boot-如何处理链接中的空格等特殊字符
问题: get或者post中提交的内容可能有空格、#等特殊字符,不做处理的话可能解析错误。 解决: html中: <a th:href"{/listSgrna(id${item.getGeneId()},geneName${item.getGeneName()},genome${genome},sgrnaNum${sgrnaN…...
通过配置数据库事件(Event)来实现定时导出 MySQL 数据库
首先,确保 MySQL 服务器已启用事件调度器功能。你可以通过以下 SQL 语句查询: SHOW VARIABLES LIKE event_scheduler; 如果 event_scheduler 的值为 ON,则表示事件调度器已启用;如果为 OFF,则可以使用以下语句启用&…...
基于x86架构的OpenHarmony应用生态挑战赛等你来战!
为了更快速推进OpenHarmony在PC领域的进一步落地,加快x86架构下基于OpenHarmony的应用生态的繁荣,为北向应用开发者提供一个更加便捷的开发环境,推动OpenHarmony北向应用开发者的增加,助力OpenHarmony在PC领域实现新的突破&#x…...
LeetCode每日一题2673. Make Costs of Paths Equal in a Binary Tree
文章目录 一、题目二、题解 一、题目 You are given an integer n representing the number of nodes in a perfect binary tree consisting of nodes numbered from 1 to n. The root of the tree is node 1 and each node i in the tree has two children where the left ch…...
贝叶斯分类器
贝叶斯分类器 1. 引言 贝叶斯分类器是一种基于贝叶斯定理的分类算法,它利用特征之间的关系和类别的先验概率来进行分类。贝叶斯分类器在文本分类、垃圾邮件过滤、医学诊断等领域有着广泛的应用。 贝叶斯分类算法是统计学的一种分类方法,是一类利用概率…...
游戏服务之会话管理
会话的概念与作用 游戏服务器 Session(会话)是指在游戏服务器和客户端之间建立的一个临时的连接。它可以用于存储和管理用户的游戏状态和信息。 当用户登录游戏时,服务器会为该用户创建一个 Session,可用于记录用户的登录状态、角色信息等个人信息。服务器会为每个会话分…...
LeetCode20 有效的括号
题目 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。有效字符串需满足:1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。 3、每个右括号都有一个对应的相…...
sql实战_基于某推荐比值问题
将一个月内某PL对应的MBLX出现的最高的频次的占比值最大的值统计出来,并且还要把XHLX,MBLX字段添加上作为最终的推荐字段 Select * from(select *,row_number( ) over (partition by PL order by 占比最大值 desc ) rn from 表) where rn 1;…...
协议的概念+本质+作用+最终表现形式,网络问题(技术+应用+解决的协议+存在原因),主机的对称性
目录 协议 概念 示例 -- 摩斯密码 介绍 作用 协议的本质 作用 网络问题 引入 技术问题 应用问题 主机的对称性 问题对应的协议 问题出现的原因 理解协议(代码层面) 举例 -- 快递单 协议的最终表现形式 协议被双方主机认知的基础 协议 概念 协议是在计算机通信…...
iOS中卡顿产生的主要原因及优化思路
卡顿本质上是一个UI体验上的问题,而UI的渲染及显示,主要涉及CPU和GPU两个层面。若 CPUGPU渲染耗时超过16.7ms,就会在屏幕vsync信号到来时无法更新屏幕内容,进而导致卡顿。 iOS中UI渲染主要包含Layout->Draw->Prepare->Co…...
spring boot集成Elasticsearch 7.16.3
环境:Elasticsearch 版本 7.16.3 Elasticsearch for windows下载地址 windows 若依 spring boot版本 2.6.0 pom文件添加 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch<…...
HTML5+CSS3小实例:环绕小球弹性loading动画
实例:环绕小球弹性loading动画 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge&quo…...
SpringBoot 自定义注解实现操作日志记录
文章目录 前言正文一、项目结构介绍二、核心类2.1 核心注解2.1.1 CLog 日志注解2.1.2 ProcessorBean 处理器bean 2.2 切面类2.3 自定义线程池2.4 工具类2.4.1 管理者工具类 2.5 测试2.5.1 订单创建处理器2.5.2 订单管理者2.5.3 订单控制器2.5.4 测试报文2.5.5 测试结果 附录1、…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
