diff --git a/arduino/serialutils/serialutils.go b/arduino/serialutils/serialutils.go index fdb57aa204f..dab4523a09d 100644 --- a/arduino/serialutils/serialutils.go +++ b/arduino/serialutils/serialutils.go @@ -106,6 +106,8 @@ func Reset(portToTouch string, wait bool, cb *ResetProgressCallbacks, dryRun boo } if strings.HasSuffix(emulatedPort, "999") { emulatedPort += "0" + } else if emulatedPort == "" { + emulatedPort = "newport" } return res, nil } diff --git a/commands/upload/upload.go b/commands/upload/upload.go index b9c4f248656..a390e450887 100644 --- a/commands/upload/upload.go +++ b/commands/upload/upload.go @@ -195,7 +195,10 @@ func runProgramAction(pme *packagemanager.Explorer, if burnBootloader && programmerID == "" { return &arduino.MissingProgrammerError{} } - + if port == nil { + // For no-port uploads use "default" protocol + port = &rpc.Port{Protocol: "default"} + } logrus.WithField("port", port).Tracef("Upload port") fqbn, err := cores.ParseFQBN(fqbnIn) @@ -361,11 +364,24 @@ func runProgramAction(pme *packagemanager.Explorer, uploadProperties.Set("build.project_name", sketchName) } + // Force port wait to make easier to unbrick boards like the Arduino Leonardo, or similar with native USB, + // when a sketch causes a crash and the native USB serial port is lost. + // See https://github.com/arduino/arduino-cli/issues/1943 for the details. + // + // In order to trigger the forced serial-port-wait the following conditions must be met: + // - No upload port specified (protocol == "default") + // - "upload.wait_for_upload_port" == true (developers requested the touch + port wait) + // - "upload.tool.serial" not defained, or + // "upload.tool.serial" is the same as "upload.tool.default" + forcedSerialPortWait := port.Protocol == "default" && // this is the value when no port is specified + uploadProperties.GetBoolean("upload.wait_for_upload_port") && + (!uploadProperties.ContainsKey("upload.tool.serial") || + uploadProperties.Get("upload.tool.serial") == uploadProperties.Get("upload.tool.default")) + // If not using programmer perform some action required // to set the board in bootloader mode actualPort := port - if programmer == nil && !burnBootloader && port.Protocol == "serial" { - + if programmer == nil && !burnBootloader && (port.Protocol == "serial" || forcedSerialPortWait) { // Perform reset via 1200bps touch if requested and wait for upload port also if requested. touch := uploadProperties.GetBoolean("upload.use_1200bps_touch") wait := false @@ -425,7 +441,7 @@ func runProgramAction(pme *packagemanager.Explorer, if actualPort.Address != "" { // Set serial port property uploadProperties.Set("serial.port", actualPort.Address) - if actualPort.Protocol == "serial" { + if actualPort.Protocol == "serial" || actualPort.Protocol == "default" { // This must be done only for serial ports portFile := strings.TrimPrefix(actualPort.Address, "/dev/") uploadProperties.Set("serial.port.file", portFile) diff --git a/internal/integrationtest/upload_mock/upload_mock_test.go b/internal/integrationtest/upload_mock/upload_mock_test.go index ec0875d8706..d88fa84a91d 100644 --- a/internal/integrationtest/upload_mock/upload_mock_test.go +++ b/internal/integrationtest/upload_mock/upload_mock_test.go @@ -161,12 +161,24 @@ func TestUploadSketch(t *testing.T) { Programmer: "", Output: "Performing 1200-bps touch reset on serial port /dev/ttyACM999\nWaiting for upload port...\nUpload port found on /dev/ttyACM9990\n\"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude\" \"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf\" -v -V -patmega32u4 -cavr109 \"-P/dev/ttyACM9990\" -b57600 -D \"-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i\"\n", }, + { + Fqbn: "arduino:avr:leonardo", + UploadPort: "", + Programmer: "", + Output: "Skipping 1200-bps touch reset: no serial port selected!\nWaiting for upload port...\nUpload port found on newport\n\"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude\" \"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf\" -v -V -patmega32u4 -cavr109 \"-Pnewport\" -b57600 -D \"-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i\"\n", + }, { Fqbn: "arduino:avr:micro", UploadPort: "/dev/ttyACM999", Programmer: "", Output: "Performing 1200-bps touch reset on serial port /dev/ttyACM999\nWaiting for upload port...\nUpload port found on /dev/ttyACM9990\n\"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude\" \"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf\" -v -V -patmega32u4 -cavr109 \"-P/dev/ttyACM9990\" -b57600 -D \"-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i\"\n", }, + { + Fqbn: "arduino:avr:micro", + UploadPort: "", + Programmer: "", + Output: "Skipping 1200-bps touch reset: no serial port selected!\nWaiting for upload port...\nUpload port found on newport\n\"{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/bin/avrdude\" \"-C{data_dir}/packages/arduino/tools/avrdude/6.3.0-arduino17/etc/avrdude.conf\" -v -V -patmega32u4 -cavr109 \"-Pnewport\" -b57600 -D \"-Uflash:w:{build_dir}/{sketch_name}.ino.hex:i\"\n", + }, { Fqbn: "arduino:avr:circuitplay32u4cat", UploadPort: "/dev/ttyACM999", @@ -502,6 +514,16 @@ func TestUploadSketch(t *testing.T) { "win32": "Performing 1200-bps touch reset on serial port /dev/ttyACM0\nWaiting for upload port...\nNo upload port found, using /dev/ttyACM0 as fallback\n\"{data_dir}/packages/arduino/tools/bossac/1.7.0-arduino3/bossac.exe\" -i -d --port=ttyACM0 -U true -i -e -w -v \"{build_dir}/{sketch_name}.ino.bin\" -R\n", }, }, + { + Fqbn: "arduino:samd:mkr1000", + UploadPort: "", + Programmer: "", + Output: map[string]string{ + "darwin": "Skipping 1200-bps touch reset: no serial port selected!\nWaiting for upload port...\nUpload port found on newport\n\"{data_dir}/packages/arduino/tools/bossac/1.7.0-arduino3/bossac\" -i -d --port=newport -U true -i -e -w -v \"{build_dir}/{sketch_name}.ino.bin\" -R\n", + "linux": "Skipping 1200-bps touch reset: no serial port selected!\nWaiting for upload port...\nUpload port found on newport\n\"{data_dir}/packages/arduino/tools/bossac/1.7.0-arduino3/bossac\" -i -d --port=newport -U true -i -e -w -v \"{build_dir}/{sketch_name}.ino.bin\" -R\n", + "win32": "Skipping 1200-bps touch reset: no serial port selected!\nWaiting for upload port...\nUpload port found on newport\n\"{data_dir}/packages/arduino/tools/bossac/1.7.0-arduino3/bossac.exe\" -i -d --port=newport -U true -i -e -w -v \"{build_dir}/{sketch_name}.ino.bin\" -R\n", + }, + }, { Fqbn: "arduino:samd:mkr1000", UploadPort: "/dev/ttyACM999", pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy