Probleme mit eingebundener Funktion

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

BladeRunner

Moderator

Betreff: Probleme mit eingebundener Funktion

BeitragSa, Sep 12, 2015 10:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo meine Lieben.
Folgende Situation: Ich möchte mein PC-DSO (ein Hantek 6022BL) per BMax ansprechen. Der Hersteller liefert eine (sehr dürftige) Dokumentation zur API mit, die zwar die einzelnen Funktionen der .dll beschreibt aber nicht wirklich den konkreten Anwendungsfall.
Fairerweise muss man anmerken dass die .dll aus grade mal zwei Händen voll von Funktionen besteht von denen die meisten eigentlich selbsterklärend sind.

Leider macht mir aber grade die zentrale Funktion, das einlesen der Daten, echt Kopfschmerz, denn die stürzt mit einer MAV ab.

So ist die Funktion eingebunden:
BlitzMax: [AUSKLAPPEN]
Global dsoReadHardData:Short(DeviceIndex:Short , pCH1Data:Short Ptr , pCH2Data:Short Ptr , nReadLen:Long , ..
pCalLevel:Short Ptr , nCH1VoltDIV:Int , nCH2VoltDIV:Int , nTrigSweep:Short , nTrigSrc:Short , ..
nTrigLevel:Short , nSlope:Short , nTimeDIV:Int , nHTrigPos:Short , nDisLen:Long , ..
nTrigPoint:Long Ptr , nInsertMode:Short) "win32" = GetProcAddress(dso , "dsoReadHardData")


Und hier kurz noch die Beschreibung aus dem Manual zur Funktion:
BlitzMax: [AUSKLAPPEN]
Rem
Parameter:
unsigned short DeviceIndex: Device index value
short* pCH1Data: CH1 data storage buffer pointer
short* pCH2Data: CH2 data storage buffer pointer
unsigned long nReadLen: The length of reading data
short* pCalLevel: Proofreading level (reference function dsoGetCalLevel)
int nCH1VoltDIV: The voltage of CH1
int nCH2VoltDIV: The voltage of CH2
short nTrigSweep: SWP MODE-0: AUTO; 1: Normal; 2: Single
short nTrigSrc: Trigger source - 0: CH1; 1: CH2
short nTrigLevel: Trigger level - 0 ~ 255
short nSlope: Trigger Slope - 0: Rise; 1: Fall
int nTimeDIV: Sampling rate
short nHTrigPos: Horizontal trigger position -0 ~ 100
unsigned long nDisLen: The length of the display data
unsigned long * nTrigPoint: The index value of returned trigger point
short nInsertMode: D-value mode - 0: Step D-value; 1: Line D-value; 2: SinX/X D-value
endrem


Das Oszi wird mit Hilfe anderer Funktionen erkannt und auch ausgewählt, das funktioniert fehlerfrei.
Beim starten der Messung jedoch schmiert das Programm ab. Seltsamerweise enthalten die Buffer die ich übergebe jedoch jede Menge Daten, die Übertragung scheint also eine Weile zu funktionieren.

Der praktische Aufruf wurde so von mir realisiert:
BlitzMax: [AUSKLAPPEN]
Global CH1Data:Short[20480] 'die Buffer für die Daten
Global CH2Data:Short[20480]
Global nCal:Short[32]' Kalibrationsdaten, ermitteln mit anderer Func funzt problemfrei
Global trigger:Long[1]'hier soll wohl der gefundene Triggerprunkt gespeichert werden.
trigger[0] = 0

Print dsoReadHardData(0 , CH1Data , CH2Data , 1000 , nCal , 0, 0 , 0 , 0 , 0, 0 , 10 , 12 , 1024 ,trigger , 0)

Wie gesagt, beim absturz ist das zuvor leere Buffersegment mit Werten (zumindest teilweise) gefüllt, also scheint der Absturz erst später zu kommen. Hab ich Datentypen verwechselt? Sonst noch Ideen?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Holzchopf

Meisterpacker

BeitragSa, Sep 12, 2015 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Was mir spontan einfällt (kenne weder das DSO noch arbeitete ich regelmässig mit DLLs):

- Dürfen nCH1VoltDIV und nCH2VoltDIV 0 sein?
- Sind die Buffer gross genug?
- Ist nTimeDIV nun die SampleRate oder die Periode? Oder was ganz anderes?
- Da BlitzMax ja die Datentypen der Funktionsparameter kennt, nehme ich an, dass es automatisch konvertiert. Sonst müsstest du konstante Short-Werte à la 0:Short resp. Long 0:Long übergeben. Aber das sollte afaik automatisch geschehen.
- Ändert sich die Menge der abgespeicherten Daten, wenn du an nHTrigPos rumspielst?
- Darf nDisLen länger sein als nReadLen?

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

BladeRunner

Moderator

BeitragSa, Sep 12, 2015 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
- Dürfen nCH1VoltDIV und nCH2VoltDIV 0 sein?

Ja, denn laut dem 'manual' was der API beilag (ganze 4 Seiten Text, und das in groooooßen Buchstaben...) sind diese Divider keine Klarzahlen, sondern in festen Stufen. 0 entspricht dabei 5V.

Zitat:
- Sind die Buffer gross genug?

Sollten sie, ich lese ja nur 1024 Samples aus habe die Buffer aber auf das 20-fache gestellt. War auch meine erste Überlegung.

Zitat:
- Ist nTimeDIV nun die SampleRate oder die Periode? Oder was ganz anderes?

Das legt in der Tat - nach selbigem Schema wie VoltDIV- die Samplerate fest. Hier habe ich noch nicht gespielt, vielleicht muss ich eine geringere wählen.

Zitat:
- Da BlitzMax ja die Datentypen der Funktionsparameter kennt, nehme ich an, dass es automatisch konvertiert. Sonst müsstest du konstante Short-Werte à la 0:Short resp. Long 0:Long übergeben. Aber das sollte afaik automatisch geschehen.

Immerhin ein Punkt den ich checken könnte. Allerdings muss ich anmerken dass das Oszi noch einen Logic-Analyzer mit an Board hat und den kann ich mit ähnlichem Aufruf problemfrei erfragen. Allerdings ist der deutlich simpler gestrickt, da gibt es keine Trigger etc.

Zitat:
- Ändert sich die Menge der abgespeicherten Daten, wenn du an nHTrigPos rumspielst?

Werde ich zu hause mal testen, bin grade auf der Arbeit. Da ich aber nur das Testsignal anliegen hatte glaube ich nicht dass sich da viel tut, das ist eine feste Rechteckschwingung.

Zitat:
- Darf nDisLen länger sein als nReadLen?

Ganz ehrlich, keine Ahnung. Die .dll zum ansteuern des Displays hat kein Manual mit dabei, ich hab auch keine genaue Ahnung was der Parameter generell zu bedeuten hat. Die Doku ist echt dürftig. Mir geht es ja eh nur um das auslesen der Werte, optisch aufbereiten wollte ich sie in Max selbst.

Aber schon mal vielen Dank für deine Gedanken dazu.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Thunder

BeitragSo, Sep 13, 2015 8:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Probiere Mal:
BlitzMax: [AUSKLAPPEN]
Global dsoReadHardData:Short(DeviceIndex:Short , pCH1Data:Short Ptr , pCH2Data:Short Ptr , nReadLen:Int , ..
pCalLevel:Short Ptr , nCH1VoltDIV:Int , nCH2VoltDIV:Int , nTrigSweep:Short , nTrigSrc:Short , ..
nTrigLevel:Short , nSlope:Short , nTimeDIV:Int , nHTrigPos:Short , nDisLen:Int , ..
nTrigPoint:Int Ptr , nInsertMode:Short) "win32" = GetProcAddress(dso , "dsoReadHardData")


In C ist long (allermeistens) = 32 bit Integer
Also hätte ich Mal alles, was bei dir Long ist, durch Int ersetzt.

Du musst dann halt eventuell aufpassen, weil er an den Stellen unsigned long verwendet hat und Int in BlitzMax ja signed ist.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

BladeRunner

Moderator

BeitragMo, Sep 14, 2015 5:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
hatte auch darüber schon gegrübelt, und auch das werde ich hoffentlich heute abend testen können. Dienst nervt Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Jan_

Ehemaliger Admin

BeitragMo, Sep 14, 2015 10:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Probiere mal das:
Code: [AUSKLAPPEN]

Global dsoReadHardData:Short(DeviceIndex:Short , pCH1Data:Short Ptr , pCH2Data:Short Ptr , nReadLen:INT , ..
                     pCalLevel:Short Ptr , nCH1VoltDIV:Short , nCH2VoltDIV:Short , nTrigSweep:Short , nTrigSrc:Short , ..
                     nTrigLevel:Short , nSlope:Short , nTimeDIV:Short , nHTrigPos:Short , nDisLen:int , ..
                     nTrigPoint:Long Ptr , nInsertMode:Short) "win32" = GetProcAddress(dso , "dsoReadHardData")


Für denn Fall, das die auf C 6.0 & pre gehen und auch so kompilierten.
Link C-Datentypen:
https://de.wikibooks.org/wiki/...Datentypen
between angels and insects

BladeRunner

Moderator

BeitragMo, Sep 14, 2015 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Thunder, ein Umstellen komplett auf Int war erfolgreich. Ich hatte zwar schon damit gerechnet dass es eine fehlerhafte Datentypzuweisung war, aber damit sind nun alle Probleme (vorläufig zumindest ...) beseitigt.


Herzlichen Dank für eure Hilfe.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group