1、umodbus2.3.7做modbus slaver客户端后,while True:result = client.process()非阻塞,这个如果不用多线程,其他的工作都得放到这个while True死循环里面来运行了。
2、deepseek推荐了一个健壮的多线程管理器,试了好用。
# MicroPython多线程Ctrl+C处理方案
import _thread
import time
import sys
class ThreadManager:
def __init__(self):
self.exit_flag = False
self.threads = []
def thread_function(self, name):
while not self.exit_flag:
try:
print(f"Thread {name} is running")
time.sleep(1)
except Exception as e:
print(f"Thread {name} caught exception: {e}")
break
print(f"Thread {name} exiting")
def start_thread(self, name):
thread_id = _thread.start_new_thread(self.thread_function, (name,))
self.threads.append(thread_id)
return thread_id
def stop_all_threads(self):
self.exit_flag = True
# 等待所有线程退出
time.sleep(1.5) # 根据线程清理所需时间调整
def main():
manager = ThreadManager()
# 启动多个线程
manager.start_thread("A")
manager.start_thread("B")
try:
# 主线程工作
while True:
time.sleep(0.1)
except KeyboardInterrupt:
print("\nReceived Ctrl+C, stopping threads...")
manager.stop_all_threads()
print("All threads stopped. Exiting.")
sys.exit(0)
if __name__ == "__main__":
main()
3、看门狗没用过,想试试,那就再建一个看门狗线程?用上面这个多线程管理器。
def thread_function(self, name):
while not self.exit_flag:
try: # 按照参数name运行不同的函数
if name == 'mbslaver':
MbSlave.call_mbslaver()
if name == 'watchdog':
wdt.feed() # 重置看门狗计时器
print(f"Thread {name} is running")
time.sleep(1)
except Exception as e:
print(f"Thread {name} caught exception: {e}")
break
print(f"Thread {name} exiting")
deepseek说“通常喂狗操作应该放在主循环中,以确保主程序正常运行”。所以思路不对,应该改成主线程喂狗。
def main():
manager = ThreadManager()
# 启动多个线程
manager.start_thread("mbslaver")
#manager.start_thread("watchdog") #思路不对,应该是主线程喂狗,注释掉
# 初始化硬件看门狗,超时时间为5秒(单位:毫秒)
wdt = machine.WDT(timeout=5000)
try:
# 主线程工作
while True:
time.sleep(6)
# 通常喂狗操作应该放在主循环中,以确保主程序正常运行
wdt.feed()
except KeyboardInterrupt:
print("\nReceived Ctrl+C, stopping threads...")
manager.stop_all_threads()
print("All threads stopped. Exiting.")
sys.exit(0)
if __name__ == "__main__":
main()
测试一下,wdt = machine.WDT(timeout=5000) 让主线程time.sleep(6),不停的复位:
E (11667) task_wdt: Task watchdog got triggered. The following tasks/users did not reset the watchdog in time:
E (11667) task_wdt: - mpy_machine_wdt (CPU 0/1)
E (11667) task_wdt: Tasks currently running:
E (11667) task_wdt: CPU 0: IDLE0
E (11667) task_wdt: CPU 1: IDLE1
E (11667) task_wdt: Print CPU 0 (current core) backtrace
Backtrace: 0x40160D1F:0x3FFC0020 0x40085A21:0x3FFC0050 0x4009268B:0x3FFBBE20 0x4015F2CA:0x3FFBBE40 0x400D2F94:0x3FFBBE60 0x40096248:0x3FFBBE80
E (11667) task_wdt: Aborting.
E (11667) task_wdt: Print CPU 1 backtrace
A fatal error occurred. The crash dump printed below may be used to help
determine what caused it. If you are not already running the most recent
version of MicroPython, consider upgrading. New versions often fix bugs.
To learn more about how to debug and/or report this crash visit the wiki
page at: https://github.com/micropython/micropython/wiki/ESP32-debugging
MPY version : v1.25.0 on 2025-04-15
IDF version : v5.2.2
Machine : Generic ESP32 module with ESP32
Backtrace: 0x4009268b:0x3ffbc420 0x4015f2ca:0x3ffbc440 0x400d2f94:0x3ffbc460 0x40096248:0x3ffbc480
ELF file SHA256: b93509347
Rebooting...
ets Jul 29 2019 12:21:46
rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:4892
ho 0 tail 12 room 4
load:0x40078000,len:14896
load:0x40080400,len:4
load:0x40080404,len:3372
entry 0x400805b0