Skip to content

Monitor: "configure failed: invalid argument" when selecting 750 baudrate after starting the monitor with 74880 #3010

@dankeboy36

Description

@dankeboy36

Describe the problem

When trying to change the baudrate, I get this error:

{"error": "command 'configure' failed: invalid argument"}

This happens when I pick the 750 baudrate after starting the monitor with 74880.

To reproduce

plotter/plotter.ino:

void setup() {
  Serial.begin(74880); // Set baudrate to 74880 to get the error when setting to 750
}

void loop() {
  Serial.println("hello");
  delay(1000);
}

My scripts to compile, upload, and optionally monitor.

compile.sh:

./arduino-cli \
  compile \
  --fqbn esp32:esp32:esp32da \
  plotter \
  --verbose

upload.sh:

./arduino-cli \
  upload \
  --fqbn esp32:esp32:esp32da \
  --port /dev/cu.usbserial-0001 \
  plotter \
  --verbose

monitor.sh (optional):

./arduino-cli \
  monitor \
  --fqbn esp32:esp32:esp32da \
  --port /dev/cu.usbserial-0001 \
  --config baudrate=74880

It is important to begin the serial communication with a 74880 baudrate. Selecting 9600, for example, will not cause the error.

Start the Arduino CLI in daemon mode:

./arduino-cli version
arduino-cli  Version: git-snapshot Commit: d5ef61d6 Date: 2025-09-20T13:04:53Z

./arduino-cli daemon
Daemon is now listening on 127.0.0.1:50051
{"IP":"127.0.0.1","Port":"50051"}

Open a new shell inside the arduino-cli repo and run the following:

Generate the .proto files:

buf export . -o ./tmp/out

Create:

grpcurl \
  -plaintext \
  -import-path ./tmp/out \
  -proto cc/arduino/cli/commands/v1/commands.proto \
  127.0.0.1:50051 \
  cc.arduino.cli.commands.v1.ArduinoCoreService.Create
{
  "instance": {
    "id": 1
  }
}

Init:

grpcurl \
  -plaintext \
  -import-path ./tmp/out \
  -proto cc/arduino/cli/commands/v1/commands.proto \
  -d '{"instance": {"id": 1}}' \
  127.0.0.1:50051 \
  cc.arduino.cli.commands.v1.ArduinoCoreService.Init

Enumerate monitor port settings (FQBN is optional):

grpcurl -plaintext \
  -import-path ./tmp/out \
  -proto cc/arduino/cli/commands/v1/commands.proto \
  -d '{"instance":{"id":1}, "port_protocol":"serial", "fqbn":"esp32:esp32:esp32da"}' \
  localhost:50051 \
  cc.arduino.cli.commands.v1.ArduinoCoreService/EnumerateMonitorPortSettings
{
  "settings": [
    {
      "settingId": "stop_bits",
      "label": "Stop bits",
      "type": "enum",
      "enumValues": [
        "1",
        "1.5",
        "2"
      ],
      "value": "1"
    },
    {
      "settingId": "baudrate",
      "label": "Baudrate",
      "type": "enum",
      "enumValues": [
        "300",
        "600",
        "750",
        "1200",
        "2400",
        "4800",
        "9600",
        "19200",
        "31250",
        "38400",
        "57600",
        "74880",
        "115200",
        "230400",
        "250000",
        "460800",
        "500000",
        "921600",
        "1000000",
        "2000000"
      ],
      "value": "9600"
    },
    {
      "settingId": "bits",
      "label": "Data bits",
      "type": "enum",
      "enumValues": [
        "5",
        "6",
        "7",
        "8",
        "9"
      ],
      "value": "8"
    },
    {
      "settingId": "dtr",
      "label": "DTR",
      "type": "enum",
      "enumValues": [
        "on",
        "off"
      ],
      "value": "off"
    },
    {
      "settingId": "parity",
      "label": "Parity",
      "type": "enum",
      "enumValues": [
        "none",
        "even",
        "odd",
        "mark",
        "space"
      ],
      "value": "none"
    },
    {
      "settingId": "rts",
      "label": "RTS",
      "type": "enum",
      "enumValues": [
        "on",
        "off"
      ],
      "value": "off"
    }
  ]
}

This lists the supported settings, including baudrates like 750.

Create the monitor duplex:

grpcurl \
  -plaintext \
  -import-path ./tmp/out \
  -proto cc/arduino/cli/commands/v1/commands.proto \
  -d @ \
  127.0.0.1:50051 \
  cc.arduino.cli.commands.v1.ArduinoCoreService.Monitor

Open the monitor:

{
  "openRequest": {
    "instance": { "id": 1 },
    "fqbn": "esp32:esp32:esp32da",
    "port": {
      "address": "/dev/cu.usbserial-0001",
      "protocol": "serial"
    },
    "portConfiguration": {
      "settings": [
        { "settingId": "baudrate", "value": "74880" }
      ]
    }
  }
}

ⓘ Note that the monitor stream is opened with 74880 baudrate.

This works and data comes in from the board.

{
  "success": true
}
{
  "rxData": "KqtQqlRVC1WlC6XVVbVVolRFsBHPIse4gR7DYSADIzAB/g=="
}
{
  "rxData": "MA=="
}
{
  "rxData": "LjAyMDAJMA=="
}
// ...

But if I try to change the baudrate to 750 (which was listed as valid):

{
  "updatedConfiguration": {
    "settings": [
      { "settingId": "baudrate", "value": "750" }
    ]
  }
}

ⓘ I could not cause the error with other baudrates than 750, but I have not tried all.

I get this error:

{
  "error": "command 'configure' failed: invalid argument"
}

Expected behavior

  • If a baudrate is not actually supported, it should not appear in the list.
  • Or, if it cannot be detected reliably, the error should be more specific so clients can handle it.

Arduino CLI version

d5ef61d

Operating system

macOS

Operating system version

15.6.1

Additional context

  • Start the monitor connection with a 74880 baudrate.
  • Select the 750 baudrate to cause the error.

Issue checklist

  • I searched for previous reports in the issue tracker
  • I verified the problem still occurs when using the nightly build
  • My report contains all necessary details

Metadata

Metadata

Assignees

No one assigned

    Labels

    os: macosSpecific to macOS operating systemtopic: codeRelated to content of the project itselftype: imperfectionPerceived defect in any part of project

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions