[其他] 利用Python模拟鼠标自动完成MM32-LINK程序下载

[复制链接]
976|17
 楼主| o88ne 发表于 2023-1-29 11:49 | 显示全部楼层 |阅读模式
    简 介: 编写了利用Python控制MM32-LINK自动下载程序,这可以减少在开发过程中的操作。

    MM32-LINK在打开程序过程中,对话框的标题出现错误,“Load form file”,应该修改成“Load from file”。

    关键词: MM32-LINK,Python,模拟鼠标,自动程序下载
9669763d5ecd07e3c4.png

————————————————
版权声明:本文为CSDN博主「卓晴」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhuoqingjoking97298/article/details/121131071
 楼主| o88ne 发表于 2023-1-29 11:51 | 显示全部楼层
MM32-LINK

  在 制作灵动单片机MM32F3277 测试版 描述了通过MM32-LINK完成对于灵动MCU开发过程。特别是设计了基于MM32-LINK的5PIN程序下载接口。但是,如果在整个开发过程,需要MM32-LINK自动完成程序下载,需要通过MM32-LINK界面上的载入程序,并进行编程过程。使用鼠标需要经过多个操作。

  下面将会通过Python程序,模拟鼠标与键盘操作,完成一键下载程序的过程。

9293563d5ed42122af.png
▲ 图1.1 MM32-LINK界面

  通过截取MM32-LINK对话框,利用线段绘制出从左上角到打开程序位置的线段,通过显示线段属性(宽,长)从而获得鼠标点击打开程序按钮相对位置。(803,175)
 楼主| o88ne 发表于 2023-1-29 11:52 | 显示全部楼层
一、模拟鼠标操作
1、Python软件包

  根据 Simulate a mouse click python 中的介绍,可以使用pyautogui程序包完成对鼠标模拟操作。
 楼主| o88ne 发表于 2023-1-29 11:53 | 显示全部楼层
测试点击程序

2838163d5ed9eb1c2a.png
 楼主| o88ne 发表于 2023-1-29 11:54 | 显示全部楼层
from head import *
import pyautogui

MM32_TITLE = 'MM32-LINK'
offset_x = 803
offset_y = 175

rect = tspgetwindowrect(MM32_TITLE)

click_x = rect[0] + offset_x
click_y = rect[1] + offset_y

pyautogui.click(click_x, click_y)

for _ in range(20):

    time.sleep(.1)
    rect = tspgetwindowrect('Load form file')
    if sum(rect) != 0:
        break

printf(rect)
 楼主| o88ne 发表于 2023-1-29 11:56 | 显示全部楼层
错误:MM32-LINK软件在打开的对话框标题出现错误:Load form file

  应该修改为: “Load from file”
 楼主| o88ne 发表于 2023-1-29 11:57 | 显示全部楼层
载入程序

  然后在使用Python模拟快捷键,加成对于程序的整个自动下载流程控制。
5195263d5eeea630b0.png
 楼主| o88ne 发表于 2023-1-29 11:59 | 显示全部楼层
  1. from head import *
  2. import pyautogui

  3. MM32_TITLE = 'MM32-LINK'
  4. offset_x = 803
  5. offset_y = 175

  6. filename = r'D:\zhuoqing\window\ARM\IAR\MM32\Test\TestF103UART2.hex'

  7. if not os.path.isfile(filename):
  8.     printf("ERROR:Can not find file :%s\a"%filename)
  9.     exit()

  10. rect = tspgetwindowrect(MM32_TITLE)

  11. click_x = rect[0] + offset_x
  12. click_y = rect[1] + offset_y

  13. LOAD_FILE = 'Load form file'

  14. pyautogui.click(click_x, click_y)

  15. for _ in range(20):

  16.     time.sleep(.1)
  17.     rect = tspgetwindowrect(LOAD_FILE)
  18.     if sum(rect) != 0:
  19.         break

  20. if sum(rect) == 0:
  21.     printf("No load file dialog open !\a")
  22.     exit()

  23. clipboard.copy(filename)
  24. tspsendwindowkey(LOAD_FILE, "n", alt=1, noreturn=1)
  25. tspsendwindowkey(LOAD_FILE, "v", control=1, noreturn=1)
  26. tspsendwindowkey(LOAD_FILE, "o", alt=1, noreturn=1)

  27. time.sleep(.5)

  28. tspsendwindowkey(MM32_TITLE, "p", alt=1, noreturn=1)

  29. for _ in range(20):
  30.     time.sleep(.1)
  31.     rect = tspgetwindowrect('Program')
  32.     if sum(rect) != 0: break

  33. if sum(rect) == 0:
  34.     printf("ERROR:No program dialog open.\a")
  35.     exit()

  36. tspsendwindowkey('Program', '\r', noreturn=1)
  37. printf("\a")
  38. time.sleep(2.0)
  39. tspsendwindowkey('Program', 'c', alt=1, noreturn=1)

  40. printf("\a")
 楼主| o88ne 发表于 2023-1-29 11:59 | 显示全部楼层
※ 实验总结 ※

  编写了利用Python控制MM32-LINK自动下载程序,这可以减少在开发过程中的操作。

  MM32-LINK在打开程序过程中,对话框的标题出现错误,“Load form file”,应该修改成“Load from file”。

  下面给出完成的程序。

  1. #!/usr/local/bin/python
  2. # -*- coding: gbk -*-
  3. #============================================================
  4. # MM32PRG.PY                   -- by Dr. ZhuoQing 2021-11-03
  5. #
  6. # Note:
  7. #============================================================

  8. from head import *
  9. import pyautogui


  10. #------------------------------------------------------------
  11. MM32_TITLE = 'MM32-LINK'
  12. offset_x = 803
  13. offset_y = 175

  14. #------------------------------------------------------------
  15. filename = r'D:\zhuoqing\window\ARM\IAR\MM32\Test\SeekFreeMP.Hex'

  16. if len(sys.argv) > 1:
  17.     filename = sys.argv[1]

  18. printf(filename)

  19. #------------------------------------------------------------
  20. if not os.path.isfile(filename):
  21.     printf("ERROR:Can not find file :%s\a"%filename)
  22.     exit()

  23. #------------------------------------------------------------
  24. windowrect = tspgetwindowrect(MM32_TITLE)

  25. click_x = windowrect[0] + offset_x
  26. click_y = windowrect[1] + offset_y

  27. #------------------------------------------------------------
  28. LOAD_FILE = 'Load form file'

  29. pyautogui.click(click_x, click_y)

  30. for _ in range(20):

  31.     time.sleep(.1)
  32.     rect = tspgetwindowrect(LOAD_FILE)
  33.     if sum(rect) != 0:
  34.         break

  35. #------------------------------------------------------------
  36. if sum(rect) == 0:
  37.     printf("No load file dialog open !\a")
  38.     exit()

  39. #------------------------------------------------------------
  40. clipboard.copy(filename)
  41. tspsendwindowkey(LOAD_FILE, "n", alt=1, noreturn=1)
  42. tspsendwindowkey(LOAD_FILE, "v", control=1, noreturn=1)
  43. tspsendwindowkey(LOAD_FILE, "o", alt=1, noreturn=1)

  44. time.sleep(.5)

  45. #------------------------------------------------------------
  46. tspsendwindowkey(MM32_TITLE, "c", alt=1, noreturn=1)
  47. time.sleep(1)

  48. wm_offsetx = 430
  49. wm_offsety = 503

  50. click_x = windowrect[0] + wm_offsetx
  51. click_y = windowrect[1] + wm_offsety
  52. pyautogui.click(click_x, click_y)


  53. #------------------------------------------------------------
  54. '''

  55. tspsendwindowkey(MM32_TITLE, "p", alt=1, noreturn=1)

  56. for _ in range(20):
  57.     time.sleep(.1)
  58.     rect = tspgetwindowrect('Program')
  59.     if sum(rect) != 0: break

  60. if sum(rect) == 0:
  61.     printf("ERROR:No program dialog open.\a")
  62.     exit()

  63. tspsendwindowkey('Program', '\r', noreturn=1)
  64. printf("\a")
  65. time.sleep(2.0)
  66. tspsendwindowkey('Program', 'c', alt=1, noreturn=1)
  67. '''
  68. #------------------------------------------------------------
  69. printf("\a")




  70. #------------------------------------------------------------
  71. #        END OF FILE : MM32PRG.PY
  72. #============================================================
单片小菜 发表于 2023-1-29 16:53 | 显示全部楼层
这个工程可以下载吗?
tpgf 发表于 2023-2-6 14:27 | 显示全部楼层
看了看大概的功能  是自己做了一个自动点击器是吗
guanjiaer 发表于 2023-2-6 14:35 | 显示全部楼层
对屏幕位置的准确度高不高 稳定吗
heimaojingzhang 发表于 2023-2-6 14:55 | 显示全部楼层
这种上位机代码使用什么语言编程是最方便的呢
keaibukelian 发表于 2023-2-6 15:28 | 显示全部楼层
感觉从语法上来说 比c语言更加简单
paotangsan 发表于 2023-2-6 15:40 | 显示全部楼层
感觉并不是很实用  因为我们自己用鼠标点也点不了几下
renzheshengui 发表于 2023-2-6 16:00 | 显示全部楼层
这种模拟鼠标操作的话 是不是需要每次操作前需要校对零点啊
Undshing 发表于 2023-3-9 22:25 | 显示全部楼层
不同分辨率屏幕能用吗?
Jacquetry 发表于 2023-3-12 20:42 | 显示全部楼层
屏幕位置需要特别注意吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

426

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部