{"record":{"id":"8282103beb0b6045","repo":"arduino/Arduino","slug":"please-select-a-programmer-from-tools-programmer","errorCode":null,"errorMessage":"Please select a programmer from Tools->Programmer menu","messagePattern":"Please select a programmer from Tools->Programmer menu","errorType":"exception","errorClass":"RunnerException","httpStatus":null,"severity":"error","filePath":"arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java","lineNumber":297,"sourceCode":"\n  private boolean uploadUsingProgrammer(String buildPath, String className) throws Exception {\n\n    TargetPlatform targetPlatform = BaseNoGui.getTargetPlatform();\n    String programmer = PreferencesData.get(\"programmer\");\n    if (programmer.contains(\":\")) {\n      String[] split = programmer.split(\":\", 2);\n      targetPlatform = BaseNoGui.getCurrentTargetPlatformFromPackage(split[0]);\n      programmer = split[1];\n    }\n\n    PreferencesMap prefs = PreferencesData.getMap();\n    PreferencesMap boardPreferences = BaseNoGui.getBoardPreferences();\n    if (boardPreferences != null) {\n      prefs.putAll(boardPreferences);\n    }\n    PreferencesMap programmerPrefs = targetPlatform.getProgrammer(programmer);\n    if (programmerPrefs == null)\n      throw new RunnerException(\n          tr(\"Please select a programmer from Tools->Programmer menu\"));\n    prefs.putAll(targetPlatform.getTool(programmerPrefs.getOrExcept(\"program.tool\")));\n    prefs.putAll(programmerPrefs);\n\n    prefs.put(\"build.path\", buildPath);\n    prefs.put(\"build.project_name\", className);\n\n    if (verbose)\n      prefs.put(\"program.verbose\", prefs.getOrExcept(\"program.params.verbose\"));\n    else\n      prefs.put(\"program.verbose\", prefs.getOrExcept(\"program.params.quiet\"));\n\n    if (verifyUpload)\n      prefs.put(\"program.verify\", prefs.get(\"program.params.verify\", \"\"));\n    else\n      prefs.put(\"program.verify\", prefs.get(\"program.params.noverify\", \"\"));\n\n    return runCommand(\"program.pattern\", prefs);","sourceCodeStart":279,"sourceCodeEnd":315,"githubUrl":"https://github.com/arduino/Arduino/blob/a0df6e0e83b652c72bc78b0a1376c54d6ebc3bee/arduino-core/src/cc/arduino/packages/uploaders/SerialUploader.java#L279-L315","documentation":"SerialUploader.uploadUsingProgrammer looks up the currently selected programmer (from Tools > Programmer) in the board's target platform and throws this RunnerException when none is selected or the selection cannot be resolved to a programmers entry.","triggerScenarios":"Invoking Upload Using Programmer (or Burn Bootloader flows via programmer) when PreferencesData 'programmer' is empty/unset or names a programmer absent from the board's platform programmers.txt.","commonSituations":"Fresh IDE installs where the programmer menu defaults to none; board definitions lacking the chosen programmer; switching boards so the previous programmer selection no longer exists; corrupted/custom platform packages.","solutions":["Open Tools > Programmer and select the programmer you are actually using","Verify the selected board's platform provides that programmer (programmers.txt present)","Reinstall/update the board's core package if programmers are missing","If editing platforms, ensure the programmer id in the menu matches a programmers.txt entry"],"exampleFix":"// before\nTools > Programmer: (empty)\n// after\nTools > Programmer: Arduino as ISP","handlingStrategy":"validation","validationCode":"String programmer = PreferencesData.get(\"programmer\");\nif (programmer == null || programmer.isEmpty()\n        || targetPlatform.getProgrammer(programmer) == null) {\n    throw new IllegalStateException(\"Select a programmer under Tools > Programmer first\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    uploader.uploadUsingPreferences(src, build, cls, true, warnings);\n} catch (RunnerException e) {\n    if (e.getMessage().contains(\"Please select a programmer\")) {\n        // surface UI prompt to pick Tools > Programmer, then retry\n    }\n}","preventionTips":["Always choose Tools > Programmer before Upload Using Programmer","Re-check programmer selection after switching boards","Keep board platform packages installed and current"],"tags":["upload","programmer","configuration","arduino-ide"],"backgroundTag":"missing-required-config","analyzedSha":"a0df6e0e83b652c72bc78b0a1376c54d6ebc3bee","analyzedAt":"2026-09-06T10:13:38.901Z","contentChangedAt":"2026-09-06T10:13:38.901Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}