1.pip install nrfutil
2. 在命令行中直接使用
3.自己封装一个函数使用
import os
import sys
import logging
sys.path.append(os.getcwd())
from nordicsemi.dfu.dfu import Dfu
from nordicsemi.dfu.dfu_transport import DfuEvent
from nordicsemi.dfu.dfu_transport_serial import DfuTransportSerial
from pc_ble_driver_py.exceptions import NordicSemiException
from nordicsemi.lister.device_lister import DeviceLister
logger = logging.getLogger(__name__)
def ble_driver_init(conn_ic_id):
global BLEDriver, Flasher, DfuTransportBle
from pc_ble_driver_py import config
config.__conn_ic_id__ = conn_ic_id
from pc_ble_driver_py.ble_driver import BLEDriver, Flasher
from nordicsemi.dfu.dfu_transport_ble import DfuTransportBle
class nrfutil():
def __init__(self, package,port):
self.package = package
self.port = port
def update(self):
self.dfu.dfu_send_images()
print("Device programmed.")
def do_serial(self, connect_delay = None, flow_control = None, packet_receipt_notification = None, baud_rate = None, serial_number = None, ping = None,
timeout = 1 ,update_progress = None):
if flow_control is None:
flow_control = DfuTransportSerial.DEFAULT_FLOW_CONTROL
if packet_receipt_notification is None:
packet_receipt_notification = DfuTransportSerial.DEFAULT_PRN
if baud_rate is None:
baud_rate = DfuTransportSerial.DEFAULT_BAUD_RATE
if ping is None:
ping = False
if self.port is None:
device_lister = DeviceLister()
device = device_lister.get_device(serial_number=serial_number)
if device is None:
raise NordicSemiException("A device with serial number %s is not connected." % serial_number)
self.port = device.get_first_available_com_port()
logger.info("Resolved serial number {} to port {}".format(serial_number, self.port))
if timeout is None:
timeout = DfuTransportSerial.DEFAULT_TIMEOUT
logger.info("Using board at serial port: {}".format(self.port))
serial_backend = DfuTransportSerial(com_port=str(self.port), baud_rate=baud_rate,
flow_control=flow_control, prn=packet_receipt_notification, do_ping=ping,
timeout=timeout)
serial_backend.register_events_callback(DfuEvent.PROGRESS_EVENT, update_progress)
self.dfu = Dfu(zip_file_path = self.package, dfu_transport = serial_backend, connect_delay = connect_delay)
return self.dfu.dfu_get_total_size()
4.使用封装好的库
#放入文件名和串口
upgrader = nrfutil.nrfutil(self.FirmwareFilename,serial_port)
#使用全局变量放filesize,在回调函数update_progress中打印进度
global fileSize
fileSize = upgrader.do_serial(update_progress = self.update_progress,ping = True,timeout = 2,flow_control = 0)
upgrader.update()
def update_progress(self,progress):
global fileSize
#self.leng是总size
self.leng = progress + self.leng
complete = int(self.leng/fileSize*100)
if complete ==100:
print('complete')