Aktuelle Zeit: 09.12.2019 03:50

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Teile einer Quad per Poke in den Speicher
BeitragVerfasst: 04.11.2019 16:50 
Offline
Benutzeravatar

Registriert: 27.01.2016 11:08
Wohnort: BY
Hallo,

ich habe hier mehrere Quad-Variablen, welche ein codiertes Bitmuster darstellen.
Ich muss nun die unteren 48 Bit an verschiedene Bereiche per Poke in den Speicher schreiben.
(Das ganze wird ein spezielles Binärdaten-Telegramm, welches anschließend verschickt wird.)

Beispiel:
Code:
var.q = $123456789ABC

PokeW(*buf + 50, (var & $00000000ffff))
PokeW(*buf + 48, (var & $0000ffff0000) >> 16)
PokeW(*buf + 46, (var & $ffff00000000) >> 32)


Leider funktioniert dies so nicht, da PB wohl Probleme beim casten von Quad nach Word besitzt.
Wie kann ich dies dennoch realisieren?

Danke und schöne Grüße

_________________
Never change a running system - Never run a changed system!
(PB 5.62 [x86] und PB 5.71 [x86])


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Teile einer Quad per Poke in den Speicher
BeitragVerfasst: 04.11.2019 17:01 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Mal 'ne ganz simple Idee, aber ich bin nicht sicher, ob die Reihenfolge damit stimmt:
Code:
var.q = $123456789ABC

CopyMemory(@var, *buf + 46, 6)

_________________
Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 19.04 LTS x64, PureBasic 5.71 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Teile einer Quad per Poke in den Speicher
BeitragVerfasst: 04.11.2019 17:08 
Offline
Benutzeravatar

Registriert: 27.01.2016 11:08
Wohnort: BY
NicTheQuick hat geschrieben:
Mal 'ne ganz simple Idee, aber ich bin nicht sicher, ob die Reihenfolge damit stimmt:
Code:
var.q = $123456789ABC

CopyMemory(@var, *buf + 46, 6)


OK, das Beispiel war wohl zu einfach.. :wink:

Ich habe auch einzelne Bits, welche "wild geschoben" und kopiert werden müssen..

_________________
Never change a running system - Never run a changed system!
(PB 5.62 [x86] und PB 5.71 [x86])


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Teile einer Quad per Poke in den Speicher
BeitragVerfasst: 04.11.2019 17:18 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Unter den Stichworten "setbit" und "getbit" findest du hier im Forum schon gute Codeschnipsel. Möglicherweise ist das dann schon alles, was du brauchst. Hier mal einer der vielen, in dem ich auch selbst mitgewirkt habe: einzelne Bits schnell lesen / schreiben

_________________
Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 19.04 LTS x64, PureBasic 5.71 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Teile einer Quad per Poke in den Speicher
BeitragVerfasst: 04.11.2019 17:28 
Offline
Benutzeravatar

Registriert: 27.01.2016 11:08
Wohnort: BY
Diese Routinen habe ich mir schon angesehen.
Das Ganze wäre dann mehr ein Workaround, statt performanter und effektiver Code.

Eine andere und einfache Möglichkeit (wie z.B. in C) gibt es also wirklich nicht?

_________________
Never change a running system - Never run a changed system!
(PB 5.62 [x86] und PB 5.71 [x86])


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Teile einer Quad per Poke in den Speicher
BeitragVerfasst: 04.11.2019 17:51 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
In C kann man sehr gut mit einzelnen Bits arbeiten, wenn man Strukturen verwendet. Das geht so leider nicht in Purebasic.

Aber vielleicht fällt dem einen oder anderen hier ja noch was ein, wenn du ein entsprechendes Beispiel in C zeigen kannst. Oder auch gerne ein ausführbarer Purebasic-Testcode, damit die Helfer hier möglichst wenig Vorarbeit leisten müssen um dir zu helfen.

_________________
Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 19.04 LTS x64, PureBasic 5.71 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Teile einer Quad per Poke in den Speicher
BeitragVerfasst: 04.11.2019 19:49 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Geht auch einfacher ohne Poke...
Code:
Structure udtSplitQuad
  StructureUnion
    a.a[8]
    u.u[4]
    l.l[2]
    q.q
  EndStructureUnion
EndStructure

Define qVal.q
Define *qVal.udtSplitQuad

*qVal = @qVal

*qVal\u[0] = $FFFF
Debug qVal
Debug RSet(Hex(qval, #PB_Quad), 16, "0")


Nicht vergessen... Low- Highbyte notation

Somit ist im Speicher das erste Word (*qVal\u[0]) das Low-Word

P.S.
Wenn es ein Protokoll ist, baue dir doch die passende Struktur dafür

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Teile einer Quad per Poke in den Speicher
BeitragVerfasst: 05.11.2019 00:26 
Offline
Kommando SG1
Benutzeravatar

Registriert: 01.11.2005 13:34
Wohnort: Glienicke
hier mal meine Lösung, die "alle" Probleme wie Sign-Shift usw. bereits gefixt hat:
Structure bitweise füllen / abfragen
GetBit(*Buffer.AllTypes, Position.i, Length.i=1) gibt eine Bit-Sequence der Länge "Length" ab der Position "Position" des Puffers "*Buffers" zurück.
SetBit(*Buffer.AllTypes, Position.i, Value.q, Length.i=1) arbeitet ähnlich.

_________________
Bild
 
BildBildBild


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye