鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    [FishBot]Windows/Linux下无界面下烧录和配置FishBot教程

    已定时 已固定 已锁定 已移动
    FishBot二驱机器人
    fishbot windows 配置助手
    2
    3
    405
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 小鱼小
      小鱼 技术大佬
      最后由 小鱼 编辑

      很多小伙伴使用虚拟机进行主控板和雷达板烧录和配置都遇到了通讯异常等问题,小鱼就做了windows或mac版本的烧录工具,工具比较简陋,但是功能都有,使用方法如下:

      首先以管理员的权限打开Powershell

      1. 安装 Python

      Windows 输入下面这句话

      wget -O C:\Python_setup.exe https://www.python.org/ftp/python/3.11.0/python-3.11.0rc1.exe ;cmd /c C:\Python_setup.exe /quiet TargetDir=C:\Python311 InstallAllUsers=1 PrependPath=1 Include_test=0
      

      Linux-Ubuntu 下输入下面这句话

      sudo apt install python3-pip
      

      2. 安装依赖库

      pip install pyserial esptool
      

      3.运行脚本

      新建文件 download.py

      复制粘贴如下内容

      import serial #导入模块
      import serial.tools.list_ports
      import os
      import sys
      import requests
      import time
      
      def check_installation(package_name):
          try:
              __import__(package_name)
              print(f'{package_name} 已安装')
              return True
          except ImportError:
              print(f'{package_name} 未安装')
              return False
      
      def install_package(package_name):
          print(f'请使用: pip install {package_name} 安装 {package_name}')
      
      def list_serial_ports():
          port_list = list(serial.tools.list_ports.comports())
          if len(port_list) == 0:
              print('无可用串口,请插入串口设备')
              return False
          else:
              print('当前可用串口有:')
              for i in range(0,len(port_list)):
                  print(port_list[i].name)
              return True
          
      def download_firmware(firmware_path):
          print('将测到固件在HTTP路径上,开始下载')
          response = requests.get(firmware_path, stream=True)
          response.raise_for_status()
      
          filename = os.path.basename(firmware_path)
          with open(filename, 'wb') as file:
              for chunk in response.iter_content(chunk_size=1024):
                  if chunk:
                      file.write(chunk)
      
          print(f'下载完成:{filename}')
          return filename
      
      def flash_firmware():
          firmware_path = 'firmware.bin'
          while not os.path.exists(firmware_path):
              print(f"提示:{firmware_path}固件文件不存在,请重新输入")
              firmware_path = input("请输入固件文件路径(可以是网址): ")
              if firmware_path.startswith('http'):
                  firmware_path = download_firmware(firmware_path)
      
      
          while list_serial_ports()==False:
              time.sleep(1)
          port = input("请输入要烧录的串口设备名称: ")
      
          flash_command = f'esptool.py --port {port} write_flash 0x00000 {firmware_path}'
          os.system(flash_command)
      
      
      
      def config_board(key: str, value: str, port='/dev/ttyUSB0', baudrate=115200):
          try:
              ser = serial.Serial(port, baudrate)
          except:
              return {"error": "串口打开异常,请检查设备是否被占用"}
      
          config_str = f"${key}={value}\n".encode()
          print(f"发送 {str(config_str)} 到 {ser.port}")
          ser.write(config_str)
          start_time_timeout = time.time()
          recv_avaliable_data = False
          while (time.time()-start_time_timeout < 5) and (not recv_avaliable_data):
              print("开始接收...")
              try:
                  recv = ser.read_all().decode()
                  print(f"尝试接收..{recv}")
                  time.sleep(0.5)
                  if len(recv) > 0:
                      print(f"接收到有效数据 :{recv}")
                      recv_avaliable_data = True
              except Exception as e:
                  print(e)
      
          if len(recv) == 0:
              return {"error": "串口数据异常,请确认设备在配置模式"}
      
          result = {}
          lines = recv.splitlines()
          for line in lines:
              if len(line) > 0 and line[0] == '$':
                  split_result = line[1:].split("=")
                  if len(split_result) == 2:
                      result[split_result[0]] = split_result[1]
          ser.close()
          if len(result) == 0:
              return {"error": "串口数据异常,请确认设备在配置模式"}
          return result
      
      
      def restart_device_bt_rst(port):
          try:
              ser = serial.Serial(port, baudrate=74880)
              ser.setRTS(False)
              ser.setDTR(False)
              time.sleep(0.2)
              ser.setRTS(True)
              ser.setDTR(True)
              time.sleep(0.2)
              time.sleep(0.1)
              return "[提示]发送RTS成功!"
          except Exception as e:
              ser.close()
              print(e)
              return {"error": "串口打开异常,请检查设备是否被占用"}
      
      
      
      def print_help():
          print("使用方法:")
          print("  python download.py list_port - 列出可用的串口")
          print("  python download.py flash - 下载固件")
          print("  python download.py read_config COMX - 读取配置,COMX替换为设备编号")
          print("  python download.py config name value - 设置配置项")
          print("  python download.py - 打印帮助信息")
      
      
      def main():
          # required_packages = ['esptool', 'pyserial']
      
          # for package in required_packages:
          #     if not check_installation(package):
          #         install_package(package)
      
          if len(sys.argv) == 1:
              print_help()
          elif sys.argv[1] == 'list_port':
              list_serial_ports()
          elif sys.argv[1] == 'flash':
              flash_firmware()
          elif sys.argv[1] == 'read_config':
              if len(sys.argv)!=3:
                  print('请在read_config后添加你要读取的设备串口号')
                  return
              all_configs = config_board("command", "read_config", port=sys.argv[2], baudrate=115200)
              print(all_configs)
          elif sys.argv[1] == 'config':
              if len(sys.argv)!=5:
                  print('请在config后添加你的:设备号 配置项 配置值')
                  return
              result = config_board(sys.argv[3], sys.argv[4], port=sys.argv[2], baudrate=115200)
              print(result)
          else:
              print("未知的命令")
              print_help()
      
      if __name__ == "__main__":
          main()
      

      根据脚本提示下载和配置即可

      新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

      5152617255 1 条回复 最后回复 回复 引用 0
      • 小鱼小 小鱼 在 中 引用了 这个主题
      • 小鱼小 小鱼 在 中 引用了 这个主题
      • 5152617255
        空无之时 @小鱼
        最后由 编辑

        @小鱼 请问,我出现了下载了esptool但是在下载固件时找不着的问题d5362dec-cfb5-45fa-9995-c0d82b49ade3-image.png

        小鱼小 1 条回复 最后回复 回复 引用 0
        • 小鱼小
          小鱼 技术大佬 @515261725
          最后由 编辑

          @515261725 windows使用的一个常见问题,安装的这个路径不在path中:
          bbb7a09a-2f3b-437c-bdd6-ea9f52f41fc7-image.png

          所以会找不到,想办法把安装目录加到path中,或者激活coonda试试

          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

          1 条回复 最后回复 回复 引用 0
          • 小鱼小 小鱼 在 中 引用了 这个主题
          • 小鱼小 小鱼 在 中 引用了 这个主题
          • 第一个帖子
            最后一个帖子
          皖ICP备16016415号-7
          Powered by NodeBB | 鱼香ROS