Hallo Gemeinde,
nachdem ich meinen Code geschrieben habe und er läuft, möchte ich nun diesen optimieren.
Eine Function startet wenn serielle Daten ankommen. Diese erhalte ich von einem System als Byte Werte.
Ich muss diese zusammenstellen, auswerten und entsprechend ausgeben. Die Werte kommen von einer Wetterstation.
Syntax:
Das Protokoll fängt immer mit "FF FF" an und endet mit der Checksum von den "lower byte" Also chskum "1AB" ergibt "AB" als chksum
Jedoch erhalte ich die Daten nicht immer gleich komplett. Ich muss also mit einer Variable den Inhalt halten, bis entweder ein String mit FF FF anfängt oder der letzte Hex Wert die passende chksum ist
Ich wandle gleich in Binär weil ich später einzelne Bits der jeweiligen Bytes auswerten muss.
So ist zum Beispiel das 6. Bit vom 4 Byte ob die Batterie vom Funksender schwach ist.
Kann man hier optimieren? Das ganze läuft einen kleinen IndustriePC und ich möchte CPU Last sparen.
Danke!!
nachdem ich meinen Code geschrieben habe und er läuft, möchte ich nun diesen optimieren.
Eine Function startet wenn serielle Daten ankommen. Diese erhalte ich von einem System als Byte Werte.
Ich muss diese zusammenstellen, auswerten und entsprechend ausgeben. Die Werte kommen von einer Wetterstation.
Syntax:
Das Protokoll fängt immer mit "FF FF" an und endet mit der Checksum von den "lower byte" Also chskum "1AB" ergibt "AB" als chksum
Jedoch erhalte ich die Daten nicht immer gleich komplett. Ich muss also mit einer Variable den Inhalt halten, bis entweder ein String mit FF FF anfängt oder der letzte Hex Wert die passende chksum ist
Java:
public void onSerialdata(Event in) {
// Daten vom Eingang abrufen
byte[] SerialData = in.getByteArray("bytes", new byte[1]);
// Wenn Anfang "FF FF" ist, temporären Speicher löschen und bei 0 beginnen
// count hält immer die Anzahl der im Speicher liegenden Daten
if(SerialData[0]==-1 & SerialData[1]==-1){
Binary = new String[30];
count = 0;
}
// alle Bytes in Binär decodieren und in Array Binary speichern/halten
// count zählt die Anzahl mit
for(byte by: SerialData){
Binary[count] = toBinaryString(by);
count++;
}
// sum für Chksum definieren
int sum = 0;
// Alle Werte zusammenzählen und als Integer speichern
for(int u = 0;u<=count-2;u++){
sum = sum + Integer.parseInt(Binary[u],2);
}
// Die Binary Werte in Hex umrechnen
String hSum = Integer.toHexString(sum);
String hChksum = Integer.toHexString(Integer.parseInt(Binary[count-1],2));
//Wenn Checksum korrekt ist, Stringfolge auswerten
if(Right(hSum,2).compareTo(hChksum)==-1){
count = 0;
// Winddaten
if(Binary[2].compareTo("00000000")==0){
--- SKIP
Ich wandle gleich in Binär weil ich später einzelne Bits der jeweiligen Bytes auswerten muss.
So ist zum Beispiel das 6. Bit vom 4 Byte ob die Batterie vom Funksender schwach ist.
Java:
public static String toBinaryString(byte n) {
StringBuilder sb = new StringBuilder("00000000");
for (int bit = 0; bit < 8; bit++) {
if (((n >> bit) & 1) > 0) {
sb.setCharAt(7 - bit, '1');
}
}
return sb.toString();
}
public static String Right(String text, int length)
{
return text.substring(text.length() - length, length);
}
Kann man hier optimieren? Das ganze läuft einen kleinen IndustriePC und ich möchte CPU Last sparen.
Danke!!