public async Task Run()
        {
            var caseInsensitiveParser = new Parser(
                with =>
            {
                with.CaseSensitive          = false;
                with.IgnoreUnknownArguments = false;
                with.HelpWriter             = Console.Out;
                with.AutoVersion            = true;
                with.AutoHelp = true;
            });

            var parsedOptions = new FirmwareUploaderOptions();

            try
            {
                var result = caseInsensitiveParser.ParseArguments <FirmwareUploaderOptions>(commandLineArguments);
                result.WithParsed(options => parsedOptions = options).WithNotParsed(
                    errors => errors.ToList().ForEach(e => errorMessages.Add(e.ToString())));
            }
            catch (Exception ex)
            {
                errorMessages.Add(ex.Message);
            }

            if (errorMessages.Any())
            {
                Environment.Exit(-1);
            }

            int exitCode = await PerformUpload(parsedOptions);

            Environment.Exit(exitCode);
        }
        private async Task <int> PerformUpload(FirmwareUploaderOptions options)
        {
            Console.WriteLine($"COM port: {options.PortName}");
            Console.WriteLine($"File: {options.HexFile}");
            var ports = SerialPortStream.GetPortNames().ToList();

            // var descriptions = SerialPortStream.GetPortDescriptions().ToList();
            if (!ports.Contains(options.PortName))
            {
                throw new InvalidOperationException(
                          "The specified port does not exist on the system. Please make sure the device is connected and try again.");
            }

            string bootloaderPort = await RunBootLoader(options.PortName, ports);

            if (string.IsNullOrWhiteSpace(bootloaderPort))
            {
                throw new InvalidOperationException("Unable to detect boot-loader port. Firmware upload failed.");
            }
            Console.WriteLine($"Detected bootloader port on {bootloaderPort}");
            int exitCode = await InvokeAvrDude(bootloaderPort, options.HexFile, options.Verbose);

            Console.WriteLine($"Programmer returned with exit code {exitCode}");
            string disposition = exitCode == 0 ? "SUCCESSFUL" : "FAILED";

            if (exitCode == 0)
            {
                Console.WriteLine("*******************************************************");
                Console.WriteLine("*                                                      ");
                Console.WriteLine("*   Firmware update SUCCESSFUL                         ");
                Console.WriteLine("*                                                      ");
                Console.WriteLine("*******************************************************");
            }
            else
            {
                Console.Error.WriteLine("*******************************************************");
                Console.Error.WriteLine("*                                                      ");
                Console.Error.WriteLine($"*   Firmware update FAILED with code {exitCode}");
                Console.Error.WriteLine("*                                                      ");
                Console.Error.WriteLine("*******************************************************");
            }

            return(exitCode);
        }