![]() |
Bit Byte und shr
Hallöchen,
komm gerade nicht mit dem Bit-Shiften weiter.
Delphi-Quellcode:
Es geht um die zeile mit dem ***.
var
sCom: String; begin repeat STC(#113#0); STC(#106); ComPort1.ReadStr(sCom, 2); Application.ProcessMessages; until ((sCom[1] = #106) and (sCom[2] >= Char(32))); *** begin BitBtnLesen.Enabled := True; BitBtnSchreiben.Enabled := True; end; end; Und zwar hab ich mir folgendes vorgestellt:
Delphi-Quellcode:
So klappt es nicht.
((sCom[1] = #106) and (sCom[2] shr 32));
"[Fehler] Unit1.pas(248): Operator ist auf diesen Operandentyp nicht anwendbar" Grüsse, Daniel :hi: |
Code:
müsste einen boolean geben.
(sCom[1] = #106)
Code:
ein Byte.
(sCom[2] shr 32)
|
Hallo,
das bringt mir nichts. Ich lese zwei Bytes. Das erste Byte ist #106 und im zweiten Byte muss ich nachsehen ob das 6te Bit eine 1 ist. Grüsse, Daniel :hi: |
Delphi-Quellcode:
testet, ob byte eins 106 ist, und ob im zweiten das sechste bit gesetzt ist. Falls du das meinst.
until ((byte1 = #106) and ((byte2 and #64 {müsste das sechste bit sein}) = # 64))
|
Zitat:
Delphi-Quellcode:
Nur mit dem Unterschied, ich schaue ob der Wert des zweiten Bytes >= 32 ist. Den 32 ist Bit 6.
((sCom[1] = #106) and (sCom[2] >= {Char(32)} #32));
Grüsse, Daniel :hi: |
a) ist das ">=" falsch, dann kann ja auch nur das siebte gesetzt sein, du bräuchtest ein "="
b) gibt die erste Aktion (logical Operator) einen boolean, die zweite (bitwise Operation) ein bit. Danach macht das and in der Mitte einen Aufstand, weil schlecht
Delphi-Quellcode:
zu einem vernünftigen Ergebnis führen kann. Bei meiner Version sind beides booleans, und es sollte gehen.
if true and #27
|
((sCom[1] = #106) and ((sCom[2] and #32) = #32));
Bringt gleichen Fehler wie anfangs. Grüsse, Daniel :hi: |
Bei der rechten Hälfte musst du die "#" weglassen. Das "and" verlangt nach Integern.
Delphi-Quellcode:
if ((#106 = #106) and ((33 and 32) = 32)) then close; //beendet das Programm. Wurde von mir getestet und läuft!
|
Delphi-Quellcode:
Funktioniert. Man muss den Char nur in ein Byte typecasten. Das "<>0" anstatt dem "=32" spart ein klein wenig rechenzeit, da die interne Substraktion entfällt.
if ((sCom[1] = #106) and ((Byte(sCom[2]) and 32) <> 0)) then
|
Zitat:
Grüsse, Daniel :hi: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz