From 5ae054f3140390dd89ce501adb9341a4a7aa7e02 Mon Sep 17 00:00:00 2001 From: Marcel Peterkau Date: Fri, 31 May 2024 13:59:11 +0200 Subject: [PATCH] improved UART Parser for LoRa --- Software/src/lora_net.cpp | 41 +++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/Software/src/lora_net.cpp b/Software/src/lora_net.cpp index 3ee05ee..c1efac4 100644 --- a/Software/src/lora_net.cpp +++ b/Software/src/lora_net.cpp @@ -79,7 +79,7 @@ void LoRa_Process() if (e220ttl.available() > 1) { ResponseContainer rc = e220ttl.receiveMessageRSSI(); - // Is something goes wrong print error + // If something goes wrong, print error if (rc.status.code != 1) { Serial.println(rc.status.getResponseDescription()); @@ -96,34 +96,45 @@ void LoRa_Process() #elif defined(FEATURE_ENABLE_UARTLORA) static char packageInput[32]; - static bool packageRecieved = false; + static bool packageReceived = false; static unsigned int bufferPtr = 0; - int recievedSize = 0; + int receivedSize = 0; - while (SerialLoRa.available() && packageRecieved == false) + while (SerialLoRa.available() && !packageReceived) { if (bufferPtr < sizeof(packageInput) - 1) { - packageInput[bufferPtr] = SerialLoRa.read(); - packageInput[bufferPtr + 1] = 0; // always terminate String + char c = SerialLoRa.read(); + packageInput[bufferPtr] = c; + packageInput[bufferPtr + 1] = '\0'; // always terminate string - if (packageInput[bufferPtr] == '\n') + if (c == '\n') { - packageRecieved = true; - recievedSize = bufferPtr; + packageReceived = true; + receivedSize = bufferPtr; bufferPtr = 0; Debug_pushMessage("Got LoRa UART: %s\n", packageInput); } - else if ((packageInput[bufferPtr] >= 0x30) || (packageInput[bufferPtr] <= 0x5A)) // only accept Numbers, UpperCase-Letters and some special chars + else if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c == ' ' || c == ',' || c == '.')) // Accept numbers, uppercase letters, and some special chars { bufferPtr++; } + else + { + Debug_pushMessage("Invalid character received: %c\n", c); + } + } + else + { + Debug_pushMessage("Buffer overflow. Resetting buffer.\n"); + bufferPtr = 0; } } - if (packageRecieved) { - Parse_LoRa_UartCommand(packageInput, recievedSize); - packageRecieved = false; + if (packageReceived) + { + Parse_LoRa_UartCommand(packageInput, receivedSize); + packageReceived = false; } #endif @@ -251,14 +262,14 @@ void Parse_LoRa_UartCommand(char input[], int size) while (ptr != NULL) { strncpy(command, ptr, sizeof(command) - 1); // Platz für Nullterminator lassen - command[sizeof(command) - 1] = '\0'; // Nullterminator setzen + command[sizeof(command) - 1] = '\0'; // Nullterminator setzen ptr = strtok(NULL, delimiter); if (ptr != NULL) { strncpy(value, ptr, sizeof(value) - 1); // Platz für Nullterminator lassen - value[sizeof(value) - 1] = '\0'; // Nullterminator setzen + value[sizeof(value) - 1] = '\0'; // Nullterminator setzen } else {