Arduino (C-Sprache) Parsing String mit Delimiter (Eingabe über die serielle Schnittstelle)

8

Arduino (C-Sprache) Parsing String mit Delimiter (Eingabe über die serielle Schnittstelle)

Ich habe die Antwort hier nicht gefunden: /

Ich möchte an meine Arduino über eine serielle Schnittstelle (Serial.read ()) eine einfache Zeichenfolge aus drei Zahlen mit Komma getrennt senden. Diese drei Zahlen könnten von 0-255 reichen.

z. %Code% %Code% %Code% 255,255,255

Was ich tun muss, ist diese Zeichenfolge, die an Arduino gesendet wird, auf drei ganze Zahlen zu analysieren (sagen wir r, g und b).

Also wenn ich sende     100,50,30 Arduino wird es in

übersetzen %Vor%

Ich habe viele Codes ausprobiert, aber keiner von ihnen hat funktioniert. Das Hauptproblem besteht darin, eine Zeichenkette (Zeichenkette) in eine ganze Zahl zu übersetzen. Ich habe herausgefunden, dass es wahrscheinlich strtok_r für den Zweck des Begrenzers gibt, aber darum geht es.

Danke für Anregungen:)

    
user1461310 17.06.2012, 02:13
quelle

7 Antworten

16

Um die Frage zu beantworten, die Sie tatsächlich gestellt haben, sind String-Objekte sehr mächtig und können genau das tun, was Sie fragen. Wenn Sie Ihre Parsing-Regeln direkt von der Eingabe einschränken, wird Ihr Code weniger flexibel, weniger wiederverwendbar und leicht gewunden.

Strings haben eine Methode mit dem Namen indexOf (), mit der Sie nach dem Index im Zeichenfeld eines bestimmten Zeichens suchen können. Wenn das Zeichen nicht gefunden wird, sollte die Methode -1 zurückgeben. Ein zweiter Parameter kann dem Funktionsaufruf hinzugefügt werden, um einen Startpunkt für die Suche anzugeben. Da in Ihrem Fall die Trennzeichen Kommas sind, würden Sie Folgendes aufrufen:

%Vor%

Dann könnten Sie diesen Index verwenden, um eine Teilzeichenfolge mit der substring () -Methode der String-Klasse zu erstellen. Dies gibt einen neuen String zurück, der bei einem bestimmten Startindex beginnt und unmittelbar vor einem zweiten Index endet (oder dem Ende einer Datei, wenn keines angegeben ist). Du würdest also etwas schreiben wie:

%Vor%

Schließlich können die Integer-Werte mit der undokumentierten Methode toInt () der String-Klasse abgerufen werden:

%Vor%

Weitere Informationen zum String-Objekt und seinen verschiedenen Methoden finden Sie in der Arduino-Dokumentation .

    
dsnettleton 13.01.2013 18:57
quelle
4

Verwenden Sie sscanf ;

%Vor%

Verwenden Sie meinen Code hier, wenn Sie einen Stream von String ex analysieren möchten: 255,255,255 0,0,0 1,20,100 90,200,3 Parsing-Funktion für durch Kommas getrennte Zeichenfolge

    
sdao 03.02.2016 04:41
quelle
1

Ich denke, dass Sie so etwas tun wollen, um die Daten einzulesen:

%Vor%

Verwenden Sie dann atoi (), um die Daten in Ganzzahlen zu konvertieren und sie zu verwenden.

    
cstrutton 17.06.2012 06:35
quelle
1

Das ist großartig!

Der letzte Kommentar zu "threevalue = 0" ist wahr aus dem Code, der in der am häufigsten getippten Antwort von @dsnetleton angegeben wurde. Anstelle von "lastIndexOf (',');" , der Code sollte einfach eine "+1" zu "secondCommaIndex" wie @dsnetleton richtig für KommaIndex + 1 hinzufügen (fehlende +1 ist wahrscheinlich nur ein Tippfehler von dem Typ).

Hier ist das aktualisierte Stück Code

%Vor%

Beispiel)

Für einen myString="1,2,3"

  • commaIndex = 1 (Sucht aus dem Index 0, dem Punkt, den das Zeichen 1 einnimmt, bis zum ersten Komma)
  • secondCommaIndex = 3 (Sucht aus Index 2, dem Punkt, der von dem Zeichen 2 übernommen wurde, bis zum nächsten Komma)
  • firstValue liest vom Index 0-1="1"
  • secondValue liest vom Index 2-3="2"
  • dritter Wert liest von Index 4-4 (der letzte Indexpunkt der Zeichenfolge)="3"

Hinweis: Verwechseln Sie INDEX nicht mit der Länge der Zeichenfolge. Die Länge des Strings ist 5. Da der String indexOf ab 0 zählt, ist der letzte Index 4.

Der Grund warum nur

%Vor%

gibt 0 zurück, wenn .toInt () verwendet wird, weil thirdValue=", 3" und nicht "3" ist, was zu Int () führt.

ps. Es tut mir leid, alle Anweisungen zu schreiben, aber als Mech-eng, auch wenn ich manchmal möchte, dass jemand für mich Code für mich dumme Code vor allem in der Beratung seit den letzten 7 Jahren. Mach weiter so! Hilft den Leuten, mich zu mögen!

    
mct 08.11.2014 21:53
quelle
1

Am einfachsten benutze ich parseInt() , um diese Aufgabe zu erledigen:

%Vor%

macht den Trick.

    
R Zach 12.11.2014 03:10
quelle
-2

@cstrutton - Excellenter Vorschlag zur Verwendung von 'indexOf'. Das hat mir eine Menge Zeit für mein Projekt gespart. Ein kleiner Zeiger,

Ich bemerkte, dass der dritte Wert nicht angezeigt wurde (kam als ZERO zurück). Nachdem ich mit ihm ein wenig gespielt und das Dokument in Ссылка durchgegangen bin Ich erkannte, ich kann lastIndexOf für den letzten Wert verwenden.

Hier sind zwei Zeilen mit Modifikationen, die den richtigen dritten Wert liefern.

%Vor%     
user2234414 02.04.2013 03:27
quelle
-3
%Vor%     
fredrick 19.05.2016 06:09
quelle

Tags und Links