How could the main.cpp read the parameters at platformio.ini?

You can push the upload settings in its environment, then the build environment which uses it extends it, and then you can generate build_flags additionally. See docs regarding e.g. common_env_data.

I tested this technique with a minimal platformio.ini and an Uno

[upload_settings]
upload_port = COM14
upload_speed = 115200
monitor_speed = 9600

[env:uno]
platform = atmelavr
board = uno
framework = arduino 
; automatically inherit attributes from upload_settings
extends = upload_settings
; make some settings visible as macros
; string-escape string values, integers are passed as normal
build_flags = 
  -D UPLOAD_PORT=\"${upload_settings.upload_port}\"
  -D UPLOAD_SPEED=${upload_settings.upload_speed}
  -D MONITOR_SPEED=${upload_settings.monitor_speed}

code

#include <Arduino.h>
void setup() {
    Serial.begin(9600);
    Serial.println("This firmware was uploaded from " + String(UPLOAD_PORT));
    Serial.println("At " + String(UPLOAD_SPEED) + " baud.");
    Serial.println("Monitor speed was " + String(MONITOR_SPEED) + " baud.");

}
void loop() {}

prints

This firmware was uploaded from COM14
At 115200 baud.
Monitor speed was 9600 baud.

For your concrete platformio.ini you can e.g. try…

[upload_settings]
upload_port = COM15
upload_speed = 115200
monitor_speed = 9600

[env:wiscore_rak4631]
platform = nordicnrf52
board = wiscore_rak4631
framework = arduino
lib_deps = 
    ArduinoModbus
    closedcube/ClosedCube OPT3001@^1.1.2
    boschsensortec/BSEC Software Library @ ^1.6.1480
    beegee-tokyo/SX126x-Arduino@^1.2.1
build_flags =
   -L".pio/libdeps/wiscore_rak4631/BSEC Software Library/src/cortex-m4/fpv4-sp-d16-hard"
   -DREGION_AU915
   -D UPLOAD_PORT=\"${upload_settings.upload_port}\"
   -D UPLOAD_SPEED=${upload_settings.upload_speed}
   -D MONITOR_SPEED=${upload_settings.monitor_speed}
extends = upload_settings
3 Likes