diff --git a/nordicsemi/__main__.py b/nordicsemi/__main__.py index fbcca35..5735032 100755 --- a/nordicsemi/__main__.py +++ b/nordicsemi/__main__.py @@ -936,6 +936,11 @@ def do_serial(package, port, connect_delay, flow_control, packet_receipt_notific port = device.get_first_available_com_port() logger.info("Resolved serial number {} to port {}".format(serial_number, port)) + if timeout is None: + timeout = DfuTransportSerial.DEFAULT_TIMEOUT + if serial_timeout is None: + serial_timeout = DfuTransportSerial.DEFAULT_SERIAL_PORT_TIMEOUT + logger.info("Using board at serial port: {}".format(port)) serial_backend = DfuTransportSerial(com_port=str(port), baud_rate=baud_rate, flow_control=flow_control, prn=packet_receipt_notification, do_ping=ping) @@ -1017,7 +1022,16 @@ def usb_serial(package, port, connect_delay, flow_control, packet_receipt_notifi help='Serial number of the device. Ignored if --port is set.', type=click.STRING, required=False) -def serial(package, port, connect_delay, flow_control, packet_receipt_notification, baud_rate, serial_number): +@click.option('-t', '--timeout', + help='Set the timeout in seconds for board to respond (default: 30 seconds)', + type=click.INT, + required=False) +@click.option('-st', '--serial-timeout', + help='Set the timeout in seconds for the serial line (default: 1 second)', + type=click.FLOAT, + required=False) +def serial(package, port, connect_delay, flow_control, packet_receipt_notification, baud_rate, serial_number, + timeout, serial_timeout): """Perform a Device Firmware Update on a device with a bootloader that supports UART serial DFU.""" do_serial(package, port, connect_delay, flow_control, packet_receipt_notification, baud_rate, serial_number, True) diff --git a/nordicsemi/dfu/dfu_transport_serial.py b/nordicsemi/dfu/dfu_transport_serial.py index ef1f625..fe27784 100644 --- a/nordicsemi/dfu/dfu_transport_serial.py +++ b/nordicsemi/dfu/dfu_transport_serial.py @@ -149,6 +149,7 @@ class DfuTransportSerial(DfuTransport): DEFAULT_BAUD_RATE = 115200 DEFAULT_FLOW_CONTROL = True + DEFAULT_TIMEOUT = 30.0 # Timeout time for board response DEFAULT_SERIAL_PORT_TIMEOUT = 1.0 # Timeout time on serial port read DEFAULT_PRN = 0 DEFAULT_DO_PING = True @@ -170,7 +171,8 @@ def __init__(self, com_port, baud_rate=DEFAULT_BAUD_RATE, flow_control=DEFAULT_FLOW_CONTROL, - timeout=DEFAULT_SERIAL_PORT_TIMEOUT, + timeout=DEFAULT_TIMEOUT, + serial_timeout=DEFAULT_SERIAL_PORT_TIMEOUT, prn=DEFAULT_PRN, do_ping=DEFAULT_DO_PING): @@ -179,6 +181,7 @@ def __init__(self, self.baud_rate = baud_rate self.flow_control = 1 if flow_control else 0 self.timeout = timeout + self.serial_timeout = serial_timeout self.prn = prn self.serial_port = None self.dfu_adapter = None @@ -195,7 +198,7 @@ def open(self): try: self.__ensure_bootloader() self.serial_port = Serial(port=self.com_port, - baudrate=self.baud_rate, rtscts=self.flow_control, timeout=self.timeout) + baudrate=self.baud_rate, rtscts=self.flow_control, timeout=self.serial_timeout) self.dfu_adapter = DFUAdapter(self.serial_port) except Exception as e: raise NordicSemiException("Serial port could not be opened on {0}" @@ -204,10 +207,10 @@ def open(self): if self.do_ping: ping_success = False start = datetime.now() - while datetime.now() - start < timedelta(seconds=self.timeout): + while (datetime.now() - start < timedelta(seconds=self.timeout) + and ping_success == False): if self.__ping() == True: ping_success = True - time.sleep(1) if ping_success == False: raise NordicSemiException("No ping response after opening COM port")