warum ist Byte.b nicht 8 Bit

Für allgemeine Fragen zur Programmierung mit PureBasic.
z3alf
Beiträge: 5
Registriert: 01.05.2022 14:39

warum ist Byte.b nicht 8 Bit

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: warum ist Byte.b nicht 8 Bit

Beitrag 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.
Zuletzt geändert von mk-soft am 01.03.2025 02:49, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
z3alf
Beiträge: 5
Registriert: 01.05.2022 14:39

Re: warum ist Byte.b nicht 8 Bit

Beitrag 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 ?
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: warum ist Byte.b nicht 8 Bit

Beitrag von mk-soft »

Noch wach ;)

Habe mein Beitrag ergänzt
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
z3alf
Beiträge: 5
Registriert: 01.05.2022 14:39

Re: warum ist Byte.b nicht 8 Bit

Beitrag 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
Benutzeravatar
PIC18F2550
Beiträge: 104
Registriert: 29.04.2024 09:10
Computerausstattung: Server HP Proliant G7
PC AMD FX(tm)-9590, 64Gb Ram, 2x 2TB Raid5 SAS

Re: warum ist Byte.b nicht 8 Bit

Beitrag von PIC18F2550 »

Mach doch eine Subtraktion und teste auf 0.
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: warum ist Byte.b nicht 8 Bit

Beitrag von mk-soft »

PIC18F2550 hat geschrieben: 01.03.2025 20:26 Mach doch eine Subtraktion und teste auf 0.
Kommt keine null raus ...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: warum ist Byte.b nicht 8 Bit

Beitrag 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!
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: warum ist Byte.b nicht 8 Bit

Beitrag von mk-soft »

Ich weiss nicht ob bei Vergleichs-Operation steht das diese auf integer sind ...
Also war die Frage schon richtig
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten