Meine folgende Funktion liest von einer seriellen Schnittstelle, verarbeitet die Daten und zeigt Informationen für den Benutzer an. Das Interessante ist, dass es nur funktioniert, wenn es an ungeraden Instanzen aufgerufen wird. Bei geraden Lesevorgängen tritt der Timeout-Fall auf.Funktion funktioniert jedes Mal, wenn es aufgerufen wird
Diese Funktion wird alle 10 Sekunden oder früher aufgerufen, wenn sie vom Benutzer aufgerufen wird. Egal wie oft es heißt, es wird jedes andere Mal funktionieren.
Code:
bool SR(bool echo, int&value)
{
bool valid;
byte buf [2];
auf einmal ruft red
kehrt 0
byte red = Serial2.readBytes(buf,2);
if(red>0)
{
Hier ist die „gute Daten“ Fall SvAdd
gibt mir die Absenderadresse während FCode
die Art der Nachricht dorthin geschickt gibt (sind 8 Arten von Nachrichten, aber wir verwenden nur die Typen 3 und 6)
valid=true;
byte SvAdd = buf[0];
byte FCode = buf[1];
int Read;
byte registerL;
switch (FCode)
{
case 3:
Daten für Fall 3 (read-only) erscheint in dieser Tabelle gezeigt:
Serial2.readBytes(buf,1);
registerL = buf[0];
for (byte i=(registerL/2); i>0 ; i--)
{
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
}
Vorerst registerL
sollte immer 2
sein aber habe ich die Schleife nur für den Fall
value=Read;
break;
case 6:
Daten für Fall 6 (schreiben, dann lesen) erscheint wie in dieser Tabelle gezeigt:
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
value=Read;
Ich kenne die Adresse an, damit ich an ihn gelesen und nur an den Datenbits sehen die korrekte Funktion zu überprüfen
break;
}
Aquire die letzten zwei CRC-Bytes aus der Funktion geschrieben wurde (löschen den Puffer)
Serial2.readBytes(buf,2);
int CRC = buf[1] | buf[0] << 8;
if (echo)
{
Serial.println(SvAdd);
Serial.println(FCode);
switch (FCode)
{
case 3:
Serial.println(registerL);
Serial.println(Read); //Last Value read
break;
case 6:
Serial.println(Read); //Value
break;
}
Serial.println(CRC);
}
return valid;
}
Hier ist der Fall, wenn red=0
else
{
valid=false;
Serial.println("timeout");
return valid;
}
}
EDIT (zusammenhängenden Code)
bool SR(bool echo, int&value)
{
bool valid;
byte buf [2];
byte red = Serial2.readBytes(buf,2);
if(red>0)
{
valid=true;
byte SvAdd = buf[0];
byte FCode = buf[1];
int Read;
byte registerL;
switch (FCode)
{
case 3:
Serial2.readBytes(buf,1);
registerL = buf[0];
for (byte i=(registerL/2); i>0 ; i--)
{
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
}
value=Read;
break;
case 6:
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
value=Read;
break;
}
Serial2.readBytes(buf,2);
int CRC = buf[1] | buf[0] << 8;
if (echo)
{
Serial.println(SvAdd);
Serial.println(FCode);
switch (FCode)
{
case 3:
Serial.println(registerL);
Serial.println(Read); //Last Value read
break;
case 6:
Serial.println(Read); //Value
break;
}
Serial.println(CRC);
}
return valid;
}
else
{
valid=false;
Serial.println("timeout");
return valid;
}
}
Es wäre viel einfacher, Ihren Code zu untersuchen, wenn er als einzelner zusammenhängender Block anstelle von Stücken gepostet würde. – TomServo
Entschuldigung, Bearbeitung jetzt –
@TomServo Zusammenhängender Block erstellt und am Ende hinzugefügt –