Daten String aufteilen

Begonnen von Burny4600, 29 März 2022, 20:05:25

Vorheriges Thema - Nächstes Thema

Burny4600

Ich habe für meinen Counter den Datenstring soweit funktionsfähig aufgeteilt.
Nur am Schluss des Datenstrings (, <Modus> CRLF) habe ich einen Fehler, den ich nicht lösen konnte, weil mir keine Lösung eingefallen ist.

WiFiClient wifiClient;
PubSubClient mqttClient;
SoftwareSerial geigerCounterSerial(PIN_UART_RX, PIN_UART_TX);

int lastCPS = 0, currentCPS = 0;
int lastCPM = 0, currentCPM = 0;
float lastUSVHR = 0, currentUSVHR = 0;
unsigned long lastPublishMs = 0;



// ### CPS, #####, CPM, #####, uSv/hr, ###.##, <Modus> CRLF
// <Modus>  LOW – 60 Sekunden, FAST, INST

void publishValues() {
  char tmp[8];

  if (currentCPS != lastCPS) {
    sprintf(tmp, "%d", currentCPS);
    mqttClient.publish(MQTT_TOPIC_CPS, tmp, true);
  }
 
  if (currentCPM != lastCPM) {
    sprintf(tmp, "%d", currentCPM);
    mqttClient.publish(MQTT_TOPIC_CPM, tmp, true);
  }

  if (currentUSVHR != lastUSVHR) {
    sprintf(tmp, "%.2f", currentUSVHR);
    mqttClient.publish(MQTT_TOPIC_USVHR, tmp, true);
  }

  if (currentMODUS != lastMODUS) {
    sprintf(tmp, "%d", currentMODUS);
    mqttClient.publish(MQTT_TOPIC_MODUS, tmp, true);
  }

  lastCPS = currentCPS;
  lastCPM = currentCPM;
  lastUSVHR = currentUSVHR;
  lastMODUS = currentMODUS;

}

void parseReceivedLine(char* input) {
  char segment = 0;
  char *token;

  float cps = 0;
  float cpm = 0;
  float usvhr = 0;
 
  token = strtok(input, ", ");

  while (token != NULL) {

    switch (segment) {

      case IDX_CPS_KEY: if (strcmp(token, "CPS") != 0) return;  break;
      case IDX_CPM_KEY: if (strcmp(token, "CPM") != 0) return;  break;
      case IDX_USVHR_KEY: if (strcmp(token, "uSv/hr") != 0) return;  break;
      case IDX_MODUS_KEY: if (strcmp(token, " ") != 0) return;  break;

      case IDX_CPS:
        Serial.printf("Current CPS: %s\n", token);
        cps = atoi(token);
        break;
       
      case IDX_CPM:
        Serial.printf("Current CPM: %s\n", token);
        cpm = atoi(token);
        break;

      case IDX_USVHR:
        Serial.printf("Current uSv/hr: %s\n", token);
        usvhr = atof(token);
        break;

      case IDX_MODUS:
        Serial.printf("Current : %s\n", token);
        modus = atof(token);
        break;
  }

    if (segment > 7) {
      // Nicht mehr als 7 Segmente
      return;
    }

    token = strtok(NULL, ", ");
    segment++;
  }

  currentCPS = cps;
  currentCPM = cpm;
  currentUSVHR = usvhr;
  currentMODUS = modus;
   
}

Vielleicht hat jemand einen Tipp für mich.
Mfg Chris

Raspberry Pi 2/2+/3/3+/4 / Betriebssystem: Bullseye Lite
Schnittstellen: RFXtrx433E, SIGNALduino, MQTT, nanoCUL, HM-MOD-UART, 1-Wire, LAN, ser2net, FHEM2FEHEM
Devices: S.USV, APC-USV, Fronius Datalogger Web 2, FS20, IT, Resol VBUS & DL2, TEK603, WMR200, YouLess, Homematic, MQTT