crawl_dac_flash_final.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import serial
  2. import time
  3. # --- Cấu hình ---
  4. PORT = 'COM6'
  5. BAUD_RATE = 115200
  6. TIMEOUT = 2
  7. MAX_ADDR = 0x100000
  8. STEP_SIZE = 64
  9. OUTPUT_FILE = "W25Q80_Main_v1.bin"
  10. def dump_flash_v3_3():
  11. try:
  12. ser = serial.Serial(PORT, BAUD_RATE, timeout=TIMEOUT)
  13. print(f"Kết nối {PORT}...")
  14. time.sleep(2)
  15. ser.reset_input_buffer()
  16. current_addr = 0
  17. print(f"--- Bắt đầu Dump v1 (Dựa trên Header Header) ---")
  18. with open(OUTPUT_FILE, "wb") as f:
  19. while current_addr < MAX_ADDR:
  20. # 1. Gửi lệnh
  21. cmd = f"mem r {current_addr}\r\n"
  22. ser.write(cmd.encode())
  23. byte_list = []
  24. header_found = False
  25. start_t = time.time()
  26. # 2. Đọc phản hồi
  27. while len(byte_list) < STEP_SIZE and (time.time() - start_t < 2.5):
  28. line = ser.readline().decode('utf-8', errors='ignore').strip()
  29. if not line:
  30. continue
  31. # Nếu thấy dòng Header, đánh dấu bắt đầu lấy dữ liệu từ dòng SAU
  32. if "Read flash address" in line:
  33. header_found = True
  34. continue
  35. # Chỉ xử lý các dòng nằm SAU dòng Header
  36. if header_found:
  37. # Tách các chuỗi byte (ví dụ: "FF", "08", "03"...)
  38. parts = line.split()
  39. for p in parts:
  40. # Kiểm tra xem có phải là byte hex hợp lệ (2 ký tự)
  41. if len(p) == 2:
  42. try:
  43. val = int(p, 16)
  44. byte_list.append(val)
  45. except ValueError:
  46. continue # Bỏ qua nếu gặp "OK" hoặc rác
  47. # 3. Kiểm tra và ghi file
  48. if len(byte_list) >= STEP_SIZE:
  49. # Lấy đúng 64 byte đầu tiên tìm thấy sau Header
  50. f.write(bytearray(byte_list[:STEP_SIZE]))
  51. current_addr += STEP_SIZE
  52. # In tiến độ
  53. if current_addr % 512 == 0:
  54. percent = (current_addr / MAX_ADDR) * 100
  55. print(f"\rTiến độ: {percent:6.2f}% | Addr: {current_addr}", end="")
  56. else:
  57. print(f"\n[Lỗi] Không gom đủ 64 byte tại {current_addr} (Chỉ có {len(byte_list)}B). Thử lại...")
  58. ser.reset_input_buffer()
  59. time.sleep(0.5)
  60. # Không tăng current_addr để vòng lặp while thử lại địa chỉ này
  61. print(f"\n\n--- HOÀN THÀNH ---")
  62. ser.close()
  63. except Exception as e:
  64. print(f"\nLỗi hệ thống: {e}")
  65. if __name__ == "__main__":
  66. dump_flash_v3_3()