DebugUart.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import os
  2. import time
  3. # from lief import Object
  4. import asyncio
  5. from collections import OrderedDict
  6. class DebugUart():
  7. def __init__(self, mcu):
  8. # super().__init__()
  9. self.mcu = mcu
  10. # 0x01 0x42 0x6C 0x6b
  11. async def set(self, text):
  12. await asyncio.sleep(0.1)
  13. # 1 0x42 0x6C 0x6b
  14. # text = self.ui.textEdit.toPlainText()
  15. # self.ui.textEdit_2.clear()
  16. if not text:
  17. return
  18. text = text.replace(",", ",")
  19. text = text.replace(" ", ",")
  20. text = text.replace("\n", ",")
  21. data = text.split(",")
  22. try:
  23. buf = [
  24. self.mcu.command["signal_forwarding"],
  25. 0x01,
  26. 0x01,
  27. 0x00,
  28. 0x00,
  29. ]
  30. data = [int(x, 16) for x in data if x]
  31. buf.extend(data)
  32. text = " ".join([f"0x{x:02X}" for x in data])
  33. self.mcu.msg_type = "send_command"
  34. self.mcu.sendSocketMessage(
  35. code=0,
  36. msg="命令发送完成",
  37. device_status=2,
  38. data={"command": text, "type": "input"},
  39. )
  40. self.mcu.msg_type = "mcu"
  41. # self.ui.textEdit.setText(text)
  42. # # 刷新界面命令
  43. # QApplication.processEvents()
  44. self.mcu.add_send_data_queue(buf)
  45. loop = asyncio.get_event_loop()
  46. loop.create_task(self.get(), name="sendCommand3")
  47. except BaseException as e:
  48. print("解析错误", e)
  49. pass
  50. async def get(self, *args):
  51. await asyncio.sleep(0.1)
  52. self.mcu.last_from_mcu_move_respond_data = None
  53. _s = time.time()
  54. print("_s", _s)
  55. while 1:
  56. await asyncio.sleep(0.1)
  57. if time.time() - _s > 3:
  58. return False
  59. # print("last_from_mcu_move_respond_data 1", time.time() - _s)
  60. # print(
  61. # "last_from_mcu_move_respond_data 2",
  62. # self.mcu.last_from_mcu_move_respond_data,
  63. # )
  64. if self.mcu.last_from_mcu_move_respond_data is not None:
  65. break
  66. receive_data = self.mcu.last_from_mcu_move_respond_data
  67. receive_data = receive_data[2:]
  68. print("<------------------get_from_mcu_move_respond_data")
  69. # self.ui.textEdit_2.setText(" ".join([hex(x) for x in receive_data]))
  70. text = " ".join([hex(x) for x in receive_data])
  71. self.mcu.msg_type = "send_command"
  72. self.mcu.sendSocketMessage(
  73. code=0,
  74. msg="命令发送完成",
  75. device_status=2,
  76. data={"command": text, "type": "output"},
  77. )
  78. self.mcu.msg_type = "mcu"
  79. if len(receive_data) >= 37:
  80. # 锁定按键菜单 Lock 为 Disable(0x01 为 Enable);
  81. data = OrderedDict()
  82. # 锁定按键菜单 Lock 为 Disable(0x01 为 Enable);
  83. data["锁定按键菜单"] = self.mcu.get_data_from_receive_data(
  84. receive_data=receive_data, start=4, len_data=1
  85. )
  86. # 控制模式菜单 Ctrl_Mode 为 CR_VFOC,即 FOC 矢量闭环控制模式;
  87. data["控制模式菜单"] = self.mcu.get_data_from_receive_data(
  88. receive_data=receive_data, start=5, len_data=1
  89. )
  90. # 脉冲端口复用功能菜单 P_PUL 为 PUL_ENA,即使能脉冲输入控制
  91. data["脉冲端口复用功能菜单"] = self.mcu.get_data_from_receive_data(
  92. receive_data=receive_data, start=6, len_data=1
  93. )
  94. # 通讯端口复用功能菜单 P_Serial 为 UART_FUN,即使能串口通讯;
  95. data["通讯端口复用功能菜单"] = self.mcu.get_data_from_receive_data(
  96. receive_data=receive_data, start=7, len_data=1
  97. )
  98. # En 引脚的有效电平菜单 En 为 Hold,即一直有效
  99. data["En引脚的有效电平菜单"] = self.mcu.get_data_from_receive_data(
  100. receive_data=receive_data, start=8, len_data=1
  101. )
  102. # 电机旋转正方向菜单 Dir 为 CW,即顺时针方向
  103. data["电机旋转正方向菜单"] = self.mcu.get_data_from_receive_data(
  104. receive_data=receive_data, start=9, len_data=1
  105. )
  106. # 细分菜单 MStep 为 16 细分;(注:256 细分用 00 表示)
  107. data["细分菜单"] = self.mcu.get_data_from_receive_data(
  108. receive_data=receive_data, start=10, len_data=1
  109. )
  110. # 细分插补功能菜单 MPlyer 为 Enable,即使能细分插补;
  111. data["细分插补功能菜单"] = self.mcu.get_data_from_receive_data(
  112. receive_data=receive_data, start=11, len_data=1
  113. )
  114. # 自动熄屏功能菜单 AutoSDD 为 Disable,即关闭自动熄屏功能
  115. data["自动熄屏功能菜单"] = self.mcu.get_data_from_receive_data(
  116. receive_data=receive_data, start=12, len_data=1
  117. )
  118. # 采样电流低通滤波器强度菜单 LPFilter 为 Def
  119. data["采样电流低通滤波器强度菜单"] = self.mcu.get_data_from_receive_data(
  120. receive_data=receive_data, start=13, len_data=1
  121. )
  122. # 开环模式工作电流菜单 Ma 为 120 0Ma
  123. data["开环模式工作电流菜单"] = self.mcu.get_data_from_receive_data(
  124. receive_data=receive_data, start=14, len_data=2
  125. )
  126. # 闭环模式最大电流菜单 Ma_Limit 为 2200Ma;
  127. data["闭环模式最大电流菜单"] = self.mcu.get_data_from_receive_data(
  128. receive_data=receive_data, start=16, len_data=2
  129. )
  130. # 闭环模式最大转速菜单 Vm_Limit 为 3000RPM(转/每分钟);
  131. data["闭环模式最大转速菜单"] = self.mcu.get_data_from_receive_data(
  132. receive_data=receive_data, start=18, len_data=2
  133. )
  134. # 电流环带宽菜单 CurBW_Hz 为 1000rad/s;
  135. data["电流环带宽菜单"] = self.mcu.get_data_from_receive_data(
  136. receive_data=receive_data, start=20, len_data=2
  137. )
  138. # 串口波特率菜单 UartBaud 为 115200;(对应小屏幕选项顺序)
  139. data["串口波特率菜单"] = self.mcu.get_data_from_receive_data(
  140. receive_data=receive_data, start=22, len_data=1
  141. )
  142. # CAN 通讯速率菜单 CAN_Baud 为 500000;(对应小屏幕选项顺序)
  143. data["CAN通讯速率菜单"] = self.mcu.get_data_from_receive_data(
  144. receive_data=receive_data, start=23, len_data=1
  145. )
  146. # 通讯校验方式菜单 Checksum 为 0x6B;
  147. data["通讯校验方式菜单"] = self.mcu.get_data_from_receive_data(
  148. receive_data=receive_data, start=24, len_data=1
  149. )
  150. # 控制命令应答菜单 Response 为 Receive,即只返回确认收到命令;
  151. data["控制命令应答菜单"] = self.mcu.get_data_from_receive_data(
  152. receive_data=receive_data, start=25, len_data=1
  153. )
  154. # 通讯控制输入角度精确度选项菜单 S_PosTDP 为 Disable;
  155. data["通讯控制输入角度精确度选项菜单"] = (
  156. self.mcu.get_data_from_receive_data(
  157. receive_data=receive_data, start=26, len_data=1
  158. )
  159. )
  160. # 堵转保护功能菜单 Clog_Pro 为 Enable,即使能堵转保护;
  161. data["堵转保护功能菜单"] = self.mcu.get_data_from_receive_data(
  162. receive_data=receive_data, start=27, len_data=1
  163. )
  164. # 堵转保护转速阈值菜单 Clog_Rpm 为 8RPM(转/每分钟);
  165. data["堵转保护转速阈值菜单"] = self.mcu.get_data_from_receive_data(
  166. receive_data=receive_data, start=28, len_data=2
  167. )
  168. # 堵转保护电流阈值菜单 Clog_Ma 为 2000Ma;
  169. data["堵转保护电流阈值菜单"] = self.mcu.get_data_from_receive_data(
  170. receive_data=receive_data, start=30, len_data=2
  171. )
  172. # 堵转保护检测时间阈值菜单 Clog_Ms 为 2000ms;
  173. data["堵转保护检测时间阈值菜单"] = self.mcu.get_data_from_receive_data(
  174. receive_data=receive_data, start=32, len_data=2
  175. )
  176. # 位置到达窗口为 0.3
  177. data["位置到达窗口"] = self.mcu.get_data_from_receive_data(
  178. receive_data=receive_data, start=34, len_data=2
  179. )
  180. for k, v in data.items():
  181. print("{}:{}".format(k, v))
  182. return data