DFU mode not working

RUI3 RAK4631-R

After uploading custom firmware I couldn’t upload another firmware, this happened to me when I changed Serial.begin(115200); to Serial.begin(115200, RAK_CUSTOM_MODE);

#include <Arduino.h>
//#include <RAKOneWireSerial.h> // Asegúrate de tener esta biblioteca si la usas

// Definición del tamaño del buffer circular
#define BUFFER_SIZE 256

// Inicialización del objeto RAKOneWireSerial para el puerto UART1
RAKOneWireSerial onewire(UART1_RXD_PIN, NULL);

// Buffer circular
char buffer[BUFFER_SIZE];
int head = 0;
int tail = 0;

// Puerto de datos
const int fport = 1; // Ajusta este valor según tu configuración de LoRaWAN

void setup() {
    // Inicia la comunicación serial para la depuración en el monitor serial
    Serial.begin(115200, RAK_CUSTOM_MODE);
    
    // Inicia la comunicación serial en el puerto UART1 a 9600 baudios
    onewire.begin(9600, RAK_CUSTOM_MODE);

    // Configura el puerto serial para los comandos AT
    Serial1.begin(9600); // Ajusta la velocidad según sea necesario
}

void loop() {
    // Verifica si hay datos disponibles en onewire
    while (onewire.available()) {
        // Leer un carácter desde onewire
        char a = onewire.read();
        
        // Añadir el carácter al buffer circular
        buffer[head] = a;
        head = (head + 1) % BUFFER_SIZE;

        // Imprimir los datos recibidos en formato hexadecimal para depuración
        Serial.printf("0x%02X ", a);
        
        // Verificar si hemos recibido un fin de línea (indicando el fin del mensaje)
        if (a == '\n') {
            // Procesar los datos recibidos
            processData();
        }
    }

    delay(10000); // Esperar 10 segundos antes de enviar el siguiente paquete
}

void processData() {
    // Construir una cadena a partir del buffer
    String dataStr = "";
    int current = tail;

    // Leer desde el buffer circular hasta el head
    while (current != head) {
        dataStr += buffer[current];
        current = (current + 1) % BUFFER_SIZE;
    }
    
    // Limpiar el buffer después de leer
    tail = head;
    
    // Imprimir los datos recibidos
    Serial.println("\nDatos recibidos: " + dataStr);

    // Procesar los datos
    if (processFields(dataStr.c_str())) {
        Serial.println("Datos procesados correctamente.");
    } else {
        Serial.println("Error al procesar los datos: número de campos incorrecto.");
    }
}

bool processFields(const char* data) {
    String dataStr = String(data);
    int numFields = 0;
    
    // Contar el número de campos separados por ';'
    for (int i = 0; i < dataStr.length(); i++) {
        if (dataStr[i] == ';') {
            numFields++;
        }
    }
    
    // Verificar que el número de campos sea el correcto (13 delimitadores ';' => 14 campos)
    if (numFields != 13) {
        return false; // Número de campos incorrecto
    }

    // Procesar los campos
    int index = 0;
    String fields[14];
    while (dataStr.indexOf(';') != -1) {
        int pos = dataStr.indexOf(';');
        fields[index++] = dataStr.substring(0, pos);
        dataStr = dataStr.substring(pos + 1);
    }
    fields[index] = dataStr; // Último campo

    // Eliminar los puntos decimales de los campos que contienen números
    fields[2].replace(".", "");
    fields[3].replace(".", "");
    fields[4].replace(".", "");
    fields[5].replace(".", "");
    fields[7].replace(".", "");

    // Convertir los campos a enteros
    int width = fields[2].toInt();
    int length = fields[3].toInt();
    int height = fields[4].toInt();
    int volume = width + length + height;
    int weight = fields[7].toInt();
    long barcode = fields[8].toInt(); // Convertir barcode a entero largo
    long measurementID = fields[11].toInt(); // Convertir measurementID a entero largo

    // Convertir datos a hexadecimal
    String hexVolume = intToHex(volume);
    String hexWeight = intToHex(weight);
    String hexBarcode = intToHex(barcode);
    String hexMeasurementID = intToHex(measurementID);

    // Concatenar los datos hexadecimales
    String concatenatedHex = hexVolume + hexWeight + hexBarcode + hexMeasurementID;

    // Imprimir los resultados
    Serial.println("Volumen (hex): " + hexVolume);
    Serial.println("Weight (hex): " + hexWeight);
    Serial.println("Barcode (hex): " + hexBarcode);
    Serial.println("MeasurementID (hex): " + hexMeasurementID);
    Serial.println("Concatenated Hex: " + concatenatedHex);

    // Enviar los datos a LoRaWAN
    sendDataToLoRaWAN(concatenatedHex);

    return true; // Campos procesados correctamente
}

void sendDataToLoRaWAN(const String& hexData) {
    // Preparar el payload como un array de bytes
    int length = hexData.length() / 2; // Cada par de caracteres hexadecimales representa un byte
    byte payload[length];
    for (int i = 0; i < length; i++) {
        payload[i] = strtol(hexData.substring(i * 2, i * 2 + 2).c_str(), NULL, 16);
    }

    // Enviar el payload usando la API de LoRaWAN
    api.lorawan.send(length, payload, fport);

    // Confirmar envío
    Serial.println("Datos enviados a LoRaWAN: " + hexData);
}

// Función para convertir un entero a hexadecimal sin ceros a la izquierda
String intToHex(long value) {
    char hexStr[17]; // Para un entero largo de hasta 16 dígitos hexadecimales
    snprintf(hexStr, sizeof(hexStr), "%lX", value); // Convertir a hexadecimal sin ceros a la izquierda
    return String(hexStr);
}

error when uploading firmware

Please see the build logs in output path: c:\Users\amora\Documents\DemoRS232\build

2024-09-14 00:47:19,893 Using board at serial port: COM15

2024-09-14 00:47:19,899 Sending Application image.

Traceback (most recent call last):

File "nordicsemi\dfu\dfu_transport_serial.py", line 198, in open

File "serial\serialwin32.py", line 33, in __init__

File "serial\serialutil.py", line 244, in __init__

File "serial\serialwin32.py", line 80, in open

File "serial\serialwin32.py", line 222, in _reconfigure_port

serial.serialutil.SerialException: Cannot configure port, something went wrong. Original message: PermissionError(13, 'A device attached to the system is not functioning.', None, 31)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File "nordicsemi\__main__.py", line 1545, in <module>

File "click\core.py", line 1137, in __call__

File "click\core.py", line 1062, in main

File "click\core.py", line 1668, in invoke

File "click\core.py", line 1668, in invoke

File "click\core.py", line 1404, in invoke

File "click\core.py", line 763, in invoke

File "nordicsemi\__main__.py", line 1063, in serial

File "nordicsemi\__main__.py", line 980, in do_serial

File "nordicsemi\dfu\dfu.py", line 127, in dfu_send_images

File "nordicsemi\dfu\dfu.py", line 88, in _dfu_send_image

File "nordicsemi\dfu\dfu_transport_serial.py", line 202, in open

pc_ble_driver_py.exceptions.NordicSemiException: Serial port could not be opened on COM15. Reason: None

[14272] Failed to execute script '__main__' due to unhandled exception!

IntelliSense configuration already up to date. To manually rebuild your IntelliSense configuration run "Ctrl+Alt+I"

I think I made a mistake in putting both serial numbers in custom mode, is there a way to manually start the RAK 4631-R in DFU mode?

I hope you can help me recover the RAK4631-RI hope you can help me recover the RAK4631-R

It was my mistake, I already solved it,

I used AT+ATM command and it let me use AT command

This topic was automatically closed 10 days after the last reply. New replies are no longer allowed.