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