TC35 - Frage zu Signalstärke und Netzbetreiber..

Hallo,

ich betriebe schon längere Zeit einen Uno mit einem TC35 um damit div. Werte zu versenden... das klappt alles wunderbar.. Nun würde ich gerne diese Alarmanlage mit einem LCD Display erweitern auf dem die Signalstärke und der Netzbetreibe angezeigt werden.

die Abfrage dieser Werte ist ja jederzeit möglich.

Versuchsweise habe ich ein anderes TC35 via Hyperterm an den PC angeschlossen.

Als erhalte ich wenn ich z.B. at+csq sende als Antowrt: +csq: 11,99 wenn ich at+cops? sende erhalte ich als Antwort: +cops: (0,0,"vodafone D2")..

Meine Frage ist jetzt: Wie kann ich diese "Kommagetrennten" Werte vereinzeln und auf diese dann Einzeln zugreifen?

Ich würde jetzt evtl. ein char Array mit 5 Plätzen einrichten und dieses befüllen.

aber wie kann ich die Speicherplätze "vereinzeln" wenn ein "," gesendet wird müsste ich ja z.b. von Platz 0 auf Platz 1 wechseln usw.

Ich sitzt hier gerade irgendwie auf dem Schlauch...... das ganze ist aktuell noch "theoretisch" einen Code gibt es noch nicht, sind jetzt also nur Gedanke wie ich das machen könnte.

Danke für einen Denkanstoß!

Gruß Stefan

Das geht mit strtok() damit kannst du einen String anhand bestimmter Zeichen zerlegen siehe z.B.: C von A bis Z: strtok()

Aber ich denke, es geht noch um einiges einfacher: du könntest ja schon während des seriellen Einlesens von (Beispiel) +cops: (0,0,"vodafone D2") alles verwerfen, bis du auf das erste " stößt. Was danach kommt schiebst du in ein Char-Array (oder String) bis das zweite " ankommt. In dem Char-Array hast du dann genau was du haben willst, nämlich vorafone D2.

Zwei Optionen: 1.) strtok() + atoi() 2.) strchr() + atoi()

1.)

void setup()
{
  Serial.begin(9600);

  char csq[] = "+csq: 11, 99";
  char cops[] = "+cops: (1, 2,\"vodafone D2\")";

  char* ptr = strtok(csq, ":");
  ptr = strtok(NULL, ",");
  Serial.println(atoi(ptr));
  ptr = strtok(NULL, ",");
  Serial.println(atoi(ptr));

  ptr = strtok(cops, "(");
  ptr = strtok(NULL, ",");
  Serial.println(atoi(ptr));
  ptr = strtok(NULL, ",");
  Serial.println(atoi(ptr));
  ptr = strtok(NULL, ")");
  Serial.println(ptr);
}

void loop()
{
}

2.)

void setup()
{
  Serial.begin(9600);

  char csq[] = "+csq: 11, 99";
  char cops[] = "+cops: (1, 2,\"vodafone D2\")";

  char* ptr = strchr(csq, ':');
  Serial.println(atoi(++ptr));
  ptr = strchr(ptr, ',');
  Serial.println(atoi(++ptr));

  ptr = strchr(cops, '(');
  Serial.println(atoi(++ptr));
  ptr = strchr(ptr, ',');
  Serial.println(atoi(++ptr));
  ptr = strchr(ptr, '\"');
  *(strchr(++ptr, '\"')) = '\0';
  Serial.println(ptr);
}

void loop()
{
}

Wenn du nur den Vodafone String haben willst, dann reicht es wenn du gleich strchr(cops, '\"') machst um nach dem ersten Anführungszeichen zu suchen

@uxomm Wenn er nur das Einlesen wollen würde, dann ja. Aber er will noch andere Sachen einlesen. Und dann ist es doof wenn man sich immer andere Einlese-Funktionen schreiben muss. Da ist es mMn schöner wenn man die gleiche Einlese-Funktion für alles hat und immer nur andere Parse-Funktionen.

@Serenifyl

  1. natürlich hast du völlig recht
  2. by the way:
    Danke für deine unermüdliche Tätigkeit im Rahmen der Vermehrung des C/C++ Wissens in diesem Forum,

für deine ziemlich große Gelassenheit beim oftmaligen Wiederholen von bereits woanders Gesagtem und deinem immer wieder neuem Eingehen auf den Wissenslevel der Antwortsuchenden

und die vielen vielen Codeschnipsel (und mehr) von denen auch ich schon sehr oft profitiert habe (beim Mitlesen und “Aufmerken”).

Danke für die Antworten,

rein theoretisch könnte ich dann doch auch ein char array via einer schleife füllen?

also wenn Serielle Daten verfügbar sind (z.B. +cops: (0,0,"vodafone D2"))

dann lese ich solange Zeichen ein bis wie oben die ( kommt. dann speichere ich die nachfolgenden Zeichen im Array an Adr0 solange bis ein , kommt. wenn das Komma empfangen wurde, erhöhe ich die Array Adr. um 1, darin speichere ich dann wieder die die nachfolgenden Zeichen bis wieder ein , kommt.. usw. wenn dann irgendwann eine ) oder ein CR kommt beende ich die Schleife.

Habe ich das im groben so richtig verstanden?

Gibt es für die serielle Kommunikation irgendwo im Netz eine GUTE Seite (evtl. auf Deutsch)??

Die gesendeten Strings werden hier glaube ich mit einem LF abgeschlossen. Evtl. ein CR. Das steht im Datenblatt wo die Befehle erklärt sind. Dann liest man bis zu diesem Endzeichen und terminiert dann den String.

Den Code dafür habe ich hier schon zig mal gepostet: http://forum.arduino.cc/index.php?topic=359203.msg2486412#msg2486412

Relevant ist readSerial() und wie das in loop() ständig aufgerufen wird

Kann man dann so machen wenn man sicher sein will:

else if ((c == '\n' || c == '\r') && index > 0)

Das geht mit allem möglichen so. Auch mit dem Serial Monitor (immer gut zum Testen) oder Dateien von einer SD Karte lesen

Bei der Frage/Antwort Geschichte kann man einfach einen Zustands-Automaten außen herumbauen. So dass man erst im Zustand "Sende Kommando" ist und dann in den Zustand "auf Antwort warten" und dann in den Zustand "Antwort auswerten". Auch Fehler-Behandlung kann man so machen. Also z.B. abfragen ob "ERROR" zurückkommt und dann darauf reagieren.