Seite 1 von 1

warum ist Byte.b nicht 8 Bit

Verfasst: 01.03.2025 01:55
von z3alf
Hallo Forum, ich mal wieder.

Laut Hilfe Basic Typen sollte ein Byte (1 Byte) sein, also 8 Bit

Code: Alles auswählen

Name | Erweiterung | Speicherverbrauch | Bereich 
Byte |   .b        |        1 Byte     | -128 bis +127 
Ascii|   .a        |        1 Byte     |  0 bis +255 
ich wundere mich dass empfangene Bytes an der seriellen Schnittstelle nicht gefiltert werden können.
ich dimensioniere ein Array

Code: Alles auswählen

Global Dim EmpfBytes.b(8096)
nach dem Empfang der Daten muss ich $EE herausfiltern, was aber nie geschieht !?
ich hab jetzt ein kleines Programm geschieben um ein Byte anzuzeigen...

Code: Alles auswählen

EnableExplicit

#Zeilenumbruch$ = Chr(13) + Chr(10)

Global StartByte.a = $EE
Global StartByteB.b = $EE

Global testtext$ = "StartByte.a = " +  Hex(StartByte.a) + #Zeilenumbruch$ + "StartByteB.b = " + Hex(StartByteB.b)

MessageRequester("Byte Demo", testtext$, #PB_MessageRequester_Ok | #PB_MessageRequester_Info)
Erwarten würde ich jetzt als Ausgabe
StartByte.a = EE
StartByteB.b = EE

die Ausgabe zeigt aber:
StartByte.a = EE
StartByteB.b = FFFFFFFFFFEE

das bedeutet das ein Byte 64 Bit (8 Bytes) lang ist, und nicht wie in der Hilfe 1 Byte = 8 Bit
wenn ich jetzt vergleiche
if EmpfBytes.b(i) = StartByteB.b

dann funktioniert das nicht weil ja scheinbar 64 Bit verglichen werden :shock:

Ist das ein Fehler in PureBasic ?

Gruß z3alf

Re: warum ist Byte.b nicht 8 Bit

Verfasst: 01.03.2025 02:19
von mk-soft
Bei Ausgabe von Hex musst du den Type angeben, sonst wird der Wert vor der Ausgabe zu Integer gewandelt.
Es ist immer noch ein Byte wert.

Code: Alles auswählen

EnableExplicit


Global StartByte.a = $EE
Global StartByteB.b = $EE

Global testtext$ = "StartByte.a = " +  Hex(StartByte.a, #PB_Ascii) + #LF$ + "StartByteB.b = " + Hex(StartByteB.b, #PB_Byte)

MessageRequester("Byte Demo", testtext$, #PB_MessageRequester_Ok | #PB_MessageRequester_Info)
Bei vergleichen musst du aufpassen da dieser bei Ganzzahlen immer auf Signed Interger gewandelt wird.
Da als Signed Byte $EE eine negative Zahl ist kommt es nach der Wandlung zu $FFFFFFFFFFEE
Und der Hex Wert $EE ist ein positiver Signed Integer Wert. Somit schlägt der Vergleich fehl
Daher immer mit Wert Filter Arbeiten

Code: Alles auswählen

EnableExplicit

Global UnsignedByte.a = $EE
Global SignedByte.b = $EE

Debug "UnsignedByte = " + UnsignedByte
Debug "SignedByte = " + SignedByte

; Vergleiche sind immer für Ganzzahlen Signed Integer, daher das Byte Filtern
If (SignedByte & $FF) = $EE
  Debug "Ok"
Else
  Debug "False"
EndIf

; Hier ist es besser ein unsigned byte zu nehmen
If UnsignedByte = $EE
  Debug "Ok"
Else
  Debug "False"
EndIf
Bin aber auch schon öfters bei vergleichen drüber gestolpert.

Re: warum ist Byte.b nicht 8 Bit

Verfasst: 01.03.2025 02:45
von z3alf
Ok, das ist dann für die Funktion Hex()

aber was ist mit dem Vergleich ?

Code: Alles auswählen

#StartByte = $EE
Global Dim Zeichenkette.b(8096)
...
...
If Zeichenkette.b(Zaehler.i) = #StartByte
   SetGadgetText(#COMStartByteHandle, "EE " +  Str(eezaehler.i) + ":" + Str(GesamtZaehler))
EndIf
die IF -Abfrage wird nie true
ich hab jetzt mal das Array als Zeichenkette.a(8096) Ascii deklariert, dann klappt es !?

Code: Alles auswählen

#StartByte = $EE
Global Dim Zeichenkette.a(8096)
...
...
If Zeichenkette.a(Zaehler.i) = #StartByte
   SetGadgetText(#COMStartByteHandle, "EE " +  Str(eezaehler.i) + ":" + Str(GesamtZaehler))
EndIf
Warum klappt es nicht mit Byte ?

Re: warum ist Byte.b nicht 8 Bit

Verfasst: 01.03.2025 02:50
von mk-soft
Noch wach ;)

Habe mein Beitrag ergänzt

Re: warum ist Byte.b nicht 8 Bit

Verfasst: 01.03.2025 03:12
von z3alf
wäre gut wenn da etwas in der Hilfe bei If stehen würde,
bzw. in der Tabelle Basic Typen
oder unter Operator =

Danke erst mal für den Tip :wink:
dann kann ich jetzt beruhigt ins Bett gehen

Re: warum ist Byte.b nicht 8 Bit

Verfasst: 01.03.2025 20:26
von PIC18F2550
Mach doch eine Subtraktion und teste auf 0.

Re: warum ist Byte.b nicht 8 Bit

Verfasst: 02.03.2025 16:25
von mk-soft
PIC18F2550 hat geschrieben: 01.03.2025 20:26 Mach doch eine Subtraktion und teste auf 0.
Kommt keine null raus ...

Re: warum ist Byte.b nicht 8 Bit

Verfasst: 02.03.2025 20:53
von SMaag
wäre gut wenn da etwas in der Hilfe bei If stehen würde,
bzw. in der Tabelle Basic Typen
oder unter Operator =
Steht doch drin!
. b Byte -128 .. +127
.a 0..255 ASCII bzw. unsinged Byte

EE = 238 dezimal, das geht nicht mit signed Byte -128..127, das geht nur mit unsigned Byte
EE = -18 wenn man es in ein signed byte schreibt

Du versuchst also immer ein signed Byte mit einem unsigned Byte zu vergleichen.
Unsigned kann aber nie negativ sein, deshalb geht es auch nicht.

Bei PB und in der Doku ist da nichts falsch und es fehlt auch nichts!

Re: warum ist Byte.b nicht 8 Bit

Verfasst: 02.03.2025 21:53
von mk-soft
Ich weiss nicht ob bei Vergleichs-Operation steht das diese auf integer sind ...
Also war die Frage schon richtig