Daten vom Arduino via Seriellen Port zerstückelt

Hallo zusammen,

ich habe nocheinmal eine Frage bezgl. Anbindung des Arduinos via USB.

Die Anbindung ist via USB -> Serial Port Instanz --> Register Variable gelöst.
Jedoch kommen die Daten zerstückelt an. In der Debug Ansicht erhalte ich für einen übermittelten String des Arduinos, mehrere Zeilen:
Beispiel:
15:05:05 Received T1:
15:05:05 Received 22,
15:05:05 Received 8 C
15:05:06 Received ;F1
15:05:06 Received :
15:05:06 Received 48,0 %
15:05:07 Received ;T2:

Als ob IPS da ein Return einfügt. Es ist auch selten das gleiche Schema.

In der Arduino Console sieht das Ganze i.O. aus.
Beispiel:
T1:22,8 C;F1:48,0 %;T2:…

Kann mir jemand behilflich sein?

Viele Grüße

Steve

Da die Daten scheinbar schön sekündlich getrennt voneinander eintreffen, hält sich der Aufwand in Grenzen und du musst die Daten nicht exploden, aber extrahieren.

Lege dazu noch eine Cutter-Instanz zwischen Seriellem Port und der Registervariable und weisen der als rechte Trennzeichen 0D 0A für Semikolon (:wink: zu.
Also, Serial Port Instanz --> Cutter-Instanz --> Register Variable --> Script >>> Variablen.

Für jeden T-Wert legst du eine Floatvariable an und weist das Profil ~Temperature zu.
Für jeden F-Wert legts du eine Integervariable an und weist das Profil ~Humidity zu.

In der Registervariable trägst du folgendes Script (IDs der Varaiblen noch ergänzen) als Ziel ein und dann sollte das funktionieren:


<?
// Cutter-Instanz zwischen Serial-Port und Registervariable anlegen (Rechtes Trennzeichen hex: 0D 0A)
// Für jeden Temperatur-Wert eine Float-Variable anlegen und entsprechendes Profil für Temperatur (~Temperature) zuweisen
// Für jeden Luftfeuchte-Wert eine Integer-Variable anlegen und entsprechendes Profil Luftfeuchtigkeit (~Humidity) zuweisen


// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($_IPS['SENDER'] == "RegisterVariable")
{
  	// bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  	$data  = RegVar_GetBuffer($_IPS['INSTANCE']);
  	$data .= $_IPS['VALUE'];

   if (substr($data, 0, -8) == "T1")
  	SetValueFloat(ID-Floatvariable von T1 ,floatval(substr($data, -7, 4)));  // Temperatur T1
  	else if (substr($data, 0, -8) == "F1")
  	SetValueInteger(ID-Intvariable von F1 ,intval(substr($data, -7, 4)));  // Feuchte F1
  	else if (substr($data, 0, -8) == "T2")
  	SetValueFloat(ID-Floatvariable von T2 ,floatval(substr($data, -7, 4)));  // Temperatur T2
  	else if (substr($data, 0, -8) == "F2")
  	SetValueInteger(ID-Intvariable von F2 ,intval(substr($data, -7, 4)));  // Feuchte F2

 	// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
  	RegVar_SetBuffer($_IPS['INSTANCE'], "");
}
?>

Ich hoffe, ich habe nichts vergessen :confused::smiley:

Wow!
Danke, das werde ich mal testen.

Vielen vielen Dank !

Gruß Steve

Naja, teste erstmal;)
War nur so aus’m Kopf für den Anfang…sind bestimmt noch Fehler in der Praxis drin.

Hallo,

die Idee mit dem Cutter funzt wunderbar! Vielen Dank dafür. :smiley:

Viele Grüße und nochmals vielen Dank

Steve